From e80ac7810ed29ba3963608b4ee2cbcd4ba9cfe3b Mon Sep 17 00:00:00 2001 From: Dmitry Lavrenov Date: Thu, 10 Aug 2023 11:25:23 +0300 Subject: [PATCH 1/4] Integrate pallet-balanced-currency-swap-bridges-initializer into humanode-runtime --- Cargo.lock | 1 + crates/humanode-peer/src/chain_spec.rs | 1 + crates/humanode-runtime/Cargo.toml | 3 +++ crates/humanode-runtime/src/lib.rs | 21 +++++++++++++++++-- .../src/tests/claims_and_vesting.rs | 1 + .../src/tests/currency_swap.rs | 15 +++++++++++++ .../src/tests/genesis_config.rs | 3 ++- 7 files changed, 42 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9bb3dc6f1..e37fc73f9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3703,6 +3703,7 @@ dependencies = [ "libsecp256k1", "pallet-authorship", "pallet-babe", + "pallet-balanced-currency-swap-bridges-initializer", "pallet-balances", "pallet-base-fee", "pallet-bioauth", diff --git a/crates/humanode-peer/src/chain_spec.rs b/crates/humanode-peer/src/chain_spec.rs index d6822d6f4..3d5e012a2 100644 --- a/crates/humanode-peer/src/chain_spec.rs +++ b/crates/humanode-peer/src/chain_spec.rs @@ -386,6 +386,7 @@ fn testnet_genesis( )], total_claimable: Some(DEV_ACCOUNT_BALANCE), }, + balanced_currency_swap_bridges_initializer: Default::default(), evm_to_native_swap_bridge: Default::default(), native_to_evm_swap_bridge: Default::default(), } diff --git a/crates/humanode-runtime/Cargo.toml b/crates/humanode-runtime/Cargo.toml index 13cb1eb5b..d82ade692 100644 --- a/crates/humanode-runtime/Cargo.toml +++ b/crates/humanode-runtime/Cargo.toml @@ -16,6 +16,7 @@ eip712-account-claim = { version = "0.1", path = "../eip712-account-claim", defa eip712-common = { version = "0.1", path = "../eip712-common", default-features = false } eip712-token-claim = { version = "0.1", path = "../eip712-token-claim", default-features = false } keystore-bioauth-account-id = { version = "0.1", path = "../keystore-bioauth-account-id", default-features = false } +pallet-balanced-currency-swap-bridges-initializer = { version = "0.1", path = "../pallet-balanced-currency-swap-bridges-initializer", default-features = false } pallet-bioauth = { version = "0.1", path = "../pallet-bioauth", default-features = false } pallet-bootnodes = { version = "0.1", path = "../pallet-bootnodes", default-features = false } pallet-bridge-pot-currency-swap = { version = "0.1", path = "../pallet-bridge-pot-currency-swap", default-features = false } @@ -157,6 +158,7 @@ std = [ "libsecp256k1/std", "pallet-authorship/std", "pallet-babe/std", + "pallet-balanced-currency-swap-bridges-initializer/std", "pallet-balances/std", "pallet-base-fee/std", "pallet-bioauth/std", @@ -225,6 +227,7 @@ try-runtime = [ "frame-try-runtime/try-runtime", "pallet-authorship/try-runtime", "pallet-babe/try-runtime", + "pallet-balanced-currency-swap-bridges-initializer/try-runtime", "pallet-balances/try-runtime", "pallet-base-fee/try-runtime", "pallet-bioauth/try-runtime", diff --git a/crates/humanode-runtime/src/lib.rs b/crates/humanode-runtime/src/lib.rs index ff81f02ca..211a2b372 100644 --- a/crates/humanode-runtime/src/lib.rs +++ b/crates/humanode-runtime/src/lib.rs @@ -814,6 +814,22 @@ impl pallet_bridge_pot_currency_swap::Config for type GenesisVerifier = currency_swap::GenesisVerifier; } +parameter_types! { + pub TreasuryPotAccountId: AccountId = TreasuryPot::account_id(); +} + +impl pallet_balanced_currency_swap_bridges_initializer::Config for Runtime { + type EvmAccountId = EvmAccountId; + type NativeCurrency = Balances; + type EvmCurrency = EvmBalances; + type BalanceConverterEvmToNative = Identity; + type BalanceConverterNativeToEvm = Identity; + type NativeEvmBridgePot = NativeToEvmSwapBridgePotAccountId; + type NativeTreasuryPot = TreasuryPotAccountId; + type EvmNativeBridgePot = EvmToNativeSwapBridgePotAccountId; + type WeightInfo = (); +} + // Create the runtime by composing the FRAME pallets that were previously // configured. construct_runtime!( @@ -859,8 +875,9 @@ construct_runtime!( NativeToEvmSwapBridgePot: pallet_pot:: = 33, EvmToNativeSwapBridgePot: pallet_pot:: = 34, CurrencySwap: pallet_currency_swap = 35, - NativeToEvmSwapBridge: pallet_bridge_pot_currency_swap:: = 36, - EvmToNativeSwapBridge: pallet_bridge_pot_currency_swap:: = 37, + BalancedCurrencySwapBridgesInitializer: pallet_balanced_currency_swap_bridges_initializer = 36, + NativeToEvmSwapBridge: pallet_bridge_pot_currency_swap:: = 37, + EvmToNativeSwapBridge: pallet_bridge_pot_currency_swap:: = 38, } ); diff --git a/crates/humanode-runtime/src/tests/claims_and_vesting.rs b/crates/humanode-runtime/src/tests/claims_and_vesting.rs index df2155b5d..fcdb8136f 100644 --- a/crates/humanode-runtime/src/tests/claims_and_vesting.rs +++ b/crates/humanode-runtime/src/tests/claims_and_vesting.rs @@ -354,6 +354,7 @@ fn prepare_genesis_json(token_claims: &str, token_claim_pot_balance: u128) -> St "evmToNativeSwapBridgePot": {{ "initialState": "Initialized" }}, + "balancedCurrencySwapBridgesInitializer": null, "nativeToEvmSwapBridge": null, "evmToNativeSwapBridge": null }}"# diff --git a/crates/humanode-runtime/src/tests/currency_swap.rs b/crates/humanode-runtime/src/tests/currency_swap.rs index f1fd39de0..9b4f28264 100644 --- a/crates/humanode-runtime/src/tests/currency_swap.rs +++ b/crates/humanode-runtime/src/tests/currency_swap.rs @@ -115,6 +115,19 @@ fn new_test_ext_with() -> sp_io::TestExternalities { storage.into() } +/// This test verifies that bridges initialization has been applied at genesis. +#[test] +fn currencies_are_balanced() { + // Build the state from the config. + new_test_ext_with().execute_with(move || { + assert_eq!( + BalancedCurrencySwapBridgesInitializer::initializer_version(), + pallet_balanced_currency_swap_bridges_initializer::CURRENT_BRIDGES_INITIALIZER_VERSION + ); + assert!(BalancedCurrencySwapBridgesInitializer::is_balanced().unwrap()); + }) +} + /// This test verifies that swap native call works in the happy path. #[test] fn currency_swap_native_call_works() { @@ -136,6 +149,7 @@ fn currency_swap_native_call_works() { )); // Assert state changes. + assert!(BalancedCurrencySwapBridgesInitializer::is_balanced().unwrap()); assert_eq!( Balances::total_balance(&account_id("Alice")), alice_balance_before - swap_balance @@ -204,6 +218,7 @@ fn currency_swap_precompile_call_works() { assert_eq!(execinfo.logs, Vec::new()); // Assert state changes. + assert!(BalancedCurrencySwapBridgesInitializer::is_balanced().unwrap()); assert_eq!( Balances::total_balance(&FeesPot::account_id()), fees_pot_balance_before + expected_fee diff --git a/crates/humanode-runtime/src/tests/genesis_config.rs b/crates/humanode-runtime/src/tests/genesis_config.rs index 93f9e174e..a3d3bdcbf 100644 --- a/crates/humanode-runtime/src/tests/genesis_config.rs +++ b/crates/humanode-runtime/src/tests/genesis_config.rs @@ -118,6 +118,7 @@ fn works() { "evmToNativeSwapBridgePot": { "initialState": "Initialized" }, + "balancedCurrencySwapBridgesInitializer": null, "nativeToEvmSwapBridge": null, "evmToNativeSwapBridge": null }"#; @@ -139,7 +140,7 @@ fn unknown_field() { `feesPot`, `tokenClaimsPot`, `transactionPayment`, `session`, `chainProperties`, \ `ethereumChainId`, `sudo`, `grandpa`, `ethereum`, `evm`, `dynamicFee`, `baseFee`, \ `imOnline`, `evmAccountsMapping`, `tokenClaims`, `nativeToEvmSwapBridgePot`, \ - `evmToNativeSwapBridgePot`, `nativeToEvmSwapBridge`, `evmToNativeSwapBridge` at line 1 column 6" + `evmToNativeSwapBridgePot`, `balancedCurrencySwapBridgesInitializer`, `nativeToEvmSwapBridge`, `evmToNativeSwapBridge` at line 1 column 6" ); } From aa0547b8dfa8de7e8aa0686a63215f5efafff2fb Mon Sep 17 00:00:00 2001 From: Dmitry Lavrenov Date: Thu, 10 Aug 2023 11:43:14 +0300 Subject: [PATCH 2/4] Use bridges initialization logic in tests --- .../src/tests/claims_and_vesting.rs | 10 +++------ .../src/tests/currency_swap.rs | 21 +++++++++---------- crates/humanode-runtime/src/tests/fees.rs | 16 +++++++------- .../src/tests/fixed_supply.rs | 20 ++++++++---------- 4 files changed, 30 insertions(+), 37 deletions(-) diff --git a/crates/humanode-runtime/src/tests/claims_and_vesting.rs b/crates/humanode-runtime/src/tests/claims_and_vesting.rs index fcdb8136f..413beee04 100644 --- a/crates/humanode-runtime/src/tests/claims_and_vesting.rs +++ b/crates/humanode-runtime/src/tests/claims_and_vesting.rs @@ -114,7 +114,6 @@ fn new_test_ext() -> sp_io::TestExternalities { let config = GenesisConfig { balances: BalancesConfig { balances: { - let pot_accounts = pot_accounts.clone(); endowed_accounts .iter() .cloned() @@ -188,12 +187,9 @@ fn new_test_ext() -> sp_io::TestExternalities { vec![( EvmToNativeSwapBridgePot::account_id(), fp_evm::GenesisAccount { - balance: (INIT_BALANCE * (endowed_accounts.len() + pot_accounts.len()) as u128 + - // Own bridge pot minimum balance. - >::minimum_balance() + - // `TokenClaimsPot` minimum balance. - 2 * VESTING_BALANCE + >::minimum_balance() - ) + balance: >::minimum_balance() .into(), code: Default::default(), nonce: Default::default(), diff --git a/crates/humanode-runtime/src/tests/currency_swap.rs b/crates/humanode-runtime/src/tests/currency_swap.rs index 9b4f28264..6f5a1f90d 100644 --- a/crates/humanode-runtime/src/tests/currency_swap.rs +++ b/crates/humanode-runtime/src/tests/currency_swap.rs @@ -23,14 +23,13 @@ fn new_test_ext_with() -> sp_io::TestExternalities { let bootnodes = vec![account_id("Alice")]; let endowed_accounts = vec![account_id("Alice"), account_id("Bob")]; - let pot_accounts = vec![TreasuryPot::account_id(), FeesPot::account_id()]; + let pot_accounts = vec![FeesPot::account_id()]; let evm_endowed_accounts = vec![evm_account_id("EvmAlice"), evm_account_id("EvmBob")]; // Build test genesis. let config = GenesisConfig { balances: BalancesConfig { balances: { - let pot_accounts = pot_accounts.clone(); endowed_accounts .iter() .cloned() @@ -38,14 +37,16 @@ fn new_test_ext_with() -> sp_io::TestExternalities { .map(|k| (k, INIT_BALANCE)) .chain( [( + TreasuryPot::account_id(), + 10 * INIT_BALANCE, + ), + ( TokenClaimsPot::account_id(), >::minimum_balance(), ), ( NativeToEvmSwapBridgePot::account_id(), - INIT_BALANCE * evm_endowed_accounts.len() as u128 + - // Own bridge pot minimum balance. - >::minimum_balance(), + >::minimum_balance(), )] .into_iter(), ) @@ -91,12 +92,10 @@ fn new_test_ext_with() -> sp_io::TestExternalities { [( EvmToNativeSwapBridgePot::account_id(), fp_evm::GenesisAccount { - balance: (INIT_BALANCE * (endowed_accounts.len() + pot_accounts.len()) as u128 + - // Own bridge pot minimum balance. - >::minimum_balance() + - // `TokenClaimsPot` minimum balance. - >::minimum_balance() - ).into(), + balance: >::minimum_balance() + .into(), code: Default::default(), nonce: Default::default(), storage: Default::default(), diff --git a/crates/humanode-runtime/src/tests/fees.rs b/crates/humanode-runtime/src/tests/fees.rs index 2d1d7c88e..3850e5af4 100644 --- a/crates/humanode-runtime/src/tests/fees.rs +++ b/crates/humanode-runtime/src/tests/fees.rs @@ -16,12 +16,11 @@ fn new_test_ext_with() -> sp_io::TestExternalities { let authorities = vec![authority_keys("Alice")]; let bootnodes = vec![account_id("Alice")]; let endowed_accounts = vec![account_id("Alice"), account_id("Bob")]; - let pot_accounts = vec![TreasuryPot::account_id(), FeesPot::account_id()]; + let pot_accounts = vec![FeesPot::account_id()]; // Build test genesis. let config = GenesisConfig { balances: BalancesConfig { balances: { - let pot_accounts = pot_accounts.clone(); endowed_accounts .iter() .cloned() @@ -29,6 +28,10 @@ fn new_test_ext_with() -> sp_io::TestExternalities { .map(|k| (k, INIT_BALANCE)) .chain( [( + TreasuryPot::account_id(), + 10 * INIT_BALANCE + ), + ( TokenClaimsPot::account_id(), >::minimum_balance(), ), @@ -70,12 +73,9 @@ fn new_test_ext_with() -> sp_io::TestExternalities { vec![( EvmToNativeSwapBridgePot::account_id(), fp_evm::GenesisAccount { - balance: (INIT_BALANCE * (endowed_accounts.len() + pot_accounts.len()) as u128 + - // Own bridge pot minimum balance. - >::minimum_balance() + - // `TokenClaimsPot` minimum balance. - >::minimum_balance() - ) + balance: >::minimum_balance() .into(), code: Default::default(), nonce: Default::default(), diff --git a/crates/humanode-runtime/src/tests/fixed_supply.rs b/crates/humanode-runtime/src/tests/fixed_supply.rs index 7831eb8eb..61780bd42 100644 --- a/crates/humanode-runtime/src/tests/fixed_supply.rs +++ b/crates/humanode-runtime/src/tests/fixed_supply.rs @@ -27,14 +27,13 @@ fn new_test_ext_with() -> sp_io::TestExternalities { let bootnodes = vec![account_id("Alice")]; let endowed_accounts = vec![account_id("Alice"), account_id("Bob")]; - let pot_accounts = vec![TreasuryPot::account_id(), FeesPot::account_id()]; + let pot_accounts = vec![FeesPot::account_id()]; let evm_endowed_accounts = vec![evm_account_id("EvmAlice"), evm_account_id("EvmBob")]; // Build test genesis. let config = GenesisConfig { balances: BalancesConfig { balances: { - let pot_accounts = pot_accounts.clone(); endowed_accounts .iter() .cloned() @@ -42,14 +41,15 @@ fn new_test_ext_with() -> sp_io::TestExternalities { .map(|k| (k, INIT_BALANCE)) .chain( [( + TreasuryPot::account_id(), 10 * INIT_BALANCE + ), + ( TokenClaimsPot::account_id(), >::minimum_balance(), ), ( NativeToEvmSwapBridgePot::account_id(), - INIT_BALANCE * evm_endowed_accounts.len() as u128 + - // Own bridge pot minimum balance. - >::minimum_balance(), + >::minimum_balance(), )] .into_iter(), ) @@ -95,12 +95,10 @@ fn new_test_ext_with() -> sp_io::TestExternalities { [( EvmToNativeSwapBridgePot::account_id(), fp_evm::GenesisAccount { - balance: (INIT_BALANCE * (endowed_accounts.len() + pot_accounts.len()) as u128 + - // Own bridge pot minimum balance. - >::minimum_balance() + - // `TokenClaimsPot` minimum balance. - >::minimum_balance() - ).into(), + balance: >::minimum_balance() + .into(), code: Default::default(), nonce: Default::default(), storage: Default::default(), From 384aa3adb81d6883e3cfb5b1cb6e5bd8d186fca7 Mon Sep 17 00:00:00 2001 From: Dmitry Lavrenov Date: Tue, 15 Aug 2023 14:46:30 +0300 Subject: [PATCH 3/4] Add is_balanced check at chain_spec construction --- crates/humanode-peer/src/chain_spec.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/crates/humanode-peer/src/chain_spec.rs b/crates/humanode-peer/src/chain_spec.rs index 3d5e012a2..3422df55c 100644 --- a/crates/humanode-peer/src/chain_spec.rs +++ b/crates/humanode-peer/src/chain_spec.rs @@ -408,7 +408,12 @@ mod tests { use super::*; fn assert_genesis_config(chain_spec_result: Result) { - chain_spec_result.unwrap().build_storage().unwrap(); + let storage = chain_spec_result.unwrap().build_storage().unwrap(); + Into::::into(storage).execute_with(move || { + assert!( + humanode_runtime::BalancedCurrencySwapBridgesInitializer::is_balanced().unwrap() + ); + }); } #[test] From 0edf261a9425ba961813ae601a524745963a7eae Mon Sep 17 00:00:00 2001 From: Dmitry Lavrenov Date: Tue, 15 Aug 2023 23:14:23 +0300 Subject: [PATCH 4/4] Separate assert to verify balance currency swap --- crates/humanode-peer/src/chain_spec.rs | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/crates/humanode-peer/src/chain_spec.rs b/crates/humanode-peer/src/chain_spec.rs index 3422df55c..35c3a8ea6 100644 --- a/crates/humanode-peer/src/chain_spec.rs +++ b/crates/humanode-peer/src/chain_spec.rs @@ -407,8 +407,13 @@ mod tests { use super::*; - fn assert_genesis_config(chain_spec_result: Result) { - let storage = chain_spec_result.unwrap().build_storage().unwrap(); + fn assert_genesis_config( + chain_spec_result: Result, + ) -> sp_core::storage::Storage { + chain_spec_result.unwrap().build_storage().unwrap() + } + + fn assert_balanced_currency_swap(storage: sp_core::storage::Storage) { Into::::into(storage).execute_with(move || { assert!( humanode_runtime::BalancedCurrencySwapBridgesInitializer::is_balanced().unwrap() @@ -418,17 +423,20 @@ mod tests { #[test] fn local_testnet_config_works() { - assert_genesis_config(local_testnet_config()); + let storage = assert_genesis_config(local_testnet_config()); + assert_balanced_currency_swap(storage); } #[test] fn development_config_works() { - assert_genesis_config(development_config()); + let storage = assert_genesis_config(development_config()); + assert_balanced_currency_swap(storage); } #[test] fn benchmark_config_works() { - assert_genesis_config(benchmark_config()); + let storage = assert_genesis_config(benchmark_config()); + assert_balanced_currency_swap(storage); } #[test]