diff --git a/Cargo.lock b/Cargo.lock index 266bdcbbeb7c3..be8913718c239 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14801,6 +14801,7 @@ dependencies = [ "sp-core 28.0.0", "sp-genesis-builder 0.8.0", "sp-inherents 26.0.0", + "sp-io 30.0.0", "sp-keyring", "sp-offchain", "sp-runtime 31.0.1", diff --git a/cumulus/parachains/runtimes/testing/penpal/Cargo.toml b/cumulus/parachains/runtimes/testing/penpal/Cargo.toml index 73c831d06c5f4..92dfd03ee77cf 100644 --- a/cumulus/parachains/runtimes/testing/penpal/Cargo.toml +++ b/cumulus/parachains/runtimes/testing/penpal/Cargo.toml @@ -90,6 +90,9 @@ primitive-types = { workspace = true, default-features = false, features = [ "scale-info", ] } +[dev-dependencies] +sp-io = { workspace = true, default-features = true } + [build-dependencies] substrate-wasm-builder = { optional = true, workspace = true, default-features = true } diff --git a/cumulus/parachains/runtimes/testing/penpal/src/genesis_config_presets.rs b/cumulus/parachains/runtimes/testing/penpal/src/genesis_config_presets.rs index f614626d78e1e..1b4c38b92ad92 100644 --- a/cumulus/parachains/runtimes/testing/penpal/src/genesis_config_presets.rs +++ b/cumulus/parachains/runtimes/testing/penpal/src/genesis_config_presets.rs @@ -81,8 +81,8 @@ fn penpal_parachain_genesis( assets: vec![ (RelayLocation::get(), sudo.clone(), true, EXISTENTIAL_DEPOSIT), (LocalPen2Asset::get(), sudo.clone(), false, EXISTENTIAL_DEPOSIT), - (UsdtFromAssetHub::get(), sudo.clone(), true, EXISTENTIAL_DEPOSIT), - (EthFromEthereum::get(), sudo.clone(), true, EXISTENTIAL_DEPOSIT), + (UsdtFromAssetHub::get(), sudo.clone(), true, USDT_ED), + (EthFromEthereum::get(), sudo.clone(), true, ETHER_MIN_BALANCE), ], metadata: vec![ ( @@ -165,3 +165,44 @@ pub fn preset_names() -> Vec { pub fn penpal_session_keys(keys: AuraId) -> crate::SessionKeys { crate::SessionKeys { aura: keys } } + +#[cfg(test)] +mod tests { + use super::*; + + // Duplicated from `sc_chain_spec::json_patch::merge` which lives in a node-side crate + // with heavy transitive deps (sc-executor, sc-network, etc.), making it unsuitable as a + // dev-dependency for a runtime crate. + fn merge(base: &mut serde_json::Value, patch: serde_json::Value) { + match (base, patch) { + (serde_json::Value::Object(base), serde_json::Value::Object(patch)) => { + for (k, v) in patch { + merge(base.entry(k).or_insert(serde_json::Value::Null), v); + } + }, + (base, patch) => *base = patch, + } + } + + fn assert_genesis_preset_valid(preset_id: &sp_genesis_builder::PresetId) { + let patch: serde_json::Value = + serde_json::from_slice(&get_preset(preset_id).expect("preset exists")).unwrap(); + let mut config = serde_json::to_value(RuntimeGenesisConfig::default()).unwrap(); + merge(&mut config, patch); + let json = serde_json::to_vec(&config).unwrap(); + sp_io::TestExternalities::default().execute_with(|| { + frame_support::genesis_builder_helper::build_state::(json) + .expect("genesis preset should build valid state"); + }); + } + + #[test] + fn dev_genesis_preset_is_valid() { + assert_genesis_preset_valid(&sp_genesis_builder::DEV_RUNTIME_PRESET.into()); + } + + #[test] + fn local_testnet_genesis_preset_is_valid() { + assert_genesis_preset_valid(&sp_genesis_builder::LOCAL_TESTNET_RUNTIME_PRESET.into()); + } +} diff --git a/prdoc/pr_11575.prdoc b/prdoc/pr_11575.prdoc new file mode 100644 index 0000000000000..986b1d7f2c82a --- /dev/null +++ b/prdoc/pr_11575.prdoc @@ -0,0 +1,10 @@ +title: '[Penpal] fix genesis presets - assign proper ED to accounts''' +doc: +- audience: Runtime Dev + description: |- + Penpal had values below the ED for initializing asset balances for some accounts. This has not been detected as no unit tests actually use the presets. This PR fixes the invalid values, and it also adds some unit tests for validating that the presets build at least. + + Closes #11558. +crates: +- name: penpal-runtime + bump: patch