From 04847d515ef56da4d0801c9b89a4241dfa827b33 Mon Sep 17 00:00:00 2001
From: runcomet <runcomet@protonmail.com>
Date: Thu, 23 Jan 2025 02:38:15 -0800
Subject: [PATCH] Balances: Configurable Number of Genesis Accounts with
 Specified Balances for Benchmarking (#6267)

# Derived Dev Accounts

Resolves https://github.com/paritytech/polkadot-sdk/issues/6040

## Description
This update introduces support for creating an arbitrary number of
developer accounts at the genesis block based on a specified derivation
path. This functionality is gated by the runtime-benchmarks feature,
ensuring it is only enabled during benchmarking scenarios.

### Key Features
- Arbitrary Dev Accounts at Genesis: Developers can now specify any
number of accounts to be generated at genesis using a hard derivation
path.

- Default Derivation Path: If no derivation path is provided (i.e., when
`Option<dev_accounts: (..., None)>` is set to `Some` at genesis), the
system will default to the path `//Sender//{}`.

- No Impact on Total Token Issuance: Developer accounts are excluded
from the total issuance of the token supply at genesis, ensuring they do
not affect the overall balance or token distribution.

polkadot address: 14SRqZTC1d8rfxL8W1tBTnfUBPU23ACFVPzp61FyGf4ftUFg

---------

Co-authored-by: Sebastian Kunert <skunert49@gmail.com>
---
 bridges/modules/messages/src/tests/mock.rs    |   9 +-
 .../pallets/collator-selection/src/mock.rs    |   2 +-
 .../assets/asset-hub-rococo/src/genesis.rs    |   1 +
 .../assets/asset-hub-westend/src/genesis.rs   |   1 +
 .../bridges/bridge-hub-rococo/src/genesis.rs  |   1 +
 .../bridges/bridge-hub-westend/src/genesis.rs |   1 +
 .../collectives-westend/src/genesis.rs        |   1 +
 .../coretime/coretime-rococo/src/genesis.rs   |   1 +
 .../coretime/coretime-westend/src/genesis.rs  |   1 +
 .../people/people-rococo/src/genesis.rs       |   1 +
 .../people/people-westend/src/genesis.rs      |   1 +
 .../parachains/testing/penpal/src/genesis.rs  |   1 +
 .../chains/relays/rococo/src/genesis.rs       |   1 +
 .../chains/relays/westend/src/genesis.rs      |   1 +
 .../parachains/runtimes/test-utils/src/lib.rs |   2 +-
 .../runtime/common/src/assigned_slots/mod.rs  |   1 +
 polkadot/runtime/common/src/auctions/mock.rs  |   1 +
 polkadot/runtime/common/src/crowdloan/mod.rs  |   1 +
 .../common/src/paras_registrar/mock.rs        |   1 +
 polkadot/runtime/common/src/slots/mod.rs      |   1 +
 .../relay_token_transactor/network.rs         |   9 +-
 polkadot/xcm/pallet-xcm/src/mock.rs           |   2 +-
 .../single_asset_adapter/mock.rs              |   1 +
 polkadot/xcm/xcm-builder/tests/mock/mod.rs    |   2 +-
 polkadot/xcm/xcm-runtime-apis/tests/mock.rs   |   4 +-
 polkadot/xcm/xcm-simulator/example/src/lib.rs |   2 +
 polkadot/xcm/xcm-simulator/fuzzer/src/fuzz.rs |   3 +-
 prdoc/pr_6267.prdoc                           | 171 ++++++++++++++++++
 .../cli/tests/res/default_genesis_config.json |   3 +-
 substrate/bin/node/testing/src/genesis.rs     |   2 +-
 .../tests/expected/create_default.json        |   3 +-
 .../tests/expected/create_parachain.json      |   3 +-
 .../tests/expected/create_with_params.json    |   3 +-
 .../tests/expected/doc/create_default.json    |   3 +-
 .../tests/expected/doc/display_preset.json    |   2 +-
 .../chain-spec/src/genesis_config_builder.rs  |   2 +-
 substrate/frame/alliance/src/mock.rs          |   1 +
 .../frame/asset-conversion/ops/src/mock.rs    |   1 +
 substrate/frame/asset-conversion/src/mock.rs  |   1 +
 substrate/frame/asset-rewards/src/mock.rs     |   1 +
 substrate/frame/atomic-swap/src/tests.rs      |   5 +-
 substrate/frame/babe/src/mock.rs              |   2 +-
 substrate/frame/balances/Cargo.toml           |   6 +-
 substrate/frame/balances/src/lib.rs           |  64 ++++++-
 .../balances/src/tests/currency_tests.rs      |  11 +-
 substrate/frame/balances/src/tests/mod.rs     |  40 +++-
 substrate/frame/beefy/src/mock.rs             |   2 +-
 substrate/frame/bounties/src/tests.rs         |  15 +-
 substrate/frame/child-bounties/src/tests.rs   |   1 +
 substrate/frame/collective/src/tests.rs       |   5 +-
 .../frame/contracts/mock-network/src/lib.rs   |   2 +
 substrate/frame/contracts/src/tests.rs        |   2 +-
 .../frame/conviction-voting/src/tests.rs      |   1 +
 substrate/frame/delegated-staking/src/mock.rs |   1 +
 substrate/frame/democracy/src/tests.rs        |   1 +
 .../election-provider-multi-phase/src/mock.rs |   1 +
 .../test-staking-e2e/src/mock.rs              |   1 +
 substrate/frame/elections-phragmen/src/lib.rs |   1 +
 substrate/frame/executive/src/tests.rs        |  20 +-
 substrate/frame/fast-unstake/src/mock.rs      |   1 +
 substrate/frame/grandpa/src/mock.rs           |   2 +-
 substrate/frame/identity/src/tests.rs         |   1 +
 substrate/frame/indices/src/mock.rs           |   1 +
 substrate/frame/lottery/src/mock.rs           |   1 +
 substrate/frame/multisig/src/tests.rs         |   1 +
 substrate/frame/nis/src/mock.rs               |   1 +
 .../test-delegate-stake/src/mock.rs           |   1 +
 substrate/frame/preimage/src/mock.rs          |   1 +
 substrate/frame/proxy/src/tests.rs            |   1 +
 substrate/frame/recovery/src/mock.rs          |   1 +
 substrate/frame/referenda/src/mock.rs         |   2 +-
 .../frame/revive/mock-network/src/lib.rs      |   2 +
 substrate/frame/revive/src/tests.rs           |   2 +-
 substrate/frame/root-offences/src/mock.rs     |   1 +
 substrate/frame/safe-mode/src/mock.rs         |   1 +
 substrate/frame/scored-pool/src/mock.rs       |   2 +-
 substrate/frame/society/src/mock.rs           |   2 +-
 substrate/frame/staking/src/mock.rs           |   1 +
 .../frame/state-trie-migration/src/lib.rs     |   9 +-
 substrate/frame/statement/src/mock.rs         |   1 +
 substrate/frame/tips/src/tests.rs             |   6 +-
 .../asset-conversion-tx-payment/src/tests.rs  |   1 +
 .../asset-tx-payment/src/tests.rs             |   1 +
 .../frame/transaction-payment/src/tests.rs    |   1 +
 .../frame/transaction-storage/src/mock.rs     |   1 +
 substrate/frame/treasury/src/tests.rs         |  11 +-
 substrate/frame/tx-pause/src/mock.rs          |   1 +
 substrate/frame/utility/src/tests.rs          |   1 +
 substrate/frame/vesting/src/mock.rs           |   1 +
 .../test-utils/runtime/src/genesismap.rs      |   5 +-
 substrate/test-utils/runtime/src/lib.rs       |   2 +-
 91 files changed, 434 insertions(+), 62 deletions(-)
 create mode 100644 prdoc/pr_6267.prdoc

diff --git a/bridges/modules/messages/src/tests/mock.rs b/bridges/modules/messages/src/tests/mock.rs
index 2935ebd6961..8eebdf3a508 100644
--- a/bridges/modules/messages/src/tests/mock.rs
+++ b/bridges/modules/messages/src/tests/mock.rs
@@ -461,9 +461,12 @@ pub fn inbound_unrewarded_relayers_state(lane: TestLaneIdType) -> UnrewardedRela
 /// Return test externalities to use in tests.
 pub fn new_test_ext() -> sp_io::TestExternalities {
 	let mut t = frame_system::GenesisConfig::<TestRuntime>::default().build_storage().unwrap();
-	pallet_balances::GenesisConfig::<TestRuntime> { balances: vec![(ENDOWED_ACCOUNT, 1_000_000)] }
-		.assimilate_storage(&mut t)
-		.unwrap();
+	pallet_balances::GenesisConfig::<TestRuntime> {
+		balances: vec![(ENDOWED_ACCOUNT, 1_000_000)],
+		..Default::default()
+	}
+	.assimilate_storage(&mut t)
+	.unwrap();
 	sp_io::TestExternalities::new(t)
 }
 
diff --git a/cumulus/pallets/collator-selection/src/mock.rs b/cumulus/pallets/collator-selection/src/mock.rs
index d13f9e9d8c4..6a97525c4f5 100644
--- a/cumulus/pallets/collator-selection/src/mock.rs
+++ b/cumulus/pallets/collator-selection/src/mock.rs
@@ -188,7 +188,7 @@ pub fn new_test_ext() -> sp_io::TestExternalities {
 		invulnerables,
 	};
 	let session = pallet_session::GenesisConfig::<Test> { keys, ..Default::default() };
-	pallet_balances::GenesisConfig::<Test> { balances }
+	pallet_balances::GenesisConfig::<Test> { balances, ..Default::default() }
 		.assimilate_storage(&mut t)
 		.unwrap();
 	// collator selection must be initialized before session.
diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/src/genesis.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/src/genesis.rs
index 3ffb9a704b4..4a10a1e10c7 100644
--- a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/src/genesis.rs
+++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/src/genesis.rs
@@ -42,6 +42,7 @@ pub fn genesis() -> Storage {
 				.cloned()
 				.map(|k| (k, ED * 4096 * 4096))
 				.collect(),
+			..Default::default()
 		},
 		parachain_info: asset_hub_rococo_runtime::ParachainInfoConfig {
 			parachain_id: PARA_ID.into(),
diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/src/genesis.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/src/genesis.rs
index ef7997322da..0473686081e 100644
--- a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/src/genesis.rs
+++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/src/genesis.rs
@@ -39,6 +39,7 @@ pub fn genesis() -> Storage {
 		system: asset_hub_westend_runtime::SystemConfig::default(),
 		balances: asset_hub_westend_runtime::BalancesConfig {
 			balances: accounts::init_balances().iter().cloned().map(|k| (k, ED * 4096)).collect(),
+			..Default::default()
 		},
 		parachain_info: asset_hub_westend_runtime::ParachainInfoConfig {
 			parachain_id: PARA_ID.into(),
diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/src/genesis.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/src/genesis.rs
index 575017f88bb..62b2e4eed9e 100644
--- a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/src/genesis.rs
+++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/src/genesis.rs
@@ -33,6 +33,7 @@ pub fn genesis() -> Storage {
 		system: bridge_hub_rococo_runtime::SystemConfig::default(),
 		balances: bridge_hub_rococo_runtime::BalancesConfig {
 			balances: accounts::init_balances().iter().cloned().map(|k| (k, ED * 4096)).collect(),
+			..Default::default()
 		},
 		parachain_info: bridge_hub_rococo_runtime::ParachainInfoConfig {
 			parachain_id: PARA_ID.into(),
diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/src/genesis.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/src/genesis.rs
index eb4623084f8..5286110bcab 100644
--- a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/src/genesis.rs
+++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/src/genesis.rs
@@ -33,6 +33,7 @@ pub fn genesis() -> Storage {
 		system: bridge_hub_westend_runtime::SystemConfig::default(),
 		balances: bridge_hub_westend_runtime::BalancesConfig {
 			balances: accounts::init_balances().iter().cloned().map(|k| (k, ED * 4096)).collect(),
+			..Default::default()
 		},
 		parachain_info: bridge_hub_westend_runtime::ParachainInfoConfig {
 			parachain_id: PARA_ID.into(),
diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend/src/genesis.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend/src/genesis.rs
index d4ef184ea39..51e065a4ae5 100644
--- a/cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend/src/genesis.rs
+++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend/src/genesis.rs
@@ -30,6 +30,7 @@ pub fn genesis() -> Storage {
 		system: collectives_westend_runtime::SystemConfig::default(),
 		balances: collectives_westend_runtime::BalancesConfig {
 			balances: accounts::init_balances().iter().cloned().map(|k| (k, ED * 4096)).collect(),
+			..Default::default()
 		},
 		parachain_info: collectives_westend_runtime::ParachainInfoConfig {
 			parachain_id: PARA_ID.into(),
diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-rococo/src/genesis.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-rococo/src/genesis.rs
index e0f035c368e..f2035c8654d 100644
--- a/cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-rococo/src/genesis.rs
+++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-rococo/src/genesis.rs
@@ -30,6 +30,7 @@ pub fn genesis() -> Storage {
 		system: coretime_rococo_runtime::SystemConfig::default(),
 		balances: coretime_rococo_runtime::BalancesConfig {
 			balances: accounts::init_balances().iter().cloned().map(|k| (k, ED * 4096)).collect(),
+			..Default::default()
 		},
 		parachain_info: coretime_rococo_runtime::ParachainInfoConfig {
 			parachain_id: PARA_ID.into(),
diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-westend/src/genesis.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-westend/src/genesis.rs
index 239ad3760c1..29894222eff 100644
--- a/cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-westend/src/genesis.rs
+++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/coretime/coretime-westend/src/genesis.rs
@@ -30,6 +30,7 @@ pub fn genesis() -> Storage {
 		system: coretime_westend_runtime::SystemConfig::default(),
 		balances: coretime_westend_runtime::BalancesConfig {
 			balances: accounts::init_balances().iter().cloned().map(|k| (k, ED * 4096)).collect(),
+			..Default::default()
 		},
 		parachain_info: coretime_westend_runtime::ParachainInfoConfig {
 			parachain_id: PARA_ID.into(),
diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/src/genesis.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/src/genesis.rs
index 36a701d24c2..9772a64d23b 100644
--- a/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/src/genesis.rs
+++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/src/genesis.rs
@@ -31,6 +31,7 @@ pub fn genesis() -> Storage {
 		system: people_rococo_runtime::SystemConfig::default(),
 		balances: people_rococo_runtime::BalancesConfig {
 			balances: accounts::init_balances().iter().cloned().map(|k| (k, ED * 4096)).collect(),
+			..Default::default()
 		},
 		parachain_info: people_rococo_runtime::ParachainInfoConfig {
 			parachain_id: ParaId::from(PARA_ID),
diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/src/genesis.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/src/genesis.rs
index 942ec1b31d2..377babc59f6 100644
--- a/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/src/genesis.rs
+++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/src/genesis.rs
@@ -31,6 +31,7 @@ pub fn genesis() -> Storage {
 		system: people_westend_runtime::SystemConfig::default(),
 		balances: people_westend_runtime::BalancesConfig {
 			balances: accounts::init_balances().iter().cloned().map(|k| (k, ED * 4096)).collect(),
+			..Default::default()
 		},
 		parachain_info: people_westend_runtime::ParachainInfoConfig {
 			parachain_id: ParaId::from(PARA_ID),
diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/src/genesis.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/src/genesis.rs
index 63510d233d2..e514d0cb747 100644
--- a/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/src/genesis.rs
+++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/src/genesis.rs
@@ -40,6 +40,7 @@ pub fn genesis(para_id: u32) -> Storage {
 		system: penpal_runtime::SystemConfig::default(),
 		balances: penpal_runtime::BalancesConfig {
 			balances: accounts::init_balances().iter().cloned().map(|k| (k, ED * 4096)).collect(),
+			..Default::default()
 		},
 		parachain_info: penpal_runtime::ParachainInfoConfig {
 			parachain_id: para_id.into(),
diff --git a/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/src/genesis.rs b/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/src/genesis.rs
index 3d8b5b1a500..db9fe19dbdd 100644
--- a/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/src/genesis.rs
+++ b/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/src/genesis.rs
@@ -57,6 +57,7 @@ pub fn genesis() -> Storage {
 		system: rococo_runtime::SystemConfig::default(),
 		balances: rococo_runtime::BalancesConfig {
 			balances: accounts::init_balances().iter().map(|k| (k.clone(), ENDOWMENT)).collect(),
+			..Default::default()
 		},
 		session: rococo_runtime::SessionConfig {
 			keys: validators::initial_authorities()
diff --git a/cumulus/parachains/integration-tests/emulated/chains/relays/westend/src/genesis.rs b/cumulus/parachains/integration-tests/emulated/chains/relays/westend/src/genesis.rs
index f8d43cf4648..2f02ca5f193 100644
--- a/cumulus/parachains/integration-tests/emulated/chains/relays/westend/src/genesis.rs
+++ b/cumulus/parachains/integration-tests/emulated/chains/relays/westend/src/genesis.rs
@@ -58,6 +58,7 @@ pub fn genesis() -> Storage {
 		system: westend_runtime::SystemConfig::default(),
 		balances: westend_runtime::BalancesConfig {
 			balances: accounts::init_balances().iter().cloned().map(|k| (k, ENDOWMENT)).collect(),
+			..Default::default()
 		},
 		session: westend_runtime::SessionConfig {
 			keys: validators::initial_authorities()
diff --git a/cumulus/parachains/runtimes/test-utils/src/lib.rs b/cumulus/parachains/runtimes/test-utils/src/lib.rs
index 5c33809ba67..b46a68312aa 100644
--- a/cumulus/parachains/runtimes/test-utils/src/lib.rs
+++ b/cumulus/parachains/runtimes/test-utils/src/lib.rs
@@ -230,7 +230,7 @@ impl<Runtime: BasicParachainRuntime> ExtBuilder<Runtime> {
 			.unwrap();
 		}
 
-		pallet_balances::GenesisConfig::<Runtime> { balances: self.balances }
+		pallet_balances::GenesisConfig::<Runtime> { balances: self.balances, ..Default::default() }
 			.assimilate_storage(&mut t)
 			.unwrap();
 
diff --git a/polkadot/runtime/common/src/assigned_slots/mod.rs b/polkadot/runtime/common/src/assigned_slots/mod.rs
index dea29f53cad..81e2986ab6b 100644
--- a/polkadot/runtime/common/src/assigned_slots/mod.rs
+++ b/polkadot/runtime/common/src/assigned_slots/mod.rs
@@ -773,6 +773,7 @@ mod tests {
 		let mut t = frame_system::GenesisConfig::<Test>::default().build_storage().unwrap();
 		pallet_balances::GenesisConfig::<Test> {
 			balances: vec![(1, 10), (2, 20), (3, 30), (4, 40), (5, 50), (6, 60)],
+			..Default::default()
 		}
 		.assimilate_storage(&mut t)
 		.unwrap();
diff --git a/polkadot/runtime/common/src/auctions/mock.rs b/polkadot/runtime/common/src/auctions/mock.rs
index e0365d363ca..191608f8c87 100644
--- a/polkadot/runtime/common/src/auctions/mock.rs
+++ b/polkadot/runtime/common/src/auctions/mock.rs
@@ -210,6 +210,7 @@ pub fn new_test_ext() -> sp_io::TestExternalities {
 	let mut t = frame_system::GenesisConfig::<Test>::default().build_storage().unwrap();
 	pallet_balances::GenesisConfig::<Test> {
 		balances: vec![(1, 10), (2, 20), (3, 30), (4, 40), (5, 50), (6, 60)],
+		..Default::default()
 	}
 	.assimilate_storage(&mut t)
 	.unwrap();
diff --git a/polkadot/runtime/common/src/crowdloan/mod.rs b/polkadot/runtime/common/src/crowdloan/mod.rs
index f8b3169407e..1b40f248bfb 100644
--- a/polkadot/runtime/common/src/crowdloan/mod.rs
+++ b/polkadot/runtime/common/src/crowdloan/mod.rs
@@ -1082,6 +1082,7 @@ mod tests {
 		let mut t = frame_system::GenesisConfig::<Test>::default().build_storage().unwrap();
 		pallet_balances::GenesisConfig::<Test> {
 			balances: vec![(1, 1000), (2, 2000), (3, 3000), (4, 4000)],
+			..Default::default()
 		}
 		.assimilate_storage(&mut t)
 		.unwrap();
diff --git a/polkadot/runtime/common/src/paras_registrar/mock.rs b/polkadot/runtime/common/src/paras_registrar/mock.rs
index 07b8fbca518..bb3728f0e12 100644
--- a/polkadot/runtime/common/src/paras_registrar/mock.rs
+++ b/polkadot/runtime/common/src/paras_registrar/mock.rs
@@ -166,6 +166,7 @@ pub fn new_test_ext() -> TestExternalities {
 
 	pallet_balances::GenesisConfig::<Test> {
 		balances: vec![(1, 10_000_000), (2, 10_000_000), (3, 10_000_000)],
+		..Default::default()
 	}
 	.assimilate_storage(&mut t)
 	.unwrap();
diff --git a/polkadot/runtime/common/src/slots/mod.rs b/polkadot/runtime/common/src/slots/mod.rs
index 59a1f1870b2..131a75f3d74 100644
--- a/polkadot/runtime/common/src/slots/mod.rs
+++ b/polkadot/runtime/common/src/slots/mod.rs
@@ -578,6 +578,7 @@ mod tests {
 		let mut t = frame_system::GenesisConfig::<Test>::default().build_storage().unwrap();
 		pallet_balances::GenesisConfig::<Test> {
 			balances: vec![(1, 10), (2, 20), (3, 30), (4, 40), (5, 50), (6, 60)],
+			..Default::default()
 		}
 		.assimilate_storage(&mut t)
 		.unwrap();
diff --git a/polkadot/xcm/docs/src/cookbook/relay_token_transactor/network.rs b/polkadot/xcm/docs/src/cookbook/relay_token_transactor/network.rs
index 46ac0e5df63..71c14f6b241 100644
--- a/polkadot/xcm/docs/src/cookbook/relay_token_transactor/network.rs
+++ b/polkadot/xcm/docs/src/cookbook/relay_token_transactor/network.rs
@@ -78,9 +78,12 @@ pub fn relay_ext() -> TestExternalities {
 
 	let mut t = frame_system::GenesisConfig::<Runtime>::default().build_storage().unwrap();
 
-	pallet_balances::GenesisConfig::<Runtime> { balances: vec![(ALICE, INITIAL_BALANCE)] }
-		.assimilate_storage(&mut t)
-		.unwrap();
+	pallet_balances::GenesisConfig::<Runtime> {
+		balances: vec![(ALICE, INITIAL_BALANCE)],
+		..Default::default()
+	}
+	.assimilate_storage(&mut t)
+	.unwrap();
 
 	let mut ext = TestExternalities::new(t);
 	ext.execute_with(|| {
diff --git a/polkadot/xcm/pallet-xcm/src/mock.rs b/polkadot/xcm/pallet-xcm/src/mock.rs
index 8d0476b0e70..58b4226ccf1 100644
--- a/polkadot/xcm/pallet-xcm/src/mock.rs
+++ b/polkadot/xcm/pallet-xcm/src/mock.rs
@@ -700,7 +700,7 @@ pub(crate) fn new_test_ext_with_balances_and_xcm_version(
 ) -> sp_io::TestExternalities {
 	let mut t = frame_system::GenesisConfig::<Test>::default().build_storage().unwrap();
 
-	pallet_balances::GenesisConfig::<Test> { balances }
+	pallet_balances::GenesisConfig::<Test> { balances, ..Default::default() }
 		.assimilate_storage(&mut t)
 		.unwrap();
 
diff --git a/polkadot/xcm/xcm-builder/src/asset_exchange/single_asset_adapter/mock.rs b/polkadot/xcm/xcm-builder/src/asset_exchange/single_asset_adapter/mock.rs
index e6fe8e45c26..55a924dbaa6 100644
--- a/polkadot/xcm/xcm-builder/src/asset_exchange/single_asset_adapter/mock.rs
+++ b/polkadot/xcm/xcm-builder/src/asset_exchange/single_asset_adapter/mock.rs
@@ -339,6 +339,7 @@ pub fn new_test_ext() -> sp_io::TestExternalities {
 
 	pallet_balances::GenesisConfig::<Runtime> {
 		balances: vec![(0, INITIAL_BALANCE), (1, INITIAL_BALANCE), (2, INITIAL_BALANCE)],
+		..Default::default()
 	}
 	.assimilate_storage(&mut t)
 	.unwrap();
diff --git a/polkadot/xcm/xcm-builder/tests/mock/mod.rs b/polkadot/xcm/xcm-builder/tests/mock/mod.rs
index 0468b0a5410..c3e53284508 100644
--- a/polkadot/xcm/xcm-builder/tests/mock/mod.rs
+++ b/polkadot/xcm/xcm-builder/tests/mock/mod.rs
@@ -243,7 +243,7 @@ construct_runtime!(
 pub fn kusama_like_with_balances(balances: Vec<(AccountId, Balance)>) -> sp_io::TestExternalities {
 	let mut t = frame_system::GenesisConfig::<Runtime>::default().build_storage().unwrap();
 
-	pallet_balances::GenesisConfig::<Runtime> { balances }
+	pallet_balances::GenesisConfig::<Runtime> { balances, ..Default::default() }
 		.assimilate_storage(&mut t)
 		.unwrap();
 
diff --git a/polkadot/xcm/xcm-runtime-apis/tests/mock.rs b/polkadot/xcm/xcm-runtime-apis/tests/mock.rs
index 56a77094f17..18d9dce9245 100644
--- a/polkadot/xcm/xcm-runtime-apis/tests/mock.rs
+++ b/polkadot/xcm/xcm-runtime-apis/tests/mock.rs
@@ -365,7 +365,7 @@ impl pallet_xcm::Config for TestRuntime {
 pub fn new_test_ext_with_balances(balances: Vec<(AccountId, Balance)>) -> sp_io::TestExternalities {
 	let mut t = frame_system::GenesisConfig::<TestRuntime>::default().build_storage().unwrap();
 
-	pallet_balances::GenesisConfig::<TestRuntime> { balances }
+	pallet_balances::GenesisConfig::<TestRuntime> { balances, ..Default::default() }
 		.assimilate_storage(&mut t)
 		.unwrap();
 
@@ -381,7 +381,7 @@ pub fn new_test_ext_with_balances_and_assets(
 ) -> sp_io::TestExternalities {
 	let mut t = frame_system::GenesisConfig::<TestRuntime>::default().build_storage().unwrap();
 
-	pallet_balances::GenesisConfig::<TestRuntime> { balances }
+	pallet_balances::GenesisConfig::<TestRuntime> { balances, ..Default::default() }
 		.assimilate_storage(&mut t)
 		.unwrap();
 
diff --git a/polkadot/xcm/xcm-simulator/example/src/lib.rs b/polkadot/xcm/xcm-simulator/example/src/lib.rs
index 6fb9a69770e..8a05569831b 100644
--- a/polkadot/xcm/xcm-simulator/example/src/lib.rs
+++ b/polkadot/xcm/xcm-simulator/example/src/lib.rs
@@ -101,6 +101,7 @@ pub fn para_ext(para_id: u32) -> sp_io::TestExternalities {
 
 	pallet_balances::GenesisConfig::<Runtime> {
 		balances: vec![(ALICE, INITIAL_BALANCE), (parent_account_id(), INITIAL_BALANCE)],
+		..Default::default()
 	}
 	.assimilate_storage(&mut t)
 	.unwrap();
@@ -125,6 +126,7 @@ pub fn relay_ext() -> sp_io::TestExternalities {
 			(child_account_id(1), INITIAL_BALANCE),
 			(child_account_id(2), INITIAL_BALANCE),
 		],
+		..Default::default()
 	}
 	.assimilate_storage(&mut t)
 	.unwrap();
diff --git a/polkadot/xcm/xcm-simulator/fuzzer/src/fuzz.rs b/polkadot/xcm/xcm-simulator/fuzzer/src/fuzz.rs
index adf6cacd278..8ea5e033f3a 100644
--- a/polkadot/xcm/xcm-simulator/fuzzer/src/fuzz.rs
+++ b/polkadot/xcm/xcm-simulator/fuzzer/src/fuzz.rs
@@ -117,6 +117,7 @@ pub fn para_ext(para_id: u32) -> sp_io::TestExternalities {
 
 	pallet_balances::GenesisConfig::<Runtime> {
 		balances: (0..6).map(|i| ([i; 32].into(), INITIAL_BALANCE)).collect(),
+		..Default::default()
 	}
 	.assimilate_storage(&mut t)
 	.unwrap();
@@ -138,7 +139,7 @@ pub fn relay_ext() -> sp_io::TestExternalities {
 	balances.append(&mut (1..=3).map(|i| (para_account_id(i), INITIAL_BALANCE)).collect());
 	balances.append(&mut (0..6).map(|i| ([i; 32].into(), INITIAL_BALANCE)).collect());
 
-	pallet_balances::GenesisConfig::<Runtime> { balances }
+	pallet_balances::GenesisConfig::<Runtime> { balances, ..Default::default() }
 		.assimilate_storage(&mut t)
 		.unwrap();
 
diff --git a/prdoc/pr_6267.prdoc b/prdoc/pr_6267.prdoc
new file mode 100644
index 00000000000..30ada445625
--- /dev/null
+++ b/prdoc/pr_6267.prdoc
@@ -0,0 +1,171 @@
+# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0
+# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json
+
+title: Allow configurable number of genesis accounts with specified balances for benchmarking.
+
+doc:
+  - audience: Runtime Dev
+    description: |
+      This pull request adds an additional field `dev_accounts` to the `GenesisConfig`
+      of the balances pallet, feature gated by `runtime-benchmarks`.
+
+      Bringing about an abitrary number of derived dev accounts when building the genesis
+      state. Runtime developers should supply a derivation path that includes an index placeholder
+      (i.e. "//Sender/{}") to generate multiple accounts from the same root in a consistent
+      manner.
+
+crates:
+  - name: substrate-test-runtime
+    bump: minor
+  - name: pallet-vesting
+    bump: patch
+  - name: pallet-utility
+    bump: patch
+  - name: pallet-tx-pause
+    bump: patch
+  - name: pallet-treasury
+    bump: patch
+  - name: pallet-transaction-storage
+    bump: patch
+  - name: pallet-transaction-payment
+    bump: patch
+  - name: pallet-asset-tx-payment
+    bump: patch
+  - name: pallet-asset-conversion-tx-payment
+    bump: patch
+  - name: pallet-tips
+    bump: patch
+  - name: pallet-state-trie-migration
+    bump: patch
+  - name: pallet-staking
+    bump: patch
+  - name: pallet-society
+    bump: patch
+  - name: pallet-safe-mode
+    bump: patch
+  - name: pallet-scored-pool
+    bump: patch
+  - name: pallet-statement
+    bump: patch
+  - name: pallet-root-offences
+    bump: patch
+  - name: pallet-revive
+    bump: patch
+  - name: pallet-revive-mock-network
+    bump: patch
+  - name: pallet-referenda
+    bump: patch
+  - name: pallet-recovery
+    bump: patch
+  - name: pallet-proxy
+    bump: patch
+  - name: pallet-preimage
+    bump: patch
+  - name: pallet-nis
+    bump: patch
+  - name: pallet-nomination-pools-test-delegate-stake
+    bump: minor
+  - name: pallet-multisig
+    bump: patch
+  - name: pallet-lottery
+    bump: patch
+  - name: pallet-indices
+    bump: patch
+  - name: pallet-identity
+    bump: patch
+  - name: pallet-grandpa
+    bump: patch
+  - name: pallet-fast-unstake
+    bump: patch
+  - name: frame-executive
+    bump: patch
+  - name: pallet-elections-phragmen
+    bump: patch
+  - name: pallet-election-provider-e2e-test
+    bump: minor
+  - name: pallet-election-provider-multi-phase
+    bump: patch
+  - name: pallet-democracy
+    bump: patch
+  - name: pallet-delegated-staking
+    bump: patch
+  - name: pallet-conviction-voting
+    bump: patch
+  - name: pallet-contracts
+    bump: patch
+  - name: pallet-contracts-mock-network
+    bump: patch
+  - name: pallet-collective
+    bump: patch
+  - name: pallet-child-bounties
+    bump: patch
+  - name: pallet-bounties
+    bump: patch
+  - name: pallet-beefy
+    bump: patch
+  - name: pallet-balances
+    bump: major
+  - name: pallet-babe
+    bump: patch
+  - name: pallet-asset-conversion
+    bump: patch
+  - name: pallet-asset-conversion-ops
+    bump: patch
+  - name: pallet-asset-rewards
+    bump: patch
+  - name: pallet-atomic-swap
+    bump: patch
+  - name: pallet-alliance
+    bump: patch
+  - name: node-testing
+    bump: minor
+  - name: sc-chain-spec
+    bump: patch
+  - name: staging-chain-spec-builder
+    bump: patch
+  - name: xcm-simulator-fuzzer
+    bump: minor
+  - name: xcm-simulator-fuzzer
+    bump: minor
+  - name: xcm-simulator-example
+    bump: patch
+  - name: xcm-runtime-apis
+    bump: patch
+  - name: staging-xcm-builder
+    bump: patch
+  - name: pallet-xcm
+    bump: patch
+  - name: xcm-docs
+    bump: minor
+  - name: polkadot-runtime-common
+    bump: patch
+  - name: parachains-runtimes-test-utils
+    bump: patch
+  - name: westend-emulated-chain
+    bump: minor
+  - name: rococo-emulated-chain
+    bump: minor
+  - name: penpal-emulated-chain
+    bump: minor
+  - name: people-westend-emulated-chain
+    bump: minor
+  - name: people-rococo-emulated-chain
+    bump: minor
+  - name: coretime-westend-emulated-chain
+    bump: minor
+  - name: coretime-rococo-emulated-chain
+    bump: minor
+  - name: collectives-westend-emulated-chain
+    bump: minor
+  - name: bridge-hub-westend-emulated-chain
+    bump: minor
+  - name: bridge-hub-rococo-emulated-chain
+    bump: minor
+  - name: asset-hub-westend-emulated-chain
+    bump: minor
+  - name: asset-hub-rococo-emulated-chain
+    bump: minor
+  - name: pallet-collator-selection
+    bump: patch
+  - name: pallet-bridge-messages
+    bump: patch
diff --git a/substrate/bin/node/cli/tests/res/default_genesis_config.json b/substrate/bin/node/cli/tests/res/default_genesis_config.json
index a2e52837d88..8ad2428f785 100644
--- a/substrate/bin/node/cli/tests/res/default_genesis_config.json
+++ b/substrate/bin/node/cli/tests/res/default_genesis_config.json
@@ -14,7 +14,8 @@
     "indices": []
   },
   "balances": {
-    "balances": []
+    "balances": [],
+    "devAccounts": null
   },
   "broker": {},
   "transactionPayment": {
diff --git a/substrate/bin/node/testing/src/genesis.rs b/substrate/bin/node/testing/src/genesis.rs
index 0394f6cd739..624b00b4d6c 100644
--- a/substrate/bin/node/testing/src/genesis.rs
+++ b/substrate/bin/node/testing/src/genesis.rs
@@ -47,7 +47,7 @@ pub fn config_endowed(extra_endowed: Vec<AccountId>) -> RuntimeGenesisConfig {
 
 	RuntimeGenesisConfig {
 		indices: IndicesConfig { indices: vec![] },
-		balances: BalancesConfig { balances: endowed },
+		balances: BalancesConfig { balances: endowed, ..Default::default() },
 		session: SessionConfig {
 			keys: vec![
 				(alice(), dave(), session_keys_from_seed(Ed25519Keyring::Alice.into())),
diff --git a/substrate/bin/utils/chain-spec-builder/tests/expected/create_default.json b/substrate/bin/utils/chain-spec-builder/tests/expected/create_default.json
index ac67aef9334..77891ac93ea 100644
--- a/substrate/bin/utils/chain-spec-builder/tests/expected/create_default.json
+++ b/substrate/bin/utils/chain-spec-builder/tests/expected/create_default.json
@@ -25,7 +25,8 @@
           }
         },
         "balances": {
-          "balances": []
+          "balances": [],
+          "devAccounts": null
         },
         "substrateTest": {
           "authorities": []
diff --git a/substrate/bin/utils/chain-spec-builder/tests/expected/create_parachain.json b/substrate/bin/utils/chain-spec-builder/tests/expected/create_parachain.json
index 7106b4b50dc..22b0ca6571b 100644
--- a/substrate/bin/utils/chain-spec-builder/tests/expected/create_parachain.json
+++ b/substrate/bin/utils/chain-spec-builder/tests/expected/create_parachain.json
@@ -27,7 +27,8 @@
           }
         },
         "balances": {
-          "balances": []
+          "balances": [],
+          "devAccounts": null
         },
         "substrateTest": {
           "authorities": []
diff --git a/substrate/bin/utils/chain-spec-builder/tests/expected/create_with_params.json b/substrate/bin/utils/chain-spec-builder/tests/expected/create_with_params.json
index 5aedd5b5c18..641df669e18 100644
--- a/substrate/bin/utils/chain-spec-builder/tests/expected/create_with_params.json
+++ b/substrate/bin/utils/chain-spec-builder/tests/expected/create_with_params.json
@@ -25,7 +25,8 @@
           }
         },
         "balances": {
-          "balances": []
+          "balances": [],
+          "devAccounts": null
         },
         "substrateTest": {
           "authorities": []
diff --git a/substrate/bin/utils/chain-spec-builder/tests/expected/doc/create_default.json b/substrate/bin/utils/chain-spec-builder/tests/expected/doc/create_default.json
index 203b6716cb2..e5957624ead 100644
--- a/substrate/bin/utils/chain-spec-builder/tests/expected/doc/create_default.json
+++ b/substrate/bin/utils/chain-spec-builder/tests/expected/doc/create_default.json
@@ -24,7 +24,8 @@
           }
         },
         "balances": {
-          "balances": []
+          "balances": [],
+          "devAccounts": null
         },
         "substrateTest": {
           "authorities": []
diff --git a/substrate/bin/utils/chain-spec-builder/tests/expected/doc/display_preset.json b/substrate/bin/utils/chain-spec-builder/tests/expected/doc/display_preset.json
index 6aa6799af77..6bbb475d35c 100644
--- a/substrate/bin/utils/chain-spec-builder/tests/expected/doc/display_preset.json
+++ b/substrate/bin/utils/chain-spec-builder/tests/expected/doc/display_preset.json
@@ -1 +1 @@
-{"babe":{"authorities":[],"epochConfig":{"allowed_slots":"PrimaryAndSecondaryVRFSlots","c":[1,4]}},"balances":{"balances":[]},"substrateTest":{"authorities":[]},"system":{}}
+{"babe":{"authorities":[],"epochConfig":{"allowed_slots":"PrimaryAndSecondaryVRFSlots","c":[1,4]}},"balances":{"balances":[], "devAccounts": null},"substrateTest":{"authorities":[]},"system":{}}
diff --git a/substrate/client/chain-spec/src/genesis_config_builder.rs b/substrate/client/chain-spec/src/genesis_config_builder.rs
index 5fe8f9dc053..c7b5ae4bf16 100644
--- a/substrate/client/chain-spec/src/genesis_config_builder.rs
+++ b/substrate/client/chain-spec/src/genesis_config_builder.rs
@@ -196,7 +196,7 @@ mod tests {
 			<GenesisConfigBuilderRuntimeCaller>::new(substrate_test_runtime::wasm_binary_unwrap())
 				.get_default_config()
 				.unwrap();
-		let expected = r#"{"babe": {"authorities": [], "epochConfig": {"allowed_slots": "PrimaryAndSecondaryVRFSlots", "c": [1, 4]}}, "balances": {"balances": []}, "substrateTest": {"authorities": []}, "system": {}}"#;
+		let expected = r#"{"babe": {"authorities": [], "epochConfig": {"allowed_slots": "PrimaryAndSecondaryVRFSlots", "c": [1, 4]}}, "balances": {"balances": [], "devAccounts": null}, "substrateTest": {"authorities": []}, "system": {}}"#;
 		assert_eq!(from_str::<Value>(expected).unwrap(), config);
 	}
 
diff --git a/substrate/frame/alliance/src/mock.rs b/substrate/frame/alliance/src/mock.rs
index 625cabf3457..069c29a88d3 100644
--- a/substrate/frame/alliance/src/mock.rs
+++ b/substrate/frame/alliance/src/mock.rs
@@ -283,6 +283,7 @@ pub fn new_test_ext() -> sp_io::TestExternalities {
 			(8, 1000),
 			(9, 1000),
 		],
+		..Default::default()
 	}
 	.assimilate_storage(&mut t)
 	.unwrap();
diff --git a/substrate/frame/asset-conversion/ops/src/mock.rs b/substrate/frame/asset-conversion/ops/src/mock.rs
index 5c05faa6aa8..576b266b39c 100644
--- a/substrate/frame/asset-conversion/ops/src/mock.rs
+++ b/substrate/frame/asset-conversion/ops/src/mock.rs
@@ -135,6 +135,7 @@ pub(crate) fn new_test_ext() -> sp_io::TestExternalities {
 
 	pallet_balances::GenesisConfig::<Test> {
 		balances: vec![(1, 10000), (2, 20000), (3, 30000), (4, 40000)],
+		..Default::default()
 	}
 	.assimilate_storage(&mut t)
 	.unwrap();
diff --git a/substrate/frame/asset-conversion/src/mock.rs b/substrate/frame/asset-conversion/src/mock.rs
index d8832d70488..313d9f9857e 100644
--- a/substrate/frame/asset-conversion/src/mock.rs
+++ b/substrate/frame/asset-conversion/src/mock.rs
@@ -162,6 +162,7 @@ pub(crate) fn new_test_ext() -> sp_io::TestExternalities {
 
 	pallet_balances::GenesisConfig::<Test> {
 		balances: vec![(1, 10000), (2, 20000), (3, 30000), (4, 40000)],
+		..Default::default()
 	}
 	.assimilate_storage(&mut t)
 	.unwrap();
diff --git a/substrate/frame/asset-rewards/src/mock.rs b/substrate/frame/asset-rewards/src/mock.rs
index 87c8a8a0dea..1e9b41104d4 100644
--- a/substrate/frame/asset-rewards/src/mock.rs
+++ b/substrate/frame/asset-rewards/src/mock.rs
@@ -211,6 +211,7 @@ pub(crate) fn new_test_ext() -> sp_io::TestExternalities {
 			(20, 40000),
 			(pool_zero_account_id, 100_000), // Top up the default pool account id
 		],
+		..Default::default()
 	}
 	.assimilate_storage(&mut t)
 	.unwrap();
diff --git a/substrate/frame/atomic-swap/src/tests.rs b/substrate/frame/atomic-swap/src/tests.rs
index 6fcc5571a52..d6384fab343 100644
--- a/substrate/frame/atomic-swap/src/tests.rs
+++ b/substrate/frame/atomic-swap/src/tests.rs
@@ -54,7 +54,10 @@ const B: u64 = 2;
 
 pub fn new_test_ext() -> TestExternalities {
 	let mut t = frame_system::GenesisConfig::<Test>::default().build_storage().unwrap();
-	let genesis = pallet_balances::GenesisConfig::<Test> { balances: vec![(A, 100), (B, 200)] };
+	let genesis = pallet_balances::GenesisConfig::<Test> {
+		balances: vec![(A, 100), (B, 200)],
+		..Default::default()
+	};
 	genesis.assimilate_storage(&mut t).unwrap();
 	t.into()
 }
diff --git a/substrate/frame/babe/src/mock.rs b/substrate/frame/babe/src/mock.rs
index 8d00509e800..6f9f54cc7ef 100644
--- a/substrate/frame/babe/src/mock.rs
+++ b/substrate/frame/babe/src/mock.rs
@@ -314,7 +314,7 @@ pub fn new_test_ext_raw_authorities(authorities: Vec<AuthorityId>) -> sp_io::Tes
 
 	let balances: Vec<_> = (0..authorities.len()).map(|i| (i as u64, 10_000_000)).collect();
 
-	pallet_balances::GenesisConfig::<Test> { balances }
+	pallet_balances::GenesisConfig::<Test> { balances, ..Default::default() }
 		.assimilate_storage(&mut t)
 		.unwrap();
 
diff --git a/substrate/frame/balances/Cargo.toml b/substrate/frame/balances/Cargo.toml
index 03bc7fcb3fc..4255ed41436 100644
--- a/substrate/frame/balances/Cargo.toml
+++ b/substrate/frame/balances/Cargo.toml
@@ -23,13 +23,15 @@ frame-support = { workspace = true }
 frame-system = { workspace = true }
 log = { workspace = true }
 scale-info = { features = ["derive"], workspace = true }
+sp-core = { workspace = true }
 sp-runtime = { workspace = true }
 
 [dev-dependencies]
-frame-support = { features = ["experimental"], workspace = true, default-features = true }
+frame-support = { features = [
+	"experimental",
+], workspace = true, default-features = true }
 pallet-transaction-payment = { workspace = true, default-features = true }
 paste = { workspace = true, default-features = true }
-sp-core = { workspace = true, default-features = true }
 sp-io = { workspace = true, default-features = true }
 
 [features]
diff --git a/substrate/frame/balances/src/lib.rs b/substrate/frame/balances/src/lib.rs
index 9d740145210..e994f05a77c 100644
--- a/substrate/frame/balances/src/lib.rs
+++ b/substrate/frame/balances/src/lib.rs
@@ -152,7 +152,11 @@ pub mod weights;
 
 extern crate alloc;
 
-use alloc::vec::Vec;
+use alloc::{
+	format,
+	string::{String, ToString},
+	vec::Vec,
+};
 use codec::{Codec, MaxEncodedLen};
 use core::{cmp, fmt::Debug, mem, result};
 use frame_support::{
@@ -173,6 +177,7 @@ use frame_support::{
 use frame_system as system;
 pub use impl_currency::{NegativeImbalance, PositiveImbalance};
 use scale_info::TypeInfo;
+use sp_core::{sr25519::Pair as SrPair, Pair};
 use sp_runtime::{
 	traits::{
 		AtLeast32BitUnsigned, CheckedAdd, CheckedSub, MaybeSerializeDeserialize, Saturating,
@@ -180,6 +185,7 @@ use sp_runtime::{
 	},
 	ArithmeticError, DispatchError, FixedPointOperand, Perbill, RuntimeDebug, TokenError,
 };
+
 pub use types::{
 	AccountData, AdjustmentDirection, BalanceLock, DustCleaner, ExtraFlags, Reasons, ReserveData,
 };
@@ -189,6 +195,9 @@ pub use pallet::*;
 
 const LOG_TARGET: &str = "runtime::balances";
 
+// Default derivation(hard) for development accounts.
+const DEFAULT_ADDRESS_URI: &str = "//Sender//{}";
+
 type AccountIdLookupOf<T> = <<T as frame_system::Config>::Lookup as StaticLookup>::Source;
 
 #[frame_support::pallet]
@@ -505,11 +514,18 @@ pub mod pallet {
 	#[pallet::genesis_config]
 	pub struct GenesisConfig<T: Config<I>, I: 'static = ()> {
 		pub balances: Vec<(T::AccountId, T::Balance)>,
+		/// Derived development accounts(Optional):
+		/// - `u32`: The number of development accounts to generate.
+		/// - `T::Balance`: The initial balance assigned to each development account.
+		/// - `String`: An optional derivation(hard) string template.
+		/// - Must include `{}` as a placeholder for account indices.
+		/// - Defaults to `"//Sender//{}`" if `None`.
+		pub dev_accounts: Option<(u32, T::Balance, Option<String>)>,
 	}
 
 	impl<T: Config<I>, I: 'static> Default for GenesisConfig<T, I> {
 		fn default() -> Self {
-			Self { balances: Default::default() }
+			Self { balances: Default::default(), dev_accounts: None }
 		}
 	}
 
@@ -540,6 +556,15 @@ pub mod pallet {
 				"duplicate balances in genesis."
 			);
 
+			// Generate additional dev accounts.
+			if let Some((num_accounts, balance, ref derivation)) = self.dev_accounts {
+				// Using the provided derivation string or default to `"//Sender//{}`".
+				Pallet::<T, I>::derive_dev_account(
+					num_accounts,
+					balance,
+					derivation.as_deref().unwrap_or(DEFAULT_ADDRESS_URI),
+				);
+			}
 			for &(ref who, free) in self.balances.iter() {
 				frame_system::Pallet::<T>::inc_providers(who);
 				assert!(T::AccountStore::insert(who, AccountData { free, ..Default::default() })
@@ -1248,5 +1273,40 @@ pub mod pallet {
 			});
 			Ok(actual)
 		}
+
+		/// Generate dev account from derivation(hard) string.
+		pub fn derive_dev_account(num_accounts: u32, balance: T::Balance, derivation: &str) {
+			// Ensure that the number of accounts is not zero.
+			assert!(num_accounts > 0, "num_accounts must be greater than zero");
+
+			assert!(
+				balance >= <T as Config<I>>::ExistentialDeposit::get(),
+				"the balance of any account should always be at least the existential deposit.",
+			);
+
+			assert!(
+				derivation.contains("{}"),
+				"Invalid derivation, expected `{{}}` as part of the derivation"
+			);
+
+			for index in 0..num_accounts {
+				// Replace "{}" in the derivation string with the index.
+				let derivation_string = derivation.replace("{}", &index.to_string());
+
+				// Generate the key pair from the derivation string using sr25519.
+				let pair: SrPair = Pair::from_string(&derivation_string, None)
+					.expect(&format!("Failed to parse derivation string: {derivation_string}"));
+
+				// Convert the public key to AccountId.
+				let who = T::AccountId::decode(&mut &pair.public().encode()[..])
+					.expect(&format!("Failed to decode public key from pair: {:?}", pair.public()));
+
+				// Set the balance for the generated account.
+				Self::mutate_account_handling_dust(&who, |account| {
+					account.free = balance;
+				})
+				.expect(&format!("Failed to add account to keystore: {:?}", who));
+			}
+		}
 	}
 }
diff --git a/substrate/frame/balances/src/tests/currency_tests.rs b/substrate/frame/balances/src/tests/currency_tests.rs
index 5ad818e5bfa..a6377c3ad72 100644
--- a/substrate/frame/balances/src/tests/currency_tests.rs
+++ b/substrate/frame/balances/src/tests/currency_tests.rs
@@ -721,7 +721,7 @@ fn burn_must_work() {
 fn cannot_set_genesis_value_below_ed() {
 	EXISTENTIAL_DEPOSIT.with(|v| *v.borrow_mut() = 11);
 	let mut t = frame_system::GenesisConfig::<Test>::default().build_storage().unwrap();
-	let _ = crate::GenesisConfig::<Test> { balances: vec![(1, 10)] }
+	let _ = crate::GenesisConfig::<Test> { balances: vec![(1, 10)], ..Default::default() }
 		.assimilate_storage(&mut t)
 		.unwrap();
 }
@@ -730,9 +730,12 @@ fn cannot_set_genesis_value_below_ed() {
 #[should_panic = "duplicate balances in genesis."]
 fn cannot_set_genesis_value_twice() {
 	let mut t = frame_system::GenesisConfig::<Test>::default().build_storage().unwrap();
-	let _ = crate::GenesisConfig::<Test> { balances: vec![(1, 10), (2, 20), (1, 15)] }
-		.assimilate_storage(&mut t)
-		.unwrap();
+	let _ = crate::GenesisConfig::<Test> {
+		balances: vec![(1, 10), (2, 20), (1, 15)],
+		..Default::default()
+	}
+	.assimilate_storage(&mut t)
+	.unwrap();
 }
 
 #[test]
diff --git a/substrate/frame/balances/src/tests/mod.rs b/substrate/frame/balances/src/tests/mod.rs
index bf49ad9f0a1..ceb8e8134f0 100644
--- a/substrate/frame/balances/src/tests/mod.rs
+++ b/substrate/frame/balances/src/tests/mod.rs
@@ -19,7 +19,10 @@
 
 #![cfg(test)]
 
-use crate::{self as pallet_balances, AccountData, Config, CreditOf, Error, Pallet, TotalIssuance};
+use crate::{
+	self as pallet_balances, AccountData, Config, CreditOf, Error, Pallet, TotalIssuance,
+	DEFAULT_ADDRESS_URI,
+};
 use codec::{Decode, Encode, MaxEncodedLen};
 use frame_support::{
 	assert_err, assert_noop, assert_ok, assert_storage_noop, derive_impl,
@@ -34,7 +37,7 @@ use frame_support::{
 use frame_system::{self as system, RawOrigin};
 use pallet_transaction_payment::{ChargeTransactionPayment, FungibleAdapter, Multiplier};
 use scale_info::TypeInfo;
-use sp_core::hexdisplay::HexDisplay;
+use sp_core::{hexdisplay::HexDisplay, sr25519::Pair as SrPair, Pair};
 use sp_io;
 use sp_runtime::{
 	traits::{BadOrigin, Zero},
@@ -169,6 +172,11 @@ impl ExtBuilder {
 			} else {
 				vec![]
 			},
+			dev_accounts: Some((
+				1000,
+				self.existential_deposit,
+				Some(DEFAULT_ADDRESS_URI.to_string()),
+			)),
 		}
 		.assimilate_storage(&mut t)
 		.unwrap();
@@ -281,7 +289,32 @@ pub fn info_from_weight(w: Weight) -> DispatchInfo {
 pub fn ensure_ti_valid() {
 	let mut sum = 0;
 
+	// Fetch the dev accounts from Account Storage.
+	let dev_accounts = (1000, EXISTENTIAL_DEPOSIT, DEFAULT_ADDRESS_URI.to_string());
+	let (num_accounts, _balance, ref derivation) = dev_accounts;
+
+	// Generate the dev account public keys.
+	let dev_account_ids: Vec<_> = (0..num_accounts)
+		.map(|index| {
+			let derivation_string = derivation.replace("{}", &index.to_string());
+			let pair: SrPair =
+				Pair::from_string(&derivation_string, None).expect("Invalid derivation string");
+			<crate::tests::Test as frame_system::Config>::AccountId::decode(
+				&mut &pair.public().encode()[..],
+			)
+			.unwrap()
+		})
+		.collect();
+
+	// Iterate over all account keys (i.e., the account IDs).
 	for acc in frame_system::Account::<Test>::iter_keys() {
+		// Skip dev accounts by checking if the account is in the dev_account_ids list.
+		// This also proves dev_accounts exists in storage.
+		if dev_account_ids.contains(&acc) {
+			continue;
+		}
+
+		// Check if we are using the system pallet or some other custom storage for accounts.
 		if UseSystem::get() {
 			let data = frame_system::Pallet::<Test>::account(acc);
 			sum += data.data.total();
@@ -291,7 +324,8 @@ pub fn ensure_ti_valid() {
 		}
 	}
 
-	assert_eq!(TotalIssuance::<Test>::get(), sum, "Total Issuance wrong");
+	// Ensure the total issuance matches the sum of the account balances
+	assert_eq!(TotalIssuance::<Test>::get(), sum, "Total Issuance is incorrect");
 }
 
 #[test]
diff --git a/substrate/frame/beefy/src/mock.rs b/substrate/frame/beefy/src/mock.rs
index 4b5f1d103b5..fc731e3bc50 100644
--- a/substrate/frame/beefy/src/mock.rs
+++ b/substrate/frame/beefy/src/mock.rs
@@ -282,7 +282,7 @@ impl ExtBuilder {
 		let balances: Vec<_> =
 			(0..self.authorities.len()).map(|i| (i as u64, 10_000_000)).collect();
 
-		pallet_balances::GenesisConfig::<Test> { balances }
+		pallet_balances::GenesisConfig::<Test> { balances, ..Default::default() }
 			.assimilate_storage(&mut t)
 			.unwrap();
 
diff --git a/substrate/frame/bounties/src/tests.rs b/substrate/frame/bounties/src/tests.rs
index 447d0edb412..c9f6c1319ed 100644
--- a/substrate/frame/bounties/src/tests.rs
+++ b/substrate/frame/bounties/src/tests.rs
@@ -187,7 +187,10 @@ impl ExtBuilder {
 	pub fn build(self) -> sp_io::TestExternalities {
 		let mut ext: sp_io::TestExternalities = RuntimeGenesisConfig {
 			system: frame_system::GenesisConfig::default(),
-			balances: pallet_balances::GenesisConfig { balances: vec![(0, 100), (1, 98), (2, 1)] },
+			balances: pallet_balances::GenesisConfig {
+				balances: vec![(0, 100), (1, 98), (2, 1)],
+				..Default::default()
+			},
 			treasury: Default::default(),
 			treasury_1: Default::default(),
 		}
@@ -338,9 +341,12 @@ fn treasury_account_doesnt_get_deleted() {
 #[allow(deprecated)]
 fn inexistent_account_works() {
 	let mut t = frame_system::GenesisConfig::<Test>::default().build_storage().unwrap();
-	pallet_balances::GenesisConfig::<Test> { balances: vec![(0, 100), (1, 99), (2, 1)] }
-		.assimilate_storage(&mut t)
-		.unwrap();
+	pallet_balances::GenesisConfig::<Test> {
+		balances: vec![(0, 100), (1, 99), (2, 1)],
+		..Default::default()
+	}
+	.assimilate_storage(&mut t)
+	.unwrap();
 	// Treasury genesis config is not build thus treasury account does not exist
 	let mut t: sp_io::TestExternalities = t.into();
 
@@ -977,6 +983,7 @@ fn genesis_funding_works() {
 	pallet_balances::GenesisConfig::<Test> {
 		// Total issuance will be 200 with treasury account initialized with 100.
 		balances: vec![(0, 100), (Treasury::account_id(), initial_funding)],
+		..Default::default()
 	}
 	.assimilate_storage(&mut t)
 	.unwrap();
diff --git a/substrate/frame/child-bounties/src/tests.rs b/substrate/frame/child-bounties/src/tests.rs
index 939983054f6..50c8adb453e 100644
--- a/substrate/frame/child-bounties/src/tests.rs
+++ b/substrate/frame/child-bounties/src/tests.rs
@@ -148,6 +148,7 @@ pub fn new_test_ext() -> sp_io::TestExternalities {
 	pallet_balances::GenesisConfig::<Test> {
 		// Total issuance will be 200 with treasury account initialized at ED.
 		balances: vec![(account_id(0), 100), (account_id(1), 98), (account_id(2), 1)],
+		..Default::default()
 	}
 	.assimilate_storage(&mut t)
 	.unwrap();
diff --git a/substrate/frame/collective/src/tests.rs b/substrate/frame/collective/src/tests.rs
index c4ed17821ae..300d5ad3772 100644
--- a/substrate/frame/collective/src/tests.rs
+++ b/substrate/frame/collective/src/tests.rs
@@ -203,7 +203,10 @@ impl ExtBuilder {
 		let mut ext: sp_io::TestExternalities = RuntimeGenesisConfig {
 			system: frame_system::GenesisConfig::default(),
 			// balances: pallet_balances::GenesisConfig::default(),
-			balances: pallet_balances::GenesisConfig { balances: vec![(1, 100), (2, 200)] },
+			balances: pallet_balances::GenesisConfig {
+				balances: vec![(1, 100), (2, 200)],
+				..Default::default()
+			},
 			collective: pallet_collective::GenesisConfig {
 				members: self.collective_members,
 				phantom: Default::default(),
diff --git a/substrate/frame/contracts/mock-network/src/lib.rs b/substrate/frame/contracts/mock-network/src/lib.rs
index cb9e22439b7..c918cd39ed9 100644
--- a/substrate/frame/contracts/mock-network/src/lib.rs
+++ b/substrate/frame/contracts/mock-network/src/lib.rs
@@ -99,6 +99,7 @@ pub fn para_ext(para_id: u32) -> sp_io::TestExternalities {
 			(relay_sovereign_account_id(), INITIAL_BALANCE),
 			(BOB, INITIAL_BALANCE),
 		],
+		..Default::default()
 	}
 	.assimilate_storage(&mut t)
 	.unwrap();
@@ -137,6 +138,7 @@ pub fn relay_ext() -> sp_io::TestExternalities {
 			(parachain_sovereign_account_id(1), INITIAL_BALANCE),
 			(parachain_account_sovereign_account_id(1, ALICE), INITIAL_BALANCE),
 		],
+		..Default::default()
 	}
 	.assimilate_storage(&mut t)
 	.unwrap();
diff --git a/substrate/frame/contracts/src/tests.rs b/substrate/frame/contracts/src/tests.rs
index b01d0aa4fa4..9bba55f82b4 100644
--- a/substrate/frame/contracts/src/tests.rs
+++ b/substrate/frame/contracts/src/tests.rs
@@ -553,7 +553,7 @@ impl ExtBuilder {
 		sp_tracing::try_init_simple();
 		self.set_associated_consts();
 		let mut t = frame_system::GenesisConfig::<Test>::default().build_storage().unwrap();
-		pallet_balances::GenesisConfig::<Test> { balances: vec![] }
+		pallet_balances::GenesisConfig::<Test> { balances: vec![], ..Default::default() }
 			.assimilate_storage(&mut t)
 			.unwrap();
 		let mut ext = sp_io::TestExternalities::new(t);
diff --git a/substrate/frame/conviction-voting/src/tests.rs b/substrate/frame/conviction-voting/src/tests.rs
index dd9ee33ee18..b1b1fab5ae5 100644
--- a/substrate/frame/conviction-voting/src/tests.rs
+++ b/substrate/frame/conviction-voting/src/tests.rs
@@ -160,6 +160,7 @@ pub fn new_test_ext() -> sp_io::TestExternalities {
 	let mut t = frame_system::GenesisConfig::<Test>::default().build_storage().unwrap();
 	pallet_balances::GenesisConfig::<Test> {
 		balances: vec![(1, 10), (2, 20), (3, 30), (4, 40), (5, 50), (6, 60)],
+		..Default::default()
 	}
 	.assimilate_storage(&mut t)
 	.unwrap();
diff --git a/substrate/frame/delegated-staking/src/mock.rs b/substrate/frame/delegated-staking/src/mock.rs
index 875279864f7..a4546e57dab 100644
--- a/substrate/frame/delegated-staking/src/mock.rs
+++ b/substrate/frame/delegated-staking/src/mock.rs
@@ -189,6 +189,7 @@ impl ExtBuilder {
 				(GENESIS_NOMINATOR_ONE, 1000),
 				(GENESIS_NOMINATOR_TWO, 2000),
 			],
+			..Default::default()
 		}
 		.assimilate_storage(&mut storage);
 
diff --git a/substrate/frame/democracy/src/tests.rs b/substrate/frame/democracy/src/tests.rs
index 10e5ee75611..77774480068 100644
--- a/substrate/frame/democracy/src/tests.rs
+++ b/substrate/frame/democracy/src/tests.rs
@@ -169,6 +169,7 @@ pub fn new_test_ext() -> sp_io::TestExternalities {
 	let mut t = frame_system::GenesisConfig::<Test>::default().build_storage().unwrap();
 	pallet_balances::GenesisConfig::<Test> {
 		balances: vec![(1, 10), (2, 20), (3, 30), (4, 40), (5, 50), (6, 60)],
+		..Default::default()
 	}
 	.assimilate_storage(&mut t)
 	.unwrap();
diff --git a/substrate/frame/election-provider-multi-phase/src/mock.rs b/substrate/frame/election-provider-multi-phase/src/mock.rs
index 2e5ac252720..d0797e100fc 100644
--- a/substrate/frame/election-provider-multi-phase/src/mock.rs
+++ b/substrate/frame/election-provider-multi-phase/src/mock.rs
@@ -600,6 +600,7 @@ impl ExtBuilder {
 				(999, 100),
 				(9999, 100),
 			],
+			..Default::default()
 		}
 		.assimilate_storage(&mut storage);
 
diff --git a/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/mock.rs b/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/mock.rs
index bcb25f8287b..3a649643618 100644
--- a/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/mock.rs
+++ b/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/mock.rs
@@ -567,6 +567,7 @@ impl ExtBuilder {
 
 		let _ = pallet_balances::GenesisConfig::<Runtime> {
 			balances: self.balances_builder.balances.clone(),
+			..Default::default()
 		}
 		.assimilate_storage(&mut storage);
 
diff --git a/substrate/frame/elections-phragmen/src/lib.rs b/substrate/frame/elections-phragmen/src/lib.rs
index fa1c48ee65e..4a40d44e407 100644
--- a/substrate/frame/elections-phragmen/src/lib.rs
+++ b/substrate/frame/elections-phragmen/src/lib.rs
@@ -1476,6 +1476,7 @@ mod tests {
 						(5, 50 * self.balance_factor),
 						(6, 60 * self.balance_factor),
 					],
+					..Default::default()
 				},
 				elections: elections_phragmen::GenesisConfig::<Test> {
 					members: self.genesis_members,
diff --git a/substrate/frame/executive/src/tests.rs b/substrate/frame/executive/src/tests.rs
index 882d875f3d8..dd12a85a111 100644
--- a/substrate/frame/executive/src/tests.rs
+++ b/substrate/frame/executive/src/tests.rs
@@ -576,7 +576,7 @@ fn call_transfer(dest: u64, value: u64) -> RuntimeCall {
 #[test]
 fn balance_transfer_dispatch_works() {
 	let mut t = frame_system::GenesisConfig::<Runtime>::default().build_storage().unwrap();
-	pallet_balances::GenesisConfig::<Runtime> { balances: vec![(1, 211)] }
+	pallet_balances::GenesisConfig::<Runtime> { balances: vec![(1, 211)], ..Default::default() }
 		.assimilate_storage(&mut t)
 		.unwrap();
 	let xt = UncheckedXt::new_signed(call_transfer(2, 69), 1, 1.into(), tx_ext(0, 0));
@@ -598,9 +598,12 @@ fn balance_transfer_dispatch_works() {
 
 fn new_test_ext(balance_factor: Balance) -> sp_io::TestExternalities {
 	let mut t = frame_system::GenesisConfig::<Runtime>::default().build_storage().unwrap();
-	pallet_balances::GenesisConfig::<Runtime> { balances: vec![(1, 111 * balance_factor)] }
-		.assimilate_storage(&mut t)
-		.unwrap();
+	pallet_balances::GenesisConfig::<Runtime> {
+		balances: vec![(1, 111 * balance_factor)],
+		..Default::default()
+	}
+	.assimilate_storage(&mut t)
+	.unwrap();
 	let mut ext: sp_io::TestExternalities = t.into();
 	ext.execute_with(|| {
 		SystemCallbacksCalled::set(0);
@@ -610,9 +613,12 @@ fn new_test_ext(balance_factor: Balance) -> sp_io::TestExternalities {
 
 fn new_test_ext_v0(balance_factor: Balance) -> sp_io::TestExternalities {
 	let mut t = frame_system::GenesisConfig::<Runtime>::default().build_storage().unwrap();
-	pallet_balances::GenesisConfig::<Runtime> { balances: vec![(1, 111 * balance_factor)] }
-		.assimilate_storage(&mut t)
-		.unwrap();
+	pallet_balances::GenesisConfig::<Runtime> {
+		balances: vec![(1, 111 * balance_factor)],
+		..Default::default()
+	}
+	.assimilate_storage(&mut t)
+	.unwrap();
 	(t, sp_runtime::StateVersion::V0).into()
 }
 
diff --git a/substrate/frame/fast-unstake/src/mock.rs b/substrate/frame/fast-unstake/src/mock.rs
index cf4f5f49240..67f7ee21e61 100644
--- a/substrate/frame/fast-unstake/src/mock.rs
+++ b/substrate/frame/fast-unstake/src/mock.rs
@@ -228,6 +228,7 @@ impl ExtBuilder {
 				.chain(validators_range.clone().map(|x| (x, 7 + 1 + 100)))
 				.chain(nominators_range.clone().map(|x| (x, 7 + 1 + 100)))
 				.collect::<Vec<_>>(),
+			..Default::default()
 		}
 		.assimilate_storage(&mut storage);
 
diff --git a/substrate/frame/grandpa/src/mock.rs b/substrate/frame/grandpa/src/mock.rs
index 0a85d9ffd2b..cb754fb7955 100644
--- a/substrate/frame/grandpa/src/mock.rs
+++ b/substrate/frame/grandpa/src/mock.rs
@@ -226,7 +226,7 @@ pub fn new_test_ext_raw_authorities(authorities: AuthorityList) -> sp_io::TestEx
 
 	let balances: Vec<_> = (0..authorities.len()).map(|i| (i as u64, 10_000_000)).collect();
 
-	pallet_balances::GenesisConfig::<Test> { balances }
+	pallet_balances::GenesisConfig::<Test> { balances, ..Default::default() }
 		.assimilate_storage(&mut t)
 		.unwrap();
 
diff --git a/substrate/frame/identity/src/tests.rs b/substrate/frame/identity/src/tests.rs
index 01bc312723a..c4c02a2834a 100644
--- a/substrate/frame/identity/src/tests.rs
+++ b/substrate/frame/identity/src/tests.rs
@@ -105,6 +105,7 @@ pub fn new_test_ext() -> sp_io::TestExternalities {
 			(account(20), 1000),
 			(account(30), 1000),
 		],
+		..Default::default()
 	}
 	.assimilate_storage(&mut t)
 	.unwrap();
diff --git a/substrate/frame/indices/src/mock.rs b/substrate/frame/indices/src/mock.rs
index 72bbc6dab4a..80d0a88881f 100644
--- a/substrate/frame/indices/src/mock.rs
+++ b/substrate/frame/indices/src/mock.rs
@@ -59,6 +59,7 @@ pub fn new_test_ext() -> sp_io::TestExternalities {
 	let mut t = frame_system::GenesisConfig::<Test>::default().build_storage().unwrap();
 	pallet_balances::GenesisConfig::<Test> {
 		balances: vec![(1, 10), (2, 20), (3, 30), (4, 40), (5, 50), (6, 60)],
+		..Default::default()
 	}
 	.assimilate_storage(&mut t)
 	.unwrap();
diff --git a/substrate/frame/lottery/src/mock.rs b/substrate/frame/lottery/src/mock.rs
index b771ed0849f..ea3f69b6cfc 100644
--- a/substrate/frame/lottery/src/mock.rs
+++ b/substrate/frame/lottery/src/mock.rs
@@ -75,6 +75,7 @@ pub fn new_test_ext() -> sp_io::TestExternalities {
 	let mut t = frame_system::GenesisConfig::<Test>::default().build_storage().unwrap();
 	pallet_balances::GenesisConfig::<Test> {
 		balances: vec![(1, 100), (2, 100), (3, 100), (4, 100), (5, 100)],
+		..Default::default()
 	}
 	.assimilate_storage(&mut t)
 	.unwrap();
diff --git a/substrate/frame/multisig/src/tests.rs b/substrate/frame/multisig/src/tests.rs
index 4065ce73f90..8a389314256 100644
--- a/substrate/frame/multisig/src/tests.rs
+++ b/substrate/frame/multisig/src/tests.rs
@@ -75,6 +75,7 @@ pub fn new_test_ext() -> TestState {
 	let mut t = frame_system::GenesisConfig::<Test>::default().build_storage().unwrap();
 	pallet_balances::GenesisConfig::<Test> {
 		balances: vec![(1, 10), (2, 10), (3, 10), (4, 10), (5, 2)],
+		..Default::default()
 	}
 	.assimilate_storage(&mut t)
 	.unwrap();
diff --git a/substrate/frame/nis/src/mock.rs b/substrate/frame/nis/src/mock.rs
index 08e69ef0de0..82b9f55b919 100644
--- a/substrate/frame/nis/src/mock.rs
+++ b/substrate/frame/nis/src/mock.rs
@@ -133,6 +133,7 @@ pub fn new_test_ext() -> sp_io::TestExternalities {
 	let mut t = frame_system::GenesisConfig::<Test>::default().build_storage().unwrap();
 	pallet_balances::GenesisConfig::<Test, Instance1> {
 		balances: vec![(1, 100), (2, 100), (3, 100), (4, 100)],
+		..Default::default()
 	}
 	.assimilate_storage(&mut t)
 	.unwrap();
diff --git a/substrate/frame/nomination-pools/test-delegate-stake/src/mock.rs b/substrate/frame/nomination-pools/test-delegate-stake/src/mock.rs
index d943ba6f533..7aa8019b9c4 100644
--- a/substrate/frame/nomination-pools/test-delegate-stake/src/mock.rs
+++ b/substrate/frame/nomination-pools/test-delegate-stake/src/mock.rs
@@ -314,6 +314,7 @@ pub fn new_test_ext() -> sp_io::TestExternalities {
 
 	let _ = pallet_balances::GenesisConfig::<Runtime> {
 		balances: vec![(10, 100), (20, 100), (21, 100), (22, 100)],
+		..Default::default()
 	}
 	.assimilate_storage(&mut storage)
 	.unwrap();
diff --git a/substrate/frame/preimage/src/mock.rs b/substrate/frame/preimage/src/mock.rs
index 9c72d09cae1..dec590c6a19 100644
--- a/substrate/frame/preimage/src/mock.rs
+++ b/substrate/frame/preimage/src/mock.rs
@@ -81,6 +81,7 @@ pub fn new_test_ext() -> sp_io::TestExternalities {
 	let mut t = frame_system::GenesisConfig::<Test>::default().build_storage().unwrap();
 	let balances = pallet_balances::GenesisConfig::<Test> {
 		balances: vec![(1, 100), (2, 100), (3, 100), (4, 100), (5, 100)],
+		..Default::default()
 	};
 	balances.assimilate_storage(&mut t).unwrap();
 	t.into()
diff --git a/substrate/frame/proxy/src/tests.rs b/substrate/frame/proxy/src/tests.rs
index afc668188e6..14389b03ac7 100644
--- a/substrate/frame/proxy/src/tests.rs
+++ b/substrate/frame/proxy/src/tests.rs
@@ -133,6 +133,7 @@ pub fn new_test_ext() -> TestState {
 	let mut t = frame_system::GenesisConfig::<Test>::default().build_storage().unwrap();
 	pallet_balances::GenesisConfig::<Test> {
 		balances: vec![(1, 10), (2, 10), (3, 10), (4, 10), (5, 3)],
+		..Default::default()
 	}
 	.assimilate_storage(&mut t)
 	.unwrap();
diff --git a/substrate/frame/recovery/src/mock.rs b/substrate/frame/recovery/src/mock.rs
index 86f13b0da4f..446d507a414 100644
--- a/substrate/frame/recovery/src/mock.rs
+++ b/substrate/frame/recovery/src/mock.rs
@@ -78,6 +78,7 @@ pub fn new_test_ext() -> sp_io::TestExternalities {
 	let mut t = frame_system::GenesisConfig::<Test>::default().build_storage().unwrap();
 	pallet_balances::GenesisConfig::<Test> {
 		balances: vec![(1, 100), (2, 100), (3, 100), (4, 100), (5, 100)],
+		..Default::default()
 	}
 	.assimilate_storage(&mut t)
 	.unwrap();
diff --git a/substrate/frame/referenda/src/mock.rs b/substrate/frame/referenda/src/mock.rs
index c96a50af865..5d36ce137d4 100644
--- a/substrate/frame/referenda/src/mock.rs
+++ b/substrate/frame/referenda/src/mock.rs
@@ -219,7 +219,7 @@ impl ExtBuilder {
 	pub fn build(self) -> sp_io::TestExternalities {
 		let mut t = frame_system::GenesisConfig::<Test>::default().build_storage().unwrap();
 		let balances = vec![(1, 100), (2, 100), (3, 100), (4, 100), (5, 100), (6, 100)];
-		pallet_balances::GenesisConfig::<Test> { balances }
+		pallet_balances::GenesisConfig::<Test> { balances, ..Default::default() }
 			.assimilate_storage(&mut t)
 			.unwrap();
 		let mut ext = sp_io::TestExternalities::new(t);
diff --git a/substrate/frame/revive/mock-network/src/lib.rs b/substrate/frame/revive/mock-network/src/lib.rs
index adfd0016b4d..b8c9bc13aa7 100644
--- a/substrate/frame/revive/mock-network/src/lib.rs
+++ b/substrate/frame/revive/mock-network/src/lib.rs
@@ -99,6 +99,7 @@ pub fn para_ext(para_id: u32) -> sp_io::TestExternalities {
 			(relay_sovereign_account_id(), INITIAL_BALANCE),
 			(BOB, INITIAL_BALANCE),
 		],
+		..Default::default()
 	}
 	.assimilate_storage(&mut t)
 	.unwrap();
@@ -137,6 +138,7 @@ pub fn relay_ext() -> sp_io::TestExternalities {
 			(parachain_sovereign_account_id(1), INITIAL_BALANCE),
 			(parachain_account_sovereign_account_id(1, ALICE), INITIAL_BALANCE),
 		],
+		..Default::default()
 	}
 	.assimilate_storage(&mut t)
 	.unwrap();
diff --git a/substrate/frame/revive/src/tests.rs b/substrate/frame/revive/src/tests.rs
index 90b9f053a03..d8b60e38da5 100644
--- a/substrate/frame/revive/src/tests.rs
+++ b/substrate/frame/revive/src/tests.rs
@@ -566,7 +566,7 @@ impl ExtBuilder {
 		sp_tracing::try_init_simple();
 		self.set_associated_consts();
 		let mut t = frame_system::GenesisConfig::<Test>::default().build_storage().unwrap();
-		pallet_balances::GenesisConfig::<Test> { balances: vec![] }
+		pallet_balances::GenesisConfig::<Test> { balances: vec![], ..Default::default() }
 			.assimilate_storage(&mut t)
 			.unwrap();
 		let mut ext = sp_io::TestExternalities::new(t);
diff --git a/substrate/frame/root-offences/src/mock.rs b/substrate/frame/root-offences/src/mock.rs
index 3f14dc00b56..9b319cabb09 100644
--- a/substrate/frame/root-offences/src/mock.rs
+++ b/substrate/frame/root-offences/src/mock.rs
@@ -212,6 +212,7 @@ impl ExtBuilder {
 				(31, self.balance_factor * 1000),
 				(41, self.balance_factor * 2000),
 			],
+			..Default::default()
 		}
 		.assimilate_storage(&mut storage)
 		.unwrap();
diff --git a/substrate/frame/safe-mode/src/mock.rs b/substrate/frame/safe-mode/src/mock.rs
index aaf3456272f..2980f86abc2 100644
--- a/substrate/frame/safe-mode/src/mock.rs
+++ b/substrate/frame/safe-mode/src/mock.rs
@@ -233,6 +233,7 @@ pub fn new_test_ext() -> sp_io::TestExternalities {
 	pallet_balances::GenesisConfig::<Test> {
 		// The 0 account is NOT a special origin, the rest may be.
 		balances: vec![(0, BAL_ACC0), (1, BAL_ACC1), (2, 5678), (3, 5678), (4, 5678)],
+		..Default::default()
 	}
 	.assimilate_storage(&mut t)
 	.unwrap();
diff --git a/substrate/frame/scored-pool/src/mock.rs b/substrate/frame/scored-pool/src/mock.rs
index 7708c06e56b..5eb9df52892 100644
--- a/substrate/frame/scored-pool/src/mock.rs
+++ b/substrate/frame/scored-pool/src/mock.rs
@@ -109,7 +109,7 @@ pub fn new_test_ext() -> sp_io::TestExternalities {
 	balances.push((40, 500_000));
 	balances.push((99, 1));
 
-	pallet_balances::GenesisConfig::<Test> { balances }
+	pallet_balances::GenesisConfig::<Test> { balances, ..Default::default() }
 		.assimilate_storage(&mut t)
 		.unwrap();
 	pallet_scored_pool::GenesisConfig::<Test> {
diff --git a/substrate/frame/society/src/mock.rs b/substrate/frame/society/src/mock.rs
index 8cb5dc82375..63fc5059279 100644
--- a/substrate/frame/society/src/mock.rs
+++ b/substrate/frame/society/src/mock.rs
@@ -115,7 +115,7 @@ impl EnvBuilder {
 	pub fn execute<R, F: FnOnce() -> R>(mut self, f: F) -> R {
 		let mut t = frame_system::GenesisConfig::<Test>::default().build_storage().unwrap();
 		self.balances.push((Society::account_id(), self.balance.max(self.pot)));
-		pallet_balances::GenesisConfig::<Test> { balances: self.balances }
+		pallet_balances::GenesisConfig::<Test> { balances: self.balances, ..Default::default() }
 			.assimilate_storage(&mut t)
 			.unwrap();
 		pallet_society::GenesisConfig::<Test> { pot: self.pot }
diff --git a/substrate/frame/staking/src/mock.rs b/substrate/frame/staking/src/mock.rs
index 6346949576f..41fb3a31d52 100644
--- a/substrate/frame/staking/src/mock.rs
+++ b/substrate/frame/staking/src/mock.rs
@@ -471,6 +471,7 @@ impl ExtBuilder {
 				// This allows us to have a total_payout different from 0.
 				(999, 1_000_000_000_000),
 			],
+			..Default::default()
 		}
 		.assimilate_storage(&mut storage);
 
diff --git a/substrate/frame/state-trie-migration/src/lib.rs b/substrate/frame/state-trie-migration/src/lib.rs
index 1dc1a3928f2..6e475b7067e 100644
--- a/substrate/frame/state-trie-migration/src/lib.rs
+++ b/substrate/frame/state-trie-migration/src/lib.rs
@@ -1297,9 +1297,12 @@ mod mock {
 			frame_system::GenesisConfig::<Test>::default()
 				.assimilate_storage(&mut custom_storage)
 				.unwrap();
-			pallet_balances::GenesisConfig::<Test> { balances: vec![(1, 1000)] }
-				.assimilate_storage(&mut custom_storage)
-				.unwrap();
+			pallet_balances::GenesisConfig::<Test> {
+				balances: vec![(1, 1000)],
+				..Default::default()
+			}
+			.assimilate_storage(&mut custom_storage)
+			.unwrap();
 		}
 
 		sp_tracing::try_init_simple();
diff --git a/substrate/frame/statement/src/mock.rs b/substrate/frame/statement/src/mock.rs
index 34afd332c08..db9d19dbbab 100644
--- a/substrate/frame/statement/src/mock.rs
+++ b/substrate/frame/statement/src/mock.rs
@@ -82,6 +82,7 @@ pub fn new_test_ext() -> sp_io::TestExternalities {
 				500000,
 			),
 		],
+		..Default::default()
 	};
 	balances.assimilate_storage(&mut t).unwrap();
 	t.into()
diff --git a/substrate/frame/tips/src/tests.rs b/substrate/frame/tips/src/tests.rs
index 530efb708e4..b769ea5b3e7 100644
--- a/substrate/frame/tips/src/tests.rs
+++ b/substrate/frame/tips/src/tests.rs
@@ -180,7 +180,10 @@ impl Config<Instance1> for Test {
 pub fn new_test_ext() -> sp_io::TestExternalities {
 	let mut ext: sp_io::TestExternalities = RuntimeGenesisConfig {
 		system: frame_system::GenesisConfig::default(),
-		balances: pallet_balances::GenesisConfig { balances: vec![(0, 100), (1, 98), (2, 1)] },
+		balances: pallet_balances::GenesisConfig {
+			balances: vec![(0, 100), (1, 98), (2, 1)],
+			..Default::default()
+		},
 		treasury: Default::default(),
 		treasury_1: Default::default(),
 	}
@@ -583,6 +586,7 @@ fn genesis_funding_works() {
 	pallet_balances::GenesisConfig::<Test> {
 		// Total issuance will be 200 with treasury account initialized with 100.
 		balances: vec![(0, 100), (Treasury::account_id(), initial_funding)],
+		..Default::default()
 	}
 	.assimilate_storage(&mut t)
 	.unwrap();
diff --git a/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/tests.rs b/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/tests.rs
index 6ce4652fd42..76d46aa1647 100644
--- a/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/tests.rs
+++ b/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/tests.rs
@@ -86,6 +86,7 @@ impl ExtBuilder {
 			} else {
 				vec![]
 			},
+			..Default::default()
 		}
 		.assimilate_storage(&mut t)
 		.unwrap();
diff --git a/substrate/frame/transaction-payment/asset-tx-payment/src/tests.rs b/substrate/frame/transaction-payment/asset-tx-payment/src/tests.rs
index 6de2e8e7da5..2aa5d8ec7be 100644
--- a/substrate/frame/transaction-payment/asset-tx-payment/src/tests.rs
+++ b/substrate/frame/transaction-payment/asset-tx-payment/src/tests.rs
@@ -81,6 +81,7 @@ impl ExtBuilder {
 			} else {
 				vec![]
 			},
+			..Default::default()
 		}
 		.assimilate_storage(&mut t)
 		.unwrap();
diff --git a/substrate/frame/transaction-payment/src/tests.rs b/substrate/frame/transaction-payment/src/tests.rs
index bde1bf64728..8349df30667 100644
--- a/substrate/frame/transaction-payment/src/tests.rs
+++ b/substrate/frame/transaction-payment/src/tests.rs
@@ -99,6 +99,7 @@ impl ExtBuilder {
 			} else {
 				vec![]
 			},
+			..Default::default()
 		}
 		.assimilate_storage(&mut t)
 		.unwrap();
diff --git a/substrate/frame/transaction-storage/src/mock.rs b/substrate/frame/transaction-storage/src/mock.rs
index 84a77043d57..25f44b953bf 100644
--- a/substrate/frame/transaction-storage/src/mock.rs
+++ b/substrate/frame/transaction-storage/src/mock.rs
@@ -65,6 +65,7 @@ pub fn new_test_ext() -> sp_io::TestExternalities {
 		system: Default::default(),
 		balances: pallet_balances::GenesisConfig::<Test> {
 			balances: vec![(1, 1000000000), (2, 100), (3, 100), (4, 100)],
+			..Default::default()
 		},
 		transaction_storage: pallet_transaction_storage::GenesisConfig::<Test> {
 			storage_period: 10,
diff --git a/substrate/frame/treasury/src/tests.rs b/substrate/frame/treasury/src/tests.rs
index e9efb7c0956..2c2ceac5862 100644
--- a/substrate/frame/treasury/src/tests.rs
+++ b/substrate/frame/treasury/src/tests.rs
@@ -221,6 +221,7 @@ impl ExtBuilder {
 		pallet_balances::GenesisConfig::<Test> {
 			// Total issuance will be 200 with treasury account initialized at ED.
 			balances: vec![(0, 100), (1, 98), (2, 1)],
+			..Default::default()
 		}
 		.assimilate_storage(&mut t)
 		.unwrap();
@@ -406,9 +407,12 @@ fn treasury_account_doesnt_get_deleted() {
 #[test]
 fn inexistent_account_works() {
 	let mut t = frame_system::GenesisConfig::<Test>::default().build_storage().unwrap();
-	pallet_balances::GenesisConfig::<Test> { balances: vec![(0, 100), (1, 99), (2, 1)] }
-		.assimilate_storage(&mut t)
-		.unwrap();
+	pallet_balances::GenesisConfig::<Test> {
+		balances: vec![(0, 100), (1, 99), (2, 1)],
+		..Default::default()
+	}
+	.assimilate_storage(&mut t)
+	.unwrap();
 	// Treasury genesis config is not build thus treasury account does not exist
 	let mut t: sp_io::TestExternalities = t.into();
 
@@ -445,6 +449,7 @@ fn genesis_funding_works() {
 	pallet_balances::GenesisConfig::<Test> {
 		// Total issuance will be 200 with treasury account initialized with 100.
 		balances: vec![(0, 100), (Treasury::account_id(), initial_funding)],
+		..Default::default()
 	}
 	.assimilate_storage(&mut t)
 	.unwrap();
diff --git a/substrate/frame/tx-pause/src/mock.rs b/substrate/frame/tx-pause/src/mock.rs
index fd9b3b552cc..d543f447ca7 100644
--- a/substrate/frame/tx-pause/src/mock.rs
+++ b/substrate/frame/tx-pause/src/mock.rs
@@ -157,6 +157,7 @@ pub fn new_test_ext() -> sp_io::TestExternalities {
 	pallet_balances::GenesisConfig::<Test> {
 		// The 0 account is NOT a special origin. The rest may be:
 		balances: vec![(0, 1234), (1, 5678), (2, 5678), (3, 5678), (4, 5678)],
+		..Default::default()
 	}
 	.assimilate_storage(&mut t)
 	.unwrap();
diff --git a/substrate/frame/utility/src/tests.rs b/substrate/frame/utility/src/tests.rs
index 274a90d77cf..d075ec1ff82 100644
--- a/substrate/frame/utility/src/tests.rs
+++ b/substrate/frame/utility/src/tests.rs
@@ -237,6 +237,7 @@ pub fn new_test_ext() -> sp_io::TestExternalities {
 	let mut t = frame_system::GenesisConfig::<Test>::default().build_storage().unwrap();
 	pallet_balances::GenesisConfig::<Test> {
 		balances: vec![(1, 10), (2, 10), (3, 10), (4, 10), (5, 2)],
+		..Default::default()
 	}
 	.assimilate_storage(&mut t)
 	.unwrap();
diff --git a/substrate/frame/vesting/src/mock.rs b/substrate/frame/vesting/src/mock.rs
index f0954a5b989..8fae9bbf749 100644
--- a/substrate/frame/vesting/src/mock.rs
+++ b/substrate/frame/vesting/src/mock.rs
@@ -94,6 +94,7 @@ impl ExtBuilder {
 				(12, 10 * self.existential_deposit),
 				(13, 9999 * self.existential_deposit),
 			],
+			..Default::default()
 		}
 		.assimilate_storage(&mut t)
 		.unwrap();
diff --git a/substrate/test-utils/runtime/src/genesismap.rs b/substrate/test-utils/runtime/src/genesismap.rs
index 5c0c146d45a..e9a0e4815a2 100644
--- a/substrate/test-utils/runtime/src/genesismap.rs
+++ b/substrate/test-utils/runtime/src/genesismap.rs
@@ -130,7 +130,10 @@ impl GenesisStorageBuilder {
 				authorities: authorities_sr25519.clone(),
 				..Default::default()
 			},
-			balances: pallet_balances::GenesisConfig { balances: self.balances.clone() },
+			balances: pallet_balances::GenesisConfig {
+				balances: self.balances.clone(),
+				..Default::default()
+			},
 		}
 	}
 
diff --git a/substrate/test-utils/runtime/src/lib.rs b/substrate/test-utils/runtime/src/lib.rs
index 4d24354f99a..7c092f28516 100644
--- a/substrate/test-utils/runtime/src/lib.rs
+++ b/substrate/test-utils/runtime/src/lib.rs
@@ -1329,7 +1329,7 @@ mod tests {
 				.expect("default config is there");
 			let json = String::from_utf8(r.into()).expect("returned value is json. qed.");
 
-			let expected = r#"{"system":{},"babe":{"authorities":[],"epochConfig":{"c":[1,4],"allowed_slots":"PrimaryAndSecondaryVRFSlots"}},"substrateTest":{"authorities":[]},"balances":{"balances":[]}}"#;
+			let expected = r#"{"system":{},"babe":{"authorities":[],"epochConfig":{"c":[1,4],"allowed_slots":"PrimaryAndSecondaryVRFSlots"}},"substrateTest":{"authorities":[]},"balances":{"balances":[],"devAccounts":null}}"#;
 			assert_eq!(expected.to_string(), json);
 		}
 
-- 
GitLab