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/espresso/node/src/options.rs, bin/nasty-client.rs, bin/deploy.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/deploy/src/main.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        // Bind address for cliquenet protocol
143        (
144            "ESPRESSO_NODE_CLIQUENET_BIND_ADDRESS",
145            "ESPRESSO_SEQUENCER_CLIQUENET_BIND_ADDRESS",
146        ),
147        // Peer nodes used to fetch missing config
148        (
149            "ESPRESSO_NODE_CONFIG_PEERS",
150            "ESPRESSO_SEQUENCER_CONFIG_PEERS",
151        ),
152        // Path to the genesis TOML file
153        (
154            "ESPRESSO_NODE_GENESIS_FILE",
155            "ESPRESSO_SEQUENCER_GENESIS_FILE",
156        ),
157        // Node operator company name
158        (
159            "ESPRESSO_NODE_IDENTITY_COMPANY_NAME",
160            "ESPRESSO_SEQUENCER_IDENTITY_COMPANY_NAME",
161        ),
162        // Node operator company website
163        (
164            "ESPRESSO_NODE_IDENTITY_COMPANY_WEBSITE",
165            "ESPRESSO_SEQUENCER_IDENTITY_COMPANY_WEBSITE",
166        ),
167        // Node operator country code
168        (
169            "ESPRESSO_NODE_IDENTITY_COUNTRY_CODE",
170            "ESPRESSO_SEQUENCER_IDENTITY_COUNTRY_CODE",
171        ),
172        // Node icon 14x14 1x
173        (
174            "ESPRESSO_NODE_IDENTITY_ICON_14x14_1x",
175            "ESPRESSO_SEQUENCER_IDENTITY_ICON_14x14_1x",
176        ),
177        // Node icon 14x14 2x
178        (
179            "ESPRESSO_NODE_IDENTITY_ICON_14x14_2x",
180            "ESPRESSO_SEQUENCER_IDENTITY_ICON_14x14_2x",
181        ),
182        // Node icon 14x14 3x
183        (
184            "ESPRESSO_NODE_IDENTITY_ICON_14x14_3x",
185            "ESPRESSO_SEQUENCER_IDENTITY_ICON_14x14_3x",
186        ),
187        // Node icon 24x24 1x
188        (
189            "ESPRESSO_NODE_IDENTITY_ICON_24x24_1x",
190            "ESPRESSO_SEQUENCER_IDENTITY_ICON_24x24_1x",
191        ),
192        // Node icon 24x24 2x
193        (
194            "ESPRESSO_NODE_IDENTITY_ICON_24x24_2x",
195            "ESPRESSO_SEQUENCER_IDENTITY_ICON_24x24_2x",
196        ),
197        // Node icon 24x24 3x
198        (
199            "ESPRESSO_NODE_IDENTITY_ICON_24x24_3x",
200            "ESPRESSO_SEQUENCER_IDENTITY_ICON_24x24_3x",
201        ),
202        // Node operator latitude
203        (
204            "ESPRESSO_NODE_IDENTITY_LATITUDE",
205            "ESPRESSO_SEQUENCER_IDENTITY_LATITUDE",
206        ),
207        // Node operator longitude
208        (
209            "ESPRESSO_NODE_IDENTITY_LONGITUDE",
210            "ESPRESSO_SEQUENCER_IDENTITY_LONGITUDE",
211        ),
212        // Network type (e.g. local, testnet, mainnet)
213        (
214            "ESPRESSO_NODE_IDENTITY_NETWORK_TYPE",
215            "ESPRESSO_SEQUENCER_IDENTITY_NETWORK_TYPE",
216        ),
217        // Node description
218        (
219            "ESPRESSO_NODE_IDENTITY_NODE_DESCRIPTION",
220            "ESPRESSO_SEQUENCER_IDENTITY_NODE_DESCRIPTION",
221        ),
222        // Node display name
223        (
224            "ESPRESSO_NODE_IDENTITY_NODE_NAME",
225            "ESPRESSO_SEQUENCER_IDENTITY_NODE_NAME",
226        ),
227        // Node type
228        (
229            "ESPRESSO_NODE_IDENTITY_NODE_TYPE",
230            "ESPRESSO_SEQUENCER_IDENTITY_NODE_TYPE",
231        ),
232        // Node operating system
233        (
234            "ESPRESSO_NODE_IDENTITY_OPERATING_SYSTEM",
235            "ESPRESSO_SEQUENCER_IDENTITY_OPERATING_SYSTEM",
236        ),
237        // Whether this node participates in DA
238        ("ESPRESSO_NODE_IS_DA", "ESPRESSO_SEQUENCER_IS_DA"),
239        // Orchestrator URL for consensus coordination
240        (
241            "ESPRESSO_NODE_ORCHESTRATOR_URL",
242            "ESPRESSO_SEQUENCER_ORCHESTRATOR_URL",
243        ),
244        // Public API URL advertised to other nodes
245        (
246            "ESPRESSO_NODE_PUBLIC_API_URL",
247            "ESPRESSO_SEQUENCER_PUBLIC_API_URL",
248        ),
249        // Builder URLs for submitting transactions
250        ("ESPRESSO_BUILDER_URLS", "ESPRESSO_SEQUENCER_BUILDER_URLS"),
251        // Remote providers fallback timeout
252        (
253            "ESPRESSO_NODE_LOCAL_CATCHUP_TIMEOUT",
254            "ESPRESSO_SEQUENCER_LOCAL_CATCHUP_TIMEOUT",
255        ),
256        // ── crates/espresso/node/src/persistence/fs.rs ──
257        // Number of consensus views to retain
258        (
259            "ESPRESSO_NODE_CONSENSUS_VIEW_RETENTION",
260            "ESPRESSO_SEQUENCER_CONSENSUS_VIEW_RETENTION",
261        ),
262        // ── crates/espresso/node/src/persistence/sql.rs ──
263        // Minimum delay between active fetches in a stream
264        (
265            "ESPRESSO_NODE_ACTIVE_FETCH_DELAY",
266            "ESPRESSO_SEQUENCER_ACTIVE_FETCH_DELAY",
267        ),
268        // Duration to cache sync status results for.
269        (
270            "ESPRESSO_NODE_SYNC_STATUS_TTL",
271            "ESPRESSO_SEQUENCER_SYNC_STATUS_TTL",
272        ),
273        // Disable pruning and reconstruct previously pruned data
274        ("ESPRESSO_NODE_ARCHIVE", "ESPRESSO_SEQUENCER_ARCHIVE"),
275        // Minimum delay between loading chunks in a stream
276        (
277            "ESPRESSO_NODE_CHUNK_FETCH_DELAY",
278            "ESPRESSO_SEQUENCER_CHUNK_FETCH_DELAY",
279        ),
280        // Minimum retention for consensus storage
281        (
282            "ESPRESSO_NODE_CONSENSUS_STORAGE_MINIMUM_RETENTION",
283            "ESPRESSO_SEQUENCER_CONSENSUS_STORAGE_MINIMUM_RETENTION",
284        ),
285        // Target retention for consensus storage
286        (
287            "ESPRESSO_NODE_CONSENSUS_STORAGE_TARGET_RETENTION",
288            "ESPRESSO_SEQUENCER_CONSENSUS_STORAGE_TARGET_RETENTION",
289        ),
290        // Target disk usage for consensus storage
291        (
292            "ESPRESSO_NODE_CONSENSUS_STORAGE_TARGET_USAGE",
293            "ESPRESSO_SEQUENCER_CONSENSUS_STORAGE_TARGET_USAGE",
294        ),
295        // Maximum lifetime of a database connection
296        (
297            "ESPRESSO_NODE_DATABASE_CONNECTION_TIMEOUT",
298            "ESPRESSO_SEQUENCER_DATABASE_CONNECTION_TIMEOUT",
299        ),
300        // Maximum idle time of a database connection
301        (
302            "ESPRESSO_NODE_DATABASE_IDLE_CONNECTION_TIMEOUT",
303            "ESPRESSO_SEQUENCER_DATABASE_IDLE_CONNECTION_TIMEOUT",
304        ),
305        // Minimum database connections
306        (
307            "ESPRESSO_NODE_DATABASE_MIN_CONNECTIONS",
308            "ESPRESSO_SEQUENCER_DATABASE_MIN_CONNECTIONS",
309        ),
310        // Enable pruning with default parameters
311        (
312            "ESPRESSO_NODE_DATABASE_PRUNE",
313            "ESPRESSO_SEQUENCER_DATABASE_PRUNE",
314        ),
315        // Max connections for query operations
316        (
317            "ESPRESSO_NODE_DATABASE_QUERY_MAX_CONNECTIONS",
318            "ESPRESSO_SEQUENCER_DATABASE_QUERY_MAX_CONNECTIONS",
319        ),
320        // Min connections for query operations
321        (
322            "ESPRESSO_NODE_DATABASE_QUERY_MIN_CONNECTIONS",
323            "ESPRESSO_SEQUENCER_DATABASE_QUERY_MIN_CONNECTIONS",
324        ),
325        // Threshold for logging slow SQL statements
326        (
327            "ESPRESSO_NODE_DATABASE_SLOW_STATEMENT_THRESHOLD",
328            "ESPRESSO_SEQUENCER_DATABASE_SLOW_STATEMENT_THRESHOLD",
329        ),
330        // Max time for a single SQL statement before cancellation
331        (
332            "ESPRESSO_NODE_DATABASE_STATEMENT_TIMEOUT",
333            "ESPRESSO_SEQUENCER_DATABASE_STATEMENT_TIMEOUT",
334        ),
335        // Disable the proactive scanner task
336        (
337            "ESPRESSO_NODE_DISABLE_PROACTIVE_FETCHING",
338            "ESPRESSO_SEQUENCER_DISABLE_PROACTIVE_FETCHING",
339        ),
340        // Max concurrent fetch requests from peers
341        (
342            "ESPRESSO_NODE_FETCH_RATE_LIMIT",
343            "ESPRESSO_SEQUENCER_FETCH_RATE_LIMIT",
344        ),
345        // Run in lightweight mode (no DA participation)
346        (
347            "ESPRESSO_NODE_LIGHTWEIGHT",
348            "ESPRESSO_SEQUENCER_LIGHTWEIGHT",
349        ),
350        // Postgres database name
351        (
352            "ESPRESSO_NODE_POSTGRES_DATABASE",
353            "ESPRESSO_SEQUENCER_POSTGRES_DATABASE",
354        ),
355        // Postgres server hostname
356        (
357            "ESPRESSO_NODE_POSTGRES_HOST",
358            "ESPRESSO_SEQUENCER_POSTGRES_HOST",
359        ),
360        // Postgres password
361        (
362            "ESPRESSO_NODE_POSTGRES_PASSWORD",
363            "ESPRESSO_SEQUENCER_POSTGRES_PASSWORD",
364        ),
365        // Postgres server port
366        (
367            "ESPRESSO_NODE_POSTGRES_PORT",
368            "ESPRESSO_SEQUENCER_POSTGRES_PORT",
369        ),
370        // Use TLS for Postgres connection
371        (
372            "ESPRESSO_NODE_POSTGRES_USE_TLS",
373            "ESPRESSO_SEQUENCER_POSTGRES_USE_TLS",
374        ),
375        // Postgres user
376        (
377            "ESPRESSO_NODE_POSTGRES_USER",
378            "ESPRESSO_SEQUENCER_POSTGRES_USER",
379        ),
380        // Chunk size for proactive fetch scanning
381        (
382            "ESPRESSO_NODE_PROACTIVE_SCAN_CHUNK_SIZE",
383            "ESPRESSO_SEQUENCER_PROACTIVE_SCAN_CHUNK_SIZE",
384        ),
385        // Interval between proactive fetch scans
386        (
387            "ESPRESSO_NODE_PROACTIVE_SCAN_INTERVAL",
388            "ESPRESSO_SEQUENCER_PROACTIVE_SCAN_INTERVAL",
389        ),
390        // Batch size for pruning operations
391        (
392            "ESPRESSO_NODE_PRUNER_BATCH_SIZE",
393            "ESPRESSO_SEQUENCER_PRUNER_BATCH_SIZE",
394        ),
395        // SQLite pages to vacuum per cycle
396        (
397            "ESPRESSO_NODE_PRUNER_INCREMENTAL_VACUUM_PAGES",
398            "ESPRESSO_SEQUENCER_PRUNER_INCREMENTAL_VACUUM_PAGES",
399        ),
400        // Interval between pruning runs
401        (
402            "ESPRESSO_NODE_PRUNER_INTERVAL",
403            "ESPRESSO_SEQUENCER_PRUNER_INTERVAL",
404        ),
405        // Max disk usage in basis points
406        (
407            "ESPRESSO_NODE_PRUNER_MAX_USAGE",
408            "ESPRESSO_SEQUENCER_PRUNER_MAX_USAGE",
409        ),
410        // Minimum data retention period
411        (
412            "ESPRESSO_NODE_PRUNER_MINIMUM_RETENTION",
413            "ESPRESSO_SEQUENCER_PRUNER_MINIMUM_RETENTION",
414        ),
415        // Pruning threshold in bytes
416        (
417            "ESPRESSO_NODE_PRUNER_PRUNING_THRESHOLD",
418            "ESPRESSO_SEQUENCER_PRUNER_PRUNING_THRESHOLD",
419        ),
420        // Target data retention period
421        (
422            "ESPRESSO_NODE_PRUNER_TARGET_RETENTION",
423            "ESPRESSO_SEQUENCER_PRUNER_TARGET_RETENTION",
424        ),
425        // Path for node storage (filesystem backend)
426        (
427            "ESPRESSO_NODE_STORAGE_PATH",
428            "ESPRESSO_SEQUENCER_STORAGE_PATH",
429        ),
430        // Chunk size for sync status scanning
431        (
432            "ESPRESSO_NODE_SYNC_STATUS_CHUNK_SIZE",
433            "ESPRESSO_SEQUENCER_SYNC_STATUS_CHUNK_SIZE",
434        ),
435        // ── crates/espresso/node/src/proposal_fetcher.rs ──
436        // Timeout for proposal fetch requests
437        (
438            "ESPRESSO_NODE_PROPOSAL_FETCHER_FETCH_TIMEOUT",
439            "ESPRESSO_SEQUENCER_PROPOSAL_FETCHER_FETCH_TIMEOUT",
440        ),
441        // Number of proposal fetcher workers
442        (
443            "ESPRESSO_NODE_PROPOSAL_FETCHER_NUM_WORKERS",
444            "ESPRESSO_SEQUENCER_PROPOSAL_FETCHER_NUM_WORKERS",
445        ),
446        // ── crates/espresso/types/src/v0/v0_4/state.rs ──
447        // Reward merkle tree concurrent update permits
448        (
449            "ESPRESSO_NODE_REWARD_MERKLE_TREE_PERMITS",
450            "ESPRESSO_SEQUENCER_REWARD_MERKLE_TREE_PERMITS",
451        ),
452        // ── crates/espresso/types/src/v0/utils.rs ──
453        // Disable catchup retries after first failure
454        (
455            "ESPRESSO_NODE_CATCHUP_BACKOFF_DISABLE",
456            "ESPRESSO_SEQUENCER_CATCHUP_BACKOFF_DISABLE",
457        ),
458        // Exponential backoff factor for catchup retries
459        (
460            "ESPRESSO_NODE_CATCHUP_BACKOFF_FACTOR",
461            "ESPRESSO_SEQUENCER_CATCHUP_BACKOFF_FACTOR",
462        ),
463        // Jitter for catchup retry backoff
464        (
465            "ESPRESSO_NODE_CATCHUP_BACKOFF_JITTER",
466            "ESPRESSO_SEQUENCER_CATCHUP_BACKOFF_JITTER",
467        ),
468        // Base delay between catchup retries
469        (
470            "ESPRESSO_NODE_CATCHUP_BASE_RETRY_DELAY",
471            "ESPRESSO_SEQUENCER_CATCHUP_BASE_RETRY_DELAY",
472        ),
473        // Maximum delay between catchup retries
474        (
475            "ESPRESSO_NODE_CATCHUP_MAX_RETRY_DELAY",
476            "ESPRESSO_SEQUENCER_CATCHUP_MAX_RETRY_DELAY",
477        ),
478        // ── crates/espresso/types/src/v0/v0_1/l1.rs ──
479        // Interval for polling L1 stake table updates
480        (
481            "ESPRESSO_NODE_L1_STAKE_TABLE_UPDATE_INTERVAL",
482            "ESPRESSO_SEQUENCER_L1_STAKE_TABLE_UPDATE_INTERVAL",
483        ),
484        // Number of L1 blocks to cache
485        (
486            "ESPRESSO_L1_BLOCKS_CACHE_SIZE",
487            "ESPRESSO_SEQUENCER_L1_BLOCKS_CACHE_SIZE",
488        ),
489        // Consecutive L1 failures before failover
490        (
491            "ESPRESSO_L1_CONSECUTIVE_FAILURE_TOLERANCE",
492            "ESPRESSO_SEQUENCER_L1_CONSECUTIVE_FAILURE_TOLERANCE",
493        ),
494        // Channel capacity for L1 event processing
495        (
496            "ESPRESSO_L1_EVENTS_CHANNEL_CAPACITY",
497            "ESPRESSO_SEQUENCER_L1_EVENTS_CHANNEL_CAPACITY",
498        ),
499        // Max block range per L1 event query
500        (
501            "ESPRESSO_L1_EVENTS_MAX_BLOCK_RANGE",
502            "ESPRESSO_SEQUENCER_L1_EVENTS_MAX_BLOCK_RANGE",
503        ),
504        // Max retry duration for L1 event fetching
505        (
506            "ESPRESSO_L1_EVENTS_MAX_RETRY_DURATION",
507            "ESPRESSO_SEQUENCER_L1_EVENTS_MAX_RETRY_DURATION",
508        ),
509        // Revert to primary L1 provider after failover
510        (
511            "ESPRESSO_L1_FAILOVER_REVERT",
512            "ESPRESSO_SEQUENCER_L1_FAILOVER_REVERT",
513        ),
514        // Safety margin for L1 finalized block lookback
515        (
516            "ESPRESSO_L1_FINALIZED_SAFETY_MARGIN",
517            "ESPRESSO_SEQUENCER_L1_FINALIZED_SAFETY_MARGIN",
518        ),
519        // Frequent L1 failures before failover
520        (
521            "ESPRESSO_L1_FREQUENT_FAILURE_TOLERANCE",
522            "ESPRESSO_SEQUENCER_L1_FREQUENT_FAILURE_TOLERANCE",
523        ),
524        // L1 polling interval
525        (
526            "ESPRESSO_L1_POLLING_INTERVAL",
527            "ESPRESSO_SEQUENCER_L1_POLLING_INTERVAL",
528        ),
529        // Delay between L1 RPC requests for rate limiting
530        (
531            "ESPRESSO_L1_RATE_LIMIT_DELAY",
532            "ESPRESSO_SEQUENCER_L1_RATE_LIMIT_DELAY",
533        ),
534        // Delay before retrying a failed L1 request
535        (
536            "ESPRESSO_L1_RETRY_DELAY",
537            "ESPRESSO_SEQUENCER_L1_RETRY_DELAY",
538        ),
539        // Timeout for L1 WebSocket subscriptions
540        (
541            "ESPRESSO_L1_SUBSCRIPTION_TIMEOUT",
542            "ESPRESSO_SEQUENCER_L1_SUBSCRIPTION_TIMEOUT",
543        ),
544        // L1 WebSocket provider URL for subscriptions
545        (
546            "ESPRESSO_L1_WS_PROVIDER",
547            "ESPRESSO_SEQUENCER_L1_WS_PROVIDER",
548        ),
549        // ── crates/hotshot-state-prover/src/bin/state-prover.rs ──
550        // Light client proxy contract address
551        (
552            "ESPRESSO_LIGHT_CLIENT_PROXY_ADDRESS",
553            "ESPRESSO_SEQUENCER_LIGHT_CLIENT_PROXY_ADDRESS",
554        ),
555        // Account index for the state prover wallet
556        (
557            "ESPRESSO_STATE_PROVER_ACCOUNT_INDEX",
558            "ESPRESSO_SEQUENCER_STATE_PROVER_ACCOUNT_INDEX",
559        ),
560        // ── crates/staking-cli/src/lib.rs ──
561        // Stake table proxy contract address
562        (
563            "ESPRESSO_STAKE_TABLE_PROXY_ADDRESS",
564            "ESPRESSO_SEQUENCER_STAKE_TABLE_PROXY_ADDRESS",
565        ),
566        // ── unknown ──
567        // Light client contract address
568        (
569            "ESPRESSO_LIGHT_CLIENT_ADDRESS",
570            "ESPRESSO_SEQUENCER_LIGHT_CLIENT_ADDRESS",
571        ),
572        // Light client V2 contract address
573        (
574            "ESPRESSO_LIGHT_CLIENT_V2_ADDRESS",
575            "ESPRESSO_SEQUENCER_LIGHT_CLIENT_V2_ADDRESS",
576        ),
577        // Light client V3 contract address
578        (
579            "ESPRESSO_LIGHT_CLIENT_V3_ADDRESS",
580            "ESPRESSO_SEQUENCER_LIGHT_CLIENT_V3_ADDRESS",
581        ),
582        // Stake table contract address
583        (
584            "ESPRESSO_STAKE_TABLE_ADDRESS",
585            "ESPRESSO_SEQUENCER_STAKE_TABLE_ADDRESS",
586        ),
587        // Stake table V2 contract address
588        (
589            "ESPRESSO_STAKE_TABLE_V2_ADDRESS",
590            "ESPRESSO_SEQUENCER_STAKE_TABLE_V2_ADDRESS",
591        ),
592        // ESP token contract address
593        ("ESP_TOKEN_ADDRESS", "ESPRESSO_SEQUENCER_ESP_TOKEN_ADDRESS"),
594        // ESP token V2 contract address
595        (
596            "ESP_TOKEN_V2_ADDRESS",
597            "ESPRESSO_SEQUENCER_ESP_TOKEN_V2_ADDRESS",
598        ),
599        // Fee contract address
600        (
601            "ESPRESSO_FEE_CONTRACT_ADDRESS",
602            "ESPRESSO_SEQUENCER_FEE_CONTRACT_ADDRESS",
603        ),
604        // Reward claim contract address
605        (
606            "ESPRESSO_REWARD_CLAIM_ADDRESS",
607            "ESPRESSO_SEQUENCER_REWARD_CLAIM_ADDRESS",
608        ),
609        // PlonkVerifier contract address
610        (
611            "ESPRESSO_PLONK_VERIFIER_ADDRESS",
612            "ESPRESSO_SEQUENCER_PLONK_VERIFIER_ADDRESS",
613        ),
614        // PlonkVerifier V2 contract address
615        (
616            "ESPRESSO_PLONK_VERIFIER_V2_ADDRESS",
617            "ESPRESSO_SEQUENCER_PLONK_VERIFIER_V2_ADDRESS",
618        ),
619        // PlonkVerifier V3 contract address
620        (
621            "ESPRESSO_PLONK_VERIFIER_V3_ADDRESS",
622            "ESPRESSO_SEQUENCER_PLONK_VERIFIER_V3_ADDRESS",
623        ),
624    ];
625
626    let mut migrated = Vec::new();
627    for &(new, old) in MAPPINGS {
628        if std::env::var(new).is_err()
629            && let Ok(val) = std::env::var(old)
630        {
631            eprintln!("WARNING: {old} is deprecated, use {new} instead");
632            // SAFETY: called from sync fn main() before tokio runtime starts,
633            // guaranteeing single-threaded execution.
634            unsafe { std::env::set_var(new, val) };
635            migrated.push((old, new));
636        }
637    }
638    migrated
639}
640
641/// Log migrated env vars via tracing. Call after tracing is initialized.
642pub fn log_migrated_env_vars(migrated: &[(&str, &str)]) {
643    if migrated.is_empty() {
644        return;
645    }
646
647    for &(old, new) in migrated {
648        tracing::warn!(old, new, "migrated deprecated env var");
649    }
650}