diff --git a/crates/origin-chain-runtime/src/genesis_config_presets.rs b/crates/origin-chain-runtime/src/genesis_config_presets.rs index 3a5cf4a..85b1156 100644 --- a/crates/origin-chain-runtime/src/genesis_config_presets.rs +++ b/crates/origin-chain-runtime/src/genesis_config_presets.rs @@ -547,4 +547,28 @@ mod tests { assert_eq!(vault_allocation + SUDO_OPERATIONAL_FLOAT, FOUNDATION_ALLOCATION); assert!(vault_allocation > SUDO_OPERATIONAL_FLOAT, "el grueso va al vault"); } + + #[test] + fn mainnet_pool_ecosystem_400m_es_la_cuenta_de_la_que_libera_la_emision() { + // TECHO DURO — invariante de cableado CRÍTICO (audit ultra 2026-07-04): la + // cuenta que el génesis fondea con los 400M DEBE ser EXACTAMENTE la que + // `pallet-origin-emission` transfiere (og/ecosy). Si divergieran, el pool + // de la emisión estaría vacío y los validadores NUNCA cobrarían (o, peor, + // la emisión no tendría fuente y el techo duro sería vacuo). Este test + // ata las dos puntas: génesis ←→ runtime emission Config. + let emission_source: ChainAccountId = + EmissionEcosystemPalletId::get().into_account_truncating(); + let cfg = mainnet_genesis_config_genesis(); + let funded = cfg + .balances + .balances + .iter() + .find(|(acc, _)| *acc == emission_source) + .map(|(_, bal)| *bal) + .expect("la cuenta de la que libera la emisión DEBE estar fondeada en génesis"); + assert_eq!( + funded, ECOSYSTEM_ALLOCATION, + "el pool og/ecosy debe tener exactamente los 400M que la emisión libera" + ); + } }