//! # Mock runtime para integration tests //! //! Mock minimal (`System` + `Provenance`) para E2E del flow PROV-3 + FIX-4: //! decode postcard → gates → Ed25519 verify domain-separado → anclar. //! //! FIX-4: `new_test_ext_with_genesis` siembra `block_hash(0)` = el genesis con //! el que se firmaron los golden vectors (generados desde el oráculo REAL de //! Ergon `arkhe-noesis-core`), para probar la verificación cross-runtime. #![cfg(test)] use crate as origin_chain_provenance; use frame_support::derive_impl; use sp_core::H256; use sp_runtime::BuildStorage; /// Mock block type para tests. type Block = frame_system::mocking::MockBlock; frame_support::construct_runtime!( pub enum Test { System: frame_system, Provenance: origin_chain_provenance, } ); #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type Block = Block; type AccountId = sp_runtime::AccountId32; type Lookup = sp_runtime::traits::IdentityLookup; } impl origin_chain_provenance::Config for Test { type RuntimeEvent = RuntimeEvent; type WeightInfo = (); } /// Genesis hash de los golden vectors ASP-3 (`/tmp/golden-asp3`, GENESIS=0xAB×32). /// El pallet lee `block_hash(0)`; el mock lo siembra con ESTE valor para que la /// verificación Ed25519 coincida con las firmas del oráculo. pub const GOLDEN_GENESIS: [u8; 32] = [0xABu8; 32]; /// Pubkey del validador golden (seed [7u8;32] → todos los vectores la usan). pub const GOLDEN_VALIDATOR_PUBKEY: [u8; 32] = [ 0xea, 0x4a, 0x6c, 0x63, 0xe2, 0x9c, 0x52, 0x0a, 0xbe, 0xf5, 0x50, 0x7b, 0x13, 0x2e, 0xc5, 0xf9, 0x95, 0x47, 0x76, 0xae, 0xbe, 0xbe, 0x7b, 0x92, 0x42, 0x1e, 0xea, 0x69, 0x14, 0x46, 0xd2, 0x2c, ]; /// Registra el validador golden con el nivel dado (vía Root) — helper de tests. pub fn register_golden_validator(level: u8) { crate::pallet::Pallet::::register_validator( RuntimeOrigin::root(), GOLDEN_VALIDATOR_PUBKEY, level, ) .expect("Root registra el validador"); } /// Test externalities con `block_hash(0)` sembrado al genesis dado. pub fn new_test_ext_with_genesis(genesis: [u8; 32]) -> sp_io::TestExternalities { let mut ext: sp_io::TestExternalities = frame_system::GenesisConfig::::default() .build_storage() .expect("genesis builds") .into(); ext.execute_with(|| { System::set_block_number(1); // Siembra el hash del bloque génesis (que el pallet lee para el dominio). frame_system::BlockHash::::insert(0u64, H256(genesis)); }); ext } /// Test externalities con el genesis de los golden vectors (caso por defecto). pub fn new_test_ext() -> sp_io::TestExternalities { new_test_ext_with_genesis(GOLDEN_GENESIS) } /// Submitter de prueba (un relayer cualquiera — paga el fee, no es el validador). pub fn alice_origin() -> RuntimeOrigin { RuntimeOrigin::signed(sp_runtime::AccountId32::new([1u8; 32])) } /// Segundo submitter (BOB). pub fn bob_origin() -> RuntimeOrigin { RuntimeOrigin::signed(sp_runtime::AccountId32::new([2u8; 32])) }