diff --git a/Cargo.lock b/Cargo.lock index 7a26cd3..2aad4dd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6485,6 +6485,7 @@ dependencies = [ "pallet-grandpa", "pallet-revive", "pallet-session", + "pallet-sudo", "pallet-timestamp", "pallet-transaction-payment", "pallet-transaction-payment-rpc-runtime-api", @@ -6723,6 +6724,22 @@ dependencies = [ "sp-trie", ] +[[package]] +name = "pallet-sudo" +version = "43.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a5bd043ab6161ce4a06daab4fb646d6ea09058bb5021607386b5486dd0c6d79" +dependencies = [ + "docify", + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-io 43.0.0", + "sp-runtime 44.0.0", +] + [[package]] name = "pallet-timestamp" version = "42.0.0" @@ -7591,7 +7608,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf" dependencies = [ "heck 0.5.0", - "itertools 0.13.0", + "itertools 0.14.0", "log", "multimap", "once_cell", @@ -7624,7 +7641,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" dependencies = [ "anyhow", - "itertools 0.13.0", + "itertools 0.14.0", "proc-macro2", "quote", "syn 2.0.117", @@ -7637,7 +7654,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b" dependencies = [ "anyhow", - "itertools 0.13.0", + "itertools 0.14.0", "proc-macro2", "quote", "syn 2.0.117", diff --git a/Cargo.toml b/Cargo.toml index 2e3ed58..6f00927 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -94,6 +94,12 @@ pallet-grandpa = { version = "43.0.0", default-features = false } # FRAME pallets canonical Phase 1.5 — Session rotation per CHN-1 4h epochs (stable2509-3) pallet-session = { version = "43.0.0", default-features = false } +# FIX-5 governability (audit V2-CA1) — pallet-sudo da Root origin para invocar +# las dispatchables admin (council/advisor/treasury_disbursement, hoy muertas). +# Sunset canonical: sudo → governance real (pallet-collective/referenda) ANTES +# de mainnet. Sudo key interim = Foundation multisig humano (stable2509-3). +pallet-sudo = { version = "43.0.0", default-features = false } + # ============================================================ # Phase 3 — pallet-revive smart contracts per SBS-5 ratified # (supersedes CHN-6 v1.0 → CHN-6 v2.0 PolkaVM + ink! v6 + Solidity) diff --git a/crates/origin-chain-agent-identity/src/lib.rs b/crates/origin-chain-agent-identity/src/lib.rs index cc9b158..3c626f0 100644 --- a/crates/origin-chain-agent-identity/src/lib.rs +++ b/crates/origin-chain-agent-identity/src/lib.rs @@ -128,7 +128,12 @@ pub mod pallet { /// /// v0.0.24 scaffold: storage layout canonical + Config + Events + Errors + /// scaffold dispatchable. Real impl `register_agent_did` v0.0.26 next slice. + /// StorageVersion en código (FIX-2 lifecycle, audit V1-H2/V2-CA2): arranca + /// en 0 (genesis). Habilita migraciones futuras vía on_chain_storage_version(). + const STORAGE_VERSION: StorageVersion = StorageVersion::new(0); + #[pallet::pallet] + #[pallet::storage_version(STORAGE_VERSION)] pub struct Pallet(_); /// CHN-7 canonical: `Identities>` canonical. diff --git a/crates/origin-chain-fees/src/lib.rs b/crates/origin-chain-fees/src/lib.rs index 7cb3b89..957a2a8 100644 --- a/crates/origin-chain-fees/src/lib.rs +++ b/crates/origin-chain-fees/src/lib.rs @@ -118,7 +118,12 @@ pub mod pallet { /// v0.0.20 scaffold: storage layout canonical + Config + Events + Errors + /// scaffold dispatchable. Real impl wire-up Mathi `OitFeeSchedule` trait /// vía Config canonical viene en v0.0.22. + /// StorageVersion en código (FIX-2 lifecycle, audit V1-H2/V2-CA2): arranca + /// en 0 (genesis). Habilita migraciones futuras vía on_chain_storage_version(). + const STORAGE_VERSION: StorageVersion = StorageVersion::new(0); + #[pallet::pallet] + #[pallet::storage_version(STORAGE_VERSION)] pub struct Pallet(_); /// PHASE 2.4 canonical: per-account fee history canonical. diff --git a/crates/origin-chain-governance/src/lib.rs b/crates/origin-chain-governance/src/lib.rs index e6e6881..091e516 100644 --- a/crates/origin-chain-governance/src/lib.rs +++ b/crates/origin-chain-governance/src/lib.rs @@ -222,7 +222,13 @@ pub mod pallet { } /// Pallet definition canonical. + /// + /// StorageVersion en código (FIX-2 lifecycle, audit V1-H2/V2-CA2): arranca + /// en 0 (genesis). Habilita migraciones futuras vía on_chain_storage_version(). + const STORAGE_VERSION: StorageVersion = StorageVersion::new(0); + #[pallet::pallet] + #[pallet::storage_version(STORAGE_VERSION)] pub struct Pallet(_); /// CHN-4 canonical: `Proposals>` canonical. diff --git a/crates/origin-chain-provenance/src/lib.rs b/crates/origin-chain-provenance/src/lib.rs index 054133a..f36cf13 100644 --- a/crates/origin-chain-provenance/src/lib.rs +++ b/crates/origin-chain-provenance/src/lib.rs @@ -123,7 +123,12 @@ pub mod pallet { /// v0.0.15: `AssetAttestation.agent_chain` ahora es `BoundedVec>` canonical → MaxEncodedLen ahora satisfied canonical → /// `#[pallet::without_storage_info]` ya NO necesario canonical. + /// StorageVersion en código (FIX-2 lifecycle, audit V1-H2/V2-CA2): arranca + /// en 0 (genesis). Habilita migraciones futuras vía on_chain_storage_version(). + const STORAGE_VERSION: StorageVersion = StorageVersion::new(0); + #[pallet::pallet] + #[pallet::storage_version(STORAGE_VERSION)] pub struct Pallet(_); /// PROV-2 canonical: `StorageMap` canonical. diff --git a/crates/origin-chain-runtime/Cargo.toml b/crates/origin-chain-runtime/Cargo.toml index b92ae38..619457b 100644 --- a/crates/origin-chain-runtime/Cargo.toml +++ b/crates/origin-chain-runtime/Cargo.toml @@ -40,6 +40,10 @@ pallet-aura.workspace = true pallet-grandpa.workspace = true pallet-session.workspace = true +# FIX-5 governability v0.0.5x: pallet-sudo wired runtime composition Index 12 +# (Root origin para dispatchables admin — sunset → governance real pre-mainnet) +pallet-sudo.workspace = true + # Charon custom pallets Phase 2.x (per DCs) # Phase 2.1 v0.0.15: pallet-origin-provenance scaffold canonical wired origin-chain-provenance.workspace = true @@ -122,6 +126,7 @@ std = [ "pallet-aura/std", "pallet-grandpa/std", "pallet-session/std", + "pallet-sudo/std", "origin-chain-provenance/std", "origin-chain-fees/std", "origin-chain-agent-identity/std", diff --git a/crates/origin-chain-runtime/src/configs.rs b/crates/origin-chain-runtime/src/configs.rs index 77ed397..fea0bda 100644 --- a/crates/origin-chain-runtime/src/configs.rs +++ b/crates/origin-chain-runtime/src/configs.rs @@ -515,3 +515,21 @@ impl pallet_revive::Config for Runtime { type FindAuthor = (); // returns None Slice 3.1 (sin pallet_authorship) type UnsafeUnstableInterface = ConstBool; // testnet-only feature gate } + +// ============================================================ +// pallet_sudo::Config — FIX-5 governability (Root origin, audit V2-CA1) +// ============================================================ +// +// La cadena no se gobernaba: las dispatchables admin de Governance (add/remove +// council, mark/unmark advisor, treasury_disbursement — todas `ensure_root`) +// eran no-invocables sin un Root origin, y la tesorería 250M quedaba congelada. +// pallet-sudo provee Root origin canonical vía una sudo key única. +// +// SUNSET canonical: la sudo key es interim (Foundation multisig humano, seteada +// en genesis). ANTES de mainnet se migra a governance real (pallet-collective + +// pallet-referenda) y se remueve sudo — la cadena se auto-gobierna sin Root. +impl pallet_sudo::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; + type WeightInfo = pallet_sudo::weights::SubstrateWeight; +} diff --git a/crates/origin-chain-runtime/src/genesis_config_presets.rs b/crates/origin-chain-runtime/src/genesis_config_presets.rs index 49dc49e..11448b9 100644 --- a/crates/origin-chain-runtime/src/genesis_config_presets.rs +++ b/crates/origin-chain-runtime/src/genesis_config_presets.rs @@ -199,10 +199,11 @@ fn session_keys_canonical(aura: AuraId, grandpa: GrandpaId) -> SessionKeys { fn build_genesis( endowed_accounts: Vec<(ChainAccountId, Balance)>, validators: Vec<(ChainAccountId, AuraId, GrandpaId)>, + sudo_key: ChainAccountId, ) -> RuntimeGenesisConfig { use crate::{ - AuraConfig, BalancesConfig, GrandpaConfig, ReviveConfig, SessionConfig, SystemConfig, - TransactionPaymentConfig, + AuraConfig, BalancesConfig, GrandpaConfig, ReviveConfig, SessionConfig, SudoConfig, + SystemConfig, TransactionPaymentConfig, }; RuntimeGenesisConfig { system: SystemConfig::default(), @@ -239,6 +240,11 @@ fn build_genesis( // contracts). Phase 3.x maduración añade dev mapped_accounts canonical // para Alice/Bob testing + genesis contract templates (Slices 3.2-3.6). revive: ReviveConfig::default(), + // FIX-5 governability: sudo key inicial = Root origin para las + // dispatchables admin de Governance (sunset → governance real pre-mainnet). + sudo: SudoConfig { + key: Some(sudo_key), + }, } } @@ -249,8 +255,9 @@ pub fn development_config_genesis() -> RuntimeGenesisConfig { let alice_account = alice_authority.0.clone(); build_genesis( - vec![(alice_account, 100_000_000_u128 * Ogc::ONE)], + vec![(alice_account.clone(), 100_000_000_u128 * Ogc::ONE)], vec![alice_authority], + alice_account, // FIX-5: Alice = sudo key (Root) en dev ) } @@ -271,13 +278,14 @@ pub fn local_testnet_config_genesis() -> RuntimeGenesisConfig { build_genesis( vec![ - (alice, endowment), + (alice.clone(), endowment), (bob, endowment), (charlie, endowment), (dave, endowment), (eve, endowment), ], vec![alice_authority, bob_authority], + alice, // FIX-5: Alice = sudo key (Root) en local_testnet ) } @@ -317,12 +325,16 @@ pub fn mainnet_genesis_config_genesis() -> RuntimeGenesisConfig { // BM V2 allocation canonical exact: 40/25/15/15/5 → 1B OGC total vec![ (ecosystem_pool, ECOSYSTEM_ALLOCATION), - (foundation_treasury, FOUNDATION_ALLOCATION), + (foundation_treasury.clone(), FOUNDATION_ALLOCATION), (public_sale, PUBLIC_SALE_ALLOCATION), (founding_team, FOUNDING_TEAM_ALLOCATION), (exchange_liquidity, EXCHANGE_LIQUIDITY_ALLOCATION), ], validators, + // FIX-5: Foundation Treasury = sudo key interim (Root) en mainnet + // (multisig humano). PRE-LAUNCH Q1 2027: David ratifica la key real + + // sunset a governance (pallet-collective/referenda). + foundation_treasury, ) } diff --git a/crates/origin-chain-runtime/src/lib.rs b/crates/origin-chain-runtime/src/lib.rs index 75ae9d4..3307084 100644 --- a/crates/origin-chain-runtime/src/lib.rs +++ b/crates/origin-chain-runtime/src/lib.rs @@ -367,6 +367,15 @@ mod runtime { #[runtime::pallet_index(11)] pub type Revive = pallet_revive::Pallet; + /// Sudo pallet (FIX-5 governability per audit V2-CA1). Provee Root origin + /// para invocar las dispatchables admin de Governance (add/remove council, + /// mark/unmark advisor, treasury_disbursement — todas `ensure_root`, hoy + /// no-invocables) + descongela la tesorería 250M. Sunset canonical: sudo → + /// governance real (pallet-collective/referenda) ANTES de mainnet. Sudo key + /// interim = Foundation multisig humano (genesis). + #[runtime::pallet_index(12)] + pub type Sudo = pallet_sudo::Pallet; + // Substrate pallet-identity DEFERRED canonical (decision empírica // 2026-05-21 documentada en configs.rs). pallet-identity 41.0.0 ReservableCurrency // compat work canonical hereda al custom `pallet_agent_identity` Phase 2.7 @@ -933,6 +942,15 @@ mod tests { assert_eq!(::name(), "Revive"); } + #[test] + fn sudo_pallet_index_12_canonical_governability() { + // FIX-5: Sudo=12 (post Revive=11). Root origin para las dispatchables + // admin de Governance (audit V2-CA1). Sunset → governance real pre-mainnet. + use frame_support::traits::PalletInfoAccess; + assert_eq!(::index(), 12); + assert_eq!(::name(), "Sudo"); + } + #[test] fn revive_address_mapper_account32_returns_h160_canonical() { // AccountId32Mapper canonical: AccountId32 → H160 mapping deterministic.