diff --git a/Cargo.lock b/Cargo.lock index 3110b4ef8c..a07e26f8cd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3901,12 +3901,10 @@ dependencies = [ "pallet-aura", "pallet-authorship", "pallet-balances", - "pallet-collator-selection", "pallet-collective", "pallet-membership", "pallet-multisig", "pallet-scheduler", - "pallet-session", "pallet-society", "pallet-sudo", "pallet-timestamp", diff --git a/parachain/runtime/kintsugi/Cargo.toml b/parachain/runtime/kintsugi/Cargo.toml index 8ecad71a51..8c7a863418 100644 --- a/parachain/runtime/kintsugi/Cargo.toml +++ b/parachain/runtime/kintsugi/Cargo.toml @@ -51,7 +51,6 @@ pallet-society = { git = "https://github.com/paritytech/substrate", branch = "po # Aura dependencies pallet-authorship = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.12", default-features = false } -pallet-session = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.12", default-features = false } pallet-aura = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.12", default-features = false } sp-consensus-aura = { git = "https://github.com/paritytech/substrate", branch = "polkadot-v0.9.12", default-features = false } @@ -64,7 +63,6 @@ cumulus-primitives-utility = { git = "https://github.com/paritytech/cumulus", br cumulus-pallet-dmp-queue = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.12", default-features = false } cumulus-pallet-xcmp-queue = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.12", default-features = false } cumulus-pallet-xcm = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.12", default-features = false } -pallet-collator-selection = { git = "https://github.com/paritytech/cumulus", branch = "polkadot-v0.9.12", default-features = false } # Polkadot dependencies polkadot-parachain = { git = "https://github.com/paritytech/polkadot", branch = "release-v0.9.12", default-features = false } @@ -171,7 +169,6 @@ std = [ "pallet-society/std", "pallet-authorship/std", - "pallet-session/std", "pallet-aura/std", "sp-consensus-aura/std", @@ -183,7 +180,6 @@ std = [ "cumulus-primitives-core/std", "cumulus-primitives-timestamp/std", "cumulus-primitives-utility/std", - "pallet-collator-selection/std", "polkadot-parachain/std", "xcm/std", diff --git a/parachain/runtime/kintsugi/src/lib.rs b/parachain/runtime/kintsugi/src/lib.rs index 76775d7283..9975ec832f 100644 --- a/parachain/runtime/kintsugi/src/lib.rs +++ b/parachain/runtime/kintsugi/src/lib.rs @@ -12,7 +12,9 @@ use bitcoin::types::H256Le; use currency::Amount; use frame_support::{ dispatch::{DispatchError, DispatchResult}, - traits::{Contains, Currency as PalletCurrency, EnsureOrigin, ExistenceRequirement, Imbalance, OnUnbalanced}, + traits::{ + Contains, Currency as PalletCurrency, EnsureOrigin, ExistenceRequirement, FindAuthor, Imbalance, OnUnbalanced, + }, PalletId, }; use frame_system::{EnsureOneOf, EnsureRoot, RawOrigin}; @@ -60,7 +62,7 @@ pub use primitives::{ // XCM imports use cumulus_primitives_core::ParaId; use orml_xcm_support::{IsNativeConcrete, MultiCurrencyAdapter, MultiNativeAsset}; -use pallet_xcm::{EnsureXcm, IsMajorityOfBody, XcmPassthrough}; +use pallet_xcm::XcmPassthrough; use polkadot_parachain::primitives::Sibling; use sp_runtime::traits::{BlockNumberProvider, Convert}; use xcm::{ @@ -181,7 +183,6 @@ impl Contains for BaseCallFilter { call, Call::System(_) | Call::Authorship(_) - | Call::Session(_) | Call::Timestamp(_) | Call::ParachainSystem(_) | Call::Sudo(_) @@ -243,59 +244,26 @@ parameter_types! { } impl pallet_authorship::Config for Runtime { - type FindAuthor = pallet_session::FindAccountFromAuthorIndex; + type FindAuthor = AuraAccountAdapter; type UncleGenerations = UncleGenerations; type FilterUncle = (); - type EventHandler = (CollatorSelection,); + type EventHandler = (); } -parameter_types! { - pub const Period: u32 = 6 * HOURS; - pub const Offset: u32 = 0; - pub const MaxAuthorities: u32 = 32; -} +pub struct AuraAccountAdapter; -impl pallet_session::Config for Runtime { - type Event = Event; - type ValidatorId = ::AccountId; - // we don't have stash and controller, thus we don't need the convert as well. - type ValidatorIdOf = pallet_collator_selection::IdentityCollator; - type ShouldEndSession = pallet_session::PeriodicSessions; - type NextSessionRotation = pallet_session::PeriodicSessions; - type SessionManager = CollatorSelection; - // Essentially just Aura, but lets be pedantic. - type SessionHandler = ::KeyTypeIdProviders; - type Keys = SessionKeys; - type WeightInfo = (); +impl FindAuthor for AuraAccountAdapter { + fn find_author<'a, I>(digests: I) -> Option + where + I: 'a + IntoIterator, + { + use sp_std::convert::TryFrom; + pallet_aura::AuraAuthorId::::find_author(digests).and_then(|k| AccountId::try_from(k.as_ref()).ok()) + } } parameter_types! { - pub const PotId: PalletId = PalletId(*b"PotStake"); - pub const MaxCandidates: u32 = 1000; - pub const MinCandidates: u32 = 5; - pub const SessionLength: BlockNumber = 6 * HOURS; - pub const MaxInvulnerables: u32 = 100; - pub const ExecutiveBody: BodyId = BodyId::Executive; -} - -/// We allow root and the Relay Chain council to execute privileged collator selection operations. -pub type CollatorSelectionUpdateOrigin = - EnsureOneOf, EnsureXcm>>; - -impl pallet_collator_selection::Config for Runtime { - type Event = Event; - type Currency = orml_tokens::CurrencyAdapter; - type UpdateOrigin = CollatorSelectionUpdateOrigin; - type PotId = PotId; - type MaxCandidates = MaxCandidates; - type MinCandidates = MinCandidates; - type MaxInvulnerables = MaxInvulnerables; - // should be a multiple of session or things will get inconsistent - type KickThreshold = Period; - type ValidatorId = ::AccountId; - type ValidatorIdOf = pallet_collator_selection::IdentityCollator; - type ValidatorRegistration = Session; - type WeightInfo = (); + pub const MaxAuthorities: u32 = 32; } impl pallet_aura::Config for Runtime { @@ -1263,8 +1231,6 @@ construct_runtime! { ParachainInfo: parachain_info::{Pallet, Storage, Config}, Authorship: pallet_authorship::{Pallet, Call, Storage}, - CollatorSelection: pallet_collator_selection::{Pallet, Call, Storage, Event, Config}, - Session: pallet_session::{Pallet, Call, Storage, Event, Config}, Aura: pallet_aura::{Pallet, Storage, Config}, AuraExt: cumulus_pallet_aura_ext::{Pallet, Storage, Config}, diff --git a/parachain/src/chain_spec.rs b/parachain/src/chain_spec.rs index 0b241c9321..c37aac3edb 100644 --- a/parachain/src/chain_spec.rs +++ b/parachain/src/chain_spec.rs @@ -68,24 +68,10 @@ where AccountPublic::from(get_from_seed::(seed)).into_account() } -fn get_authority_keys_from_seed(seed: &str) -> (AccountId, AuraId) { - ( - get_account_id_from_seed::(seed), - get_from_seed::(seed), - ) -} - fn get_authority_keys_from_public_key(src: [u8; 32]) -> (AccountId, AuraId) { (src.clone().into(), src.unchecked_into()) } -/// Generate the session keys from individual elements. -/// -/// The input must be a tuple of individual keys (a single arg for now since we have just one key). -fn get_kintsugi_session_keys(keys: AuraId) -> kintsugi_runtime::SessionKeys { - kintsugi_runtime::SessionKeys { aura: keys } -} - /// Generate the session keys from individual elements. /// /// The input must be a tuple of individual keys (a single arg for now since we have just one key). @@ -134,7 +120,7 @@ pub fn local_config(id: ParaId) -> KintsugiChainSpec { move || { testnet_genesis( get_account_id_from_seed::("Alice"), - vec![get_authority_keys_from_seed("Alice")], + vec![get_from_seed::("Alice")], vec![( get_account_id_from_seed::("Bob"), "Bob".as_bytes().to_vec(), @@ -163,7 +149,7 @@ pub fn development_config(id: ParaId) -> KintsugiChainSpec { move || { testnet_genesis( get_account_id_from_seed::("Alice"), - vec![get_authority_keys_from_seed("Alice")], + vec![get_from_seed::("Alice")], vec![ ( get_account_id_from_seed::("Alice"), @@ -204,17 +190,11 @@ pub fn rococo_testnet_config(id: ParaId) -> KintsugiChainSpec { get_account_id_from_string("5HeVGqvfpabwFqzV1DhiQmjaLQiFcTSmq2sH6f7atsXkgvtt"), vec![ // 5DJ3wbdicFSFFudXndYBuvZKjucTsyxtJX5WPzQM8HysSkFY - get_authority_keys_from_public_key(hex!( - "366a092a27b4b28199a588b0155a2c9f3f0513d92481de4ee2138273926fa91c" - )), + hex!["366a092a27b4b28199a588b0155a2c9f3f0513d92481de4ee2138273926fa91c"].unchecked_into(), // 5HW7ApFamN6ovtDkFyj67tRLRhp8B2kVNjureRUWWYhkTg9j - get_authority_keys_from_public_key(hex!( - "f08cc7cf45f88e6dbe312a63f6ce639061834b4208415b235f77a67b51435f63" - )), + hex!["f08cc7cf45f88e6dbe312a63f6ce639061834b4208415b235f77a67b51435f63"].unchecked_into(), // 5FNbq8zGPZtinsfgyD4w2G3BMh75H3r2Qg3uKudTZkJtRru6 - get_authority_keys_from_public_key(hex!( - "925ad4bdf35945bea91baeb5419a7ffa07002c6a85ba334adfa7cb5b05623c1b" - )), + hex!["925ad4bdf35945bea91baeb5419a7ffa07002c6a85ba334adfa7cb5b05623c1b"].unchecked_into(), ], vec![ ( @@ -255,46 +235,26 @@ pub fn westend_testnet_config(id: ParaId) -> KintsugiChainSpec { testnet_genesis( get_account_id_from_string("5DUupBJSyBDcqQudgPR4gttFie3cLPRw3HwaUfq9H2D2mKiA"), vec![ - // 5H75GkhA6TnyCW7fM4H8LyoTqmPJWf3JuZZPFR9Bpv26LGHA - get_authority_keys_from_public_key(hex!( - "defbbf8f70964f6a4952bc168b6c1489b502e05d6b5ef57f8767589cf3813705" - )), - // 5GdqW1xV8bpcJM1AVPWCdqrnUYJ9UQro1bWuPvmY2hoaQxWp - get_authority_keys_from_public_key(hex!( - "ca35c3927b934b111acadfcf98e9b50846e7596beb7a355df1ab50b1c48e3017" - )), - // 5CdNwrXY3mFMMTiVsxbNTmg3MMDXcyErhxkdLx7yUqhXKopt - get_authority_keys_from_public_key(hex!( - "18eb708be158d0059d005da4188976caaa1aa24c8450ed3f4ad17e7a6a0cb85e" - )), - // 5EcCjUzqBBpmf7E3gXFX3jFosY22yEL7iXYVFWZExPgF6YwD - get_authority_keys_from_public_key(hex!( - "707e47b5a236b10cc8dcb52698ab41ee4e3a23063d999e81af5781b1e03f7048" - )), - // 5DoegnR7GDewmsswNgGuhZZQ8KxTPeVNd9MF1ezhSKdztEPD - get_authority_keys_from_public_key(hex!( - "4cfd1cfc3af74ef3189d6b92734eabae763ae86f1f6dfdf91b04e5d43a369175" - )), - // 5GRKDYVdQ6AAS6xEQ85LzmxNwgP1u2YM81WAUjiD6YLbe69B - get_authority_keys_from_public_key(hex!( - "c0a8dfbd58ed57758594841d3cc8e6a34c97ef75380fe3c3925b1dbddf988f6f" - )), - // 5FKbkKSb9jft3KpZSJviG8EFmdcLanpr4mBj56NpvQ6uL3bQ - get_authority_keys_from_public_key(hex!( - "9010d0a8a099505887e772417734ee94dc767b8ec00f42086dac9742f3b6e037" - )), - // 5H8WaYthvpavtRmYkVkSBzCjbhHqYp9hnNhJXDDnVr2GJt6v - get_authority_keys_from_public_key(hex!( - "e0142f20c1ad92ac9467a4e01ecc0572c45704a730b5337b23b68cb7279a6b49" - )), - // 5ECnot77onJJrSGbKtvTaB7L9zKXB9VrS97vSqBx5bcy15G9 - get_authority_keys_from_public_key(hex!( - "5ea31992c7fb94695c225010b47daf82dd9a1db4751362ae30f299d8164b6c3e" - )), - // 5HNEdfdAvhvAA67pqPgoctiUTCraXkscSv5wYQbUwrKNmpQq - get_authority_keys_from_public_key(hex!( - "ea8bf097557a70b3c8beed5a95ecc127534f6fe00709c20352dcfb8bd073e240" - )), + // 5H75GkhA6TnyCW7fM4H8LyoTqmPJWf3JuZZPFR9Bpv26LGHA (//authority/0) + hex!["defbbf8f70964f6a4952bc168b6c1489b502e05d6b5ef57f8767589cf3813705"].unchecked_into(), + // 5GdqW1xV8bpcJM1AVPWCdqrnUYJ9UQro1bWuPvmY2hoaQxWp (//authority/1) + hex!["ca35c3927b934b111acadfcf98e9b50846e7596beb7a355df1ab50b1c48e3017"].unchecked_into(), + // 5CdNwrXY3mFMMTiVsxbNTmg3MMDXcyErhxkdLx7yUqhXKopt (//authority/2) + hex!["18eb708be158d0059d005da4188976caaa1aa24c8450ed3f4ad17e7a6a0cb85e"].unchecked_into(), + // 5EcCjUzqBBpmf7E3gXFX3jFosY22yEL7iXYVFWZExPgF6YwD (//authority/3) + hex!["707e47b5a236b10cc8dcb52698ab41ee4e3a23063d999e81af5781b1e03f7048"].unchecked_into(), + // 5DoegnR7GDewmsswNgGuhZZQ8KxTPeVNd9MF1ezhSKdztEPD (//authority/4) + hex!["4cfd1cfc3af74ef3189d6b92734eabae763ae86f1f6dfdf91b04e5d43a369175"].unchecked_into(), + // 5GRKDYVdQ6AAS6xEQ85LzmxNwgP1u2YM81WAUjiD6YLbe69B (//authority/5) + hex!["c0a8dfbd58ed57758594841d3cc8e6a34c97ef75380fe3c3925b1dbddf988f6f"].unchecked_into(), + // 5FKbkKSb9jft3KpZSJviG8EFmdcLanpr4mBj56NpvQ6uL3bQ (//authority/6) + hex!["9010d0a8a099505887e772417734ee94dc767b8ec00f42086dac9742f3b6e037"].unchecked_into(), + // 5H8WaYthvpavtRmYkVkSBzCjbhHqYp9hnNhJXDDnVr2GJt6v (//authority/7) + hex!["e0142f20c1ad92ac9467a4e01ecc0572c45704a730b5337b23b68cb7279a6b49"].unchecked_into(), + // 5ECnot77onJJrSGbKtvTaB7L9zKXB9VrS97vSqBx5bcy15G9 (//authority/8) + hex!["5ea31992c7fb94695c225010b47daf82dd9a1db4751362ae30f299d8164b6c3e"].unchecked_into(), + // 5HNEdfdAvhvAA67pqPgoctiUTCraXkscSv5wYQbUwrKNmpQq (//authority/9) + hex!["ea8bf097557a70b3c8beed5a95ecc127534f6fe00709c20352dcfb8bd073e240"].unchecked_into(), ], vec![ ( @@ -338,7 +298,7 @@ fn default_pair_kintsugi(currency_id: CurrencyId) -> VaultCurrencyPair, + initial_authorities: Vec, authorized_oracles: Vec<(AccountId, Vec)>, id: ParaId, bitcoin_confirmations: u32, @@ -351,27 +311,9 @@ fn testnet_genesis( .to_vec(), changes_trie_config: Default::default(), }, - collator_selection: kintsugi_runtime::CollatorSelectionConfig { - invulnerables: invulnerables.iter().cloned().map(|(acc, _)| acc).collect(), - candidacy_bond: Zero::zero(), - ..Default::default() - }, - session: kintsugi_runtime::SessionConfig { - keys: invulnerables - .iter() - .cloned() - .map(|(acc, aura)| { - ( - acc.clone(), // account id - acc.clone(), // validator id - get_kintsugi_session_keys(aura), // session keys - ) - }) - .collect(), + aura: kintsugi_runtime::AuraConfig { + authorities: initial_authorities, }, - // no need to pass anything to aura, in fact it will panic if we do. - // Session will take care of this. - aura: Default::default(), aura_ext: Default::default(), parachain_system: Default::default(), parachain_info: kintsugi_runtime::ParachainInfoConfig { parachain_id: id }, @@ -469,46 +411,26 @@ pub fn kintsugi_mainnet_config(id: ParaId) -> KintsugiChainSpec { kintsugi_mainnet_genesis( get_account_id_from_string("5G49RwnYdfHywAfEpsPRhP47XuznQHpaPuSoSdt6S1kyi69g"), vec![ - // 5DyzufhT1Ynxk9uxrWHjrVuap8oB4Zz7uYdquZHxFxvYBovd - get_authority_keys_from_public_key(hex!( - "54e1a41c9ba60ca45e911e8798ba9d81c22b04435b04816490ebddffe4dffc5c" - )), - // 5EvgAvVBQXtFFbcN74rYR2HE8RsWsEJHqPHhrGX427cnbvY2 - get_authority_keys_from_public_key(hex!( - "7e951061df4d5b61b31a69d62233a5a3a2abdc3195902dd22bc062fadbf42e17" - )), - // 5Hp2yfUMoA5uJM6DQpDJAuCHdzvhzn57gurH1Cxp4cUTzciB - get_authority_keys_from_public_key(hex!( - "fe3915da55703833883c8e0dc9a81bc5ab5e3b4099b23d810cd5d78c6598395b" - )), - // 5FQzZEbc5CtF7gR1De449GtvDwpyVwWPZMqyq9yjJmxXKmgU - get_authority_keys_from_public_key(hex!( - "942dd2ded2896fa236c0f0df58dff88a04d7cf661a4676059d79dc54a271234a" - )), - // 5EqmSYibeeyypp2YGtJdkZxiNjLKpQLCMpW5J3hNgWBfT9Gw - get_authority_keys_from_public_key(hex!( - "7ad693485d4d67a2112881347a553009f0c1de3b26e662aa3863085f536d0537" - )), - // 5E1WeDF5L8xXLmMnLmJUCXo5xqLD6zzPP14T9vESydQmUA29 - get_authority_keys_from_public_key(hex!( - "5608fa7874491c640d0420f5f44650a0b5b8b67411b2670b68440bb97e74ee1c" - )), - // 5D7eFVnyAhcbEJAPAVENqoCr44zTbztsiragiYjz1ExDePja - get_authority_keys_from_public_key(hex!( - "2e79d45517532bc4b6b3359be9ea2aa8b711a0a5362880cfb6651bcb87fe1b05" - )), - // 5FkCciu8zasoDoViTbAYpcHgitQgB5GHN64HWdXyy8kykXFK - get_authority_keys_from_public_key(hex!( - "a2d4159da7f458f8140899f443b480199c65e75ffb755ea9e097aa5b18352001" - )), - // 5H3E3GF1LUeyowgRx47n8AJsRCyzA4f2YNuTo4qEQy7fbbBo - get_authority_keys_from_public_key(hex!( - "dc0c47c6f8fd81190d4fcee4ab2074db5d83eaf301f2cd795ec9b39b8e753f66" - )), - // 5ERqgB3mYvotBFu6vVf7fdnTgxHJvVidBpQL8W4yrpFL25mo - get_authority_keys_from_public_key(hex!( - "6896f1128f9a92c68f14713f0cbeb67a402621d7c80257ea3b246fcca5aede17" - )), + // 5DyzufhT1Ynxk9uxrWHjrVuap8oB4Zz7uYdquZHxFxvYBovd (//authority/0) + hex!["54e1a41c9ba60ca45e911e8798ba9d81c22b04435b04816490ebddffe4dffc5c"].unchecked_into(), + // 5EvgAvVBQXtFFbcN74rYR2HE8RsWsEJHqPHhrGX427cnbvY2 (//authority/1) + hex!["7e951061df4d5b61b31a69d62233a5a3a2abdc3195902dd22bc062fadbf42e17"].unchecked_into(), + // 5Hp2yfUMoA5uJM6DQpDJAuCHdzvhzn57gurH1Cxp4cUTzciB (//authority/2) + hex!["fe3915da55703833883c8e0dc9a81bc5ab5e3b4099b23d810cd5d78c6598395b"].unchecked_into(), + // 5FQzZEbc5CtF7gR1De449GtvDwpyVwWPZMqyq9yjJmxXKmgU (//authority/3) + hex!["942dd2ded2896fa236c0f0df58dff88a04d7cf661a4676059d79dc54a271234a"].unchecked_into(), + // 5EqmSYibeeyypp2YGtJdkZxiNjLKpQLCMpW5J3hNgWBfT9Gw (//authority/4) + hex!["7ad693485d4d67a2112881347a553009f0c1de3b26e662aa3863085f536d0537"].unchecked_into(), + // 5E1WeDF5L8xXLmMnLmJUCXo5xqLD6zzPP14T9vESydQmUA29 (//authority/5) + hex!["5608fa7874491c640d0420f5f44650a0b5b8b67411b2670b68440bb97e74ee1c"].unchecked_into(), + // 5D7eFVnyAhcbEJAPAVENqoCr44zTbztsiragiYjz1ExDePja (//authority/6) + hex!["2e79d45517532bc4b6b3359be9ea2aa8b711a0a5362880cfb6651bcb87fe1b05"].unchecked_into(), + // 5FkCciu8zasoDoViTbAYpcHgitQgB5GHN64HWdXyy8kykXFK (//authority/7) + hex!["a2d4159da7f458f8140899f443b480199c65e75ffb755ea9e097aa5b18352001"].unchecked_into(), + // 5H3E3GF1LUeyowgRx47n8AJsRCyzA4f2YNuTo4qEQy7fbbBo (//authority/8) + hex!["dc0c47c6f8fd81190d4fcee4ab2074db5d83eaf301f2cd795ec9b39b8e753f66"].unchecked_into(), + // 5ERqgB3mYvotBFu6vVf7fdnTgxHJvVidBpQL8W4yrpFL25mo (//authority/9) + hex!["6896f1128f9a92c68f14713f0cbeb67a402621d7c80257ea3b246fcca5aede17"].unchecked_into(), ], vec![ ( @@ -539,7 +461,7 @@ pub fn kintsugi_mainnet_config(id: ParaId) -> KintsugiChainSpec { fn kintsugi_mainnet_genesis( root_key: AccountId, - invulnerables: Vec<(AccountId, AuraId)>, + initial_authorities: Vec, authorized_oracles: Vec<(AccountId, Vec)>, id: ParaId, bitcoin_confirmations: u32, @@ -561,27 +483,9 @@ fn kintsugi_mainnet_genesis( }, parachain_system: Default::default(), parachain_info: kintsugi_runtime::ParachainInfoConfig { parachain_id: id }, - collator_selection: kintsugi_runtime::CollatorSelectionConfig { - invulnerables: invulnerables.iter().cloned().map(|(acc, _)| acc).collect(), - candidacy_bond: Zero::zero(), - ..Default::default() - }, - session: kintsugi_runtime::SessionConfig { - keys: invulnerables - .iter() - .cloned() - .map(|(acc, aura)| { - ( - acc.clone(), // account id - acc.clone(), // validator id - get_kintsugi_session_keys(aura), // session keys - ) - }) - .collect(), + aura: kintsugi_runtime::AuraConfig { + authorities: initial_authorities, }, - // no need to pass anything to aura, in fact it will panic if we do. - // Session will take care of this. - aura: Default::default(), aura_ext: Default::default(), security: kintsugi_runtime::SecurityConfig { initial_status: kintsugi_runtime::StatusCode::Shutdown,