From 4b7f60408c880c3069d71c073e07dd68dcc40944 Mon Sep 17 00:00:00 2001 From: Dino Pacandi Date: Thu, 28 Nov 2024 17:01:39 +0100 Subject: [PATCH] Tests --- primitives/src/evm.rs | 2 +- runtime/astar/src/lib.rs | 4 ++ runtime/shibuya/src/lib.rs | 4 ++ runtime/shiden/src/lib.rs | 4 ++ tests/integration/src/fees.rs | 86 +++++++++++++++++++++++++++++++++++ tests/integration/src/lib.rs | 3 ++ 6 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 tests/integration/src/fees.rs diff --git a/primitives/src/evm.rs b/primitives/src/evm.rs index 08aef73bda..5cbfde7085 100644 --- a/primitives/src/evm.rs +++ b/primitives/src/evm.rs @@ -188,7 +188,7 @@ where fn pay_priority_fee(tip: Self::LiquidityInfo) { if let Some(tip) = tip { - OUT::on_unbalanceds(sp_std::vec![tip].into_iter()); + OUT::on_unbalanceds(Some(tip).into_iter()); } } } diff --git a/runtime/astar/src/lib.rs b/runtime/astar/src/lib.rs index 7850bbb354..daa9829a66 100644 --- a/runtime/astar/src/lib.rs +++ b/runtime/astar/src/lib.rs @@ -841,6 +841,10 @@ impl OnUnbalanced> for DealWithFees { >::on_unbalanced(collator); } } + + fn on_unbalanced(amount: Credit) { + Self::on_unbalanceds(Some(amount).into_iter()); + } } impl pallet_transaction_payment::Config for Runtime { diff --git a/runtime/shibuya/src/lib.rs b/runtime/shibuya/src/lib.rs index dba073135e..95b5798d00 100644 --- a/runtime/shibuya/src/lib.rs +++ b/runtime/shibuya/src/lib.rs @@ -837,6 +837,10 @@ impl OnUnbalanced> for DealWithFees { >::on_unbalanced(collator); } } + + fn on_unbalanced(amount: Credit) { + Self::on_unbalanceds(Some(amount).into_iter()); + } } impl pallet_transaction_payment::Config for Runtime { diff --git a/runtime/shiden/src/lib.rs b/runtime/shiden/src/lib.rs index 0eae2439a7..4989e71566 100644 --- a/runtime/shiden/src/lib.rs +++ b/runtime/shiden/src/lib.rs @@ -816,6 +816,10 @@ impl OnUnbalanced> for DealWithFees { >::on_unbalanced(collator); } } + + fn on_unbalanced(amount: Credit) { + Self::on_unbalanceds(Some(amount).into_iter()); + } } impl pallet_transaction_payment::Config for Runtime { diff --git a/tests/integration/src/fees.rs b/tests/integration/src/fees.rs new file mode 100644 index 0000000000..0befc3a6aa --- /dev/null +++ b/tests/integration/src/fees.rs @@ -0,0 +1,86 @@ +// This file is part of Astar. + +// Copyright (C) Stake Technologies Pte.Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later + +// Astar is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Astar is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Astar. If not, see . + +use crate::setup::*; + +use frame_support::traits::Currency; +use pallet_evm::{AddressMapping, OnChargeEVMTransaction}; +use sp_core::{H160, U256}; +use sp_runtime::traits::AccountIdConversion; + +#[test] +fn evm_fees_work() { + new_test_ext().execute_with(|| { + let address = H160::repeat_byte(0xbe); + let mapped_address = + ::AddressMapping::into_account_id(address); + Balances::make_free_balance_be(&mapped_address, 1_000_000_000_000_000); + + type EvmFeeHandler = ::OnChargeTransaction; + + // 0. Define init values + let (base_fee, tip, init_fee) = (500, 100, 1000); + let corrected_fee = base_fee + tip; + + let pot_account = PotId::get().into_account_truncating(); + let init_reward_pot = Balances::free_balance(&pot_account); + let init_total_issuance = Balances::total_issuance(); + + // 1. Withdraw some init fee + let result = >::withdraw_fee( + &address, + U256::from(init_fee), + ); + let already_withdrawn = result.expect("Account is funded, must succeed."); + + // 2. Correct the charged fee + let calculated_tip = + >::correct_and_deposit_fee( + &address, + U256::from(corrected_fee), + U256::from(base_fee), + already_withdrawn, + ); + assert!(calculated_tip.is_some()); + + // The expectation is that 20% of the fee was deposited into the reward pot, and the rest was burned. + assert_eq!( + init_reward_pot + base_fee / 5, + Balances::free_balance(&pot_account) + ); + assert_eq!( + init_total_issuance - base_fee / 5 * 4, + Balances::total_issuance() + ); + + // 3. Deposit the tip + let issuance = Balances::total_issuance(); + let pot = Balances::free_balance(&pot_account); + >::pay_priority_fee(calculated_tip); + assert_eq!( + issuance, + Balances::total_issuance(), + "Total issuance should not change since tip isn't burned." + ); + assert_eq!( + pot + tip, + Balances::free_balance(&pot_account), + "Pot should increase by the tip amount." + ); + }) +} diff --git a/tests/integration/src/lib.rs b/tests/integration/src/lib.rs index f4dfb40e88..198888dac5 100644 --- a/tests/integration/src/lib.rs +++ b/tests/integration/src/lib.rs @@ -52,3 +52,6 @@ mod governance; #[cfg(any(feature = "shibuya", feature = "shiden", feature = "astar"))] mod xcm_api; + +#[cfg(any(feature = "shibuya", feature = "shiden", feature = "astar"))] +mod fees;