J’ai ajouté un test d’intégration sur les frais, lui aussi dit que les frais sont de 2.
/// test currency transfer with extrinsic
// the signer account should pay fees and a tip
// the treasury should get the fees
#[test]
fn test_transfer_xt() {
ExtBuilder::new(1, 3, 4)
.with_initial_balances(vec![
(AccountKeyring::Alice.to_account_id(), 10_000),
(AccountKeyring::Eve.to_account_id(), 10_000),
])
.build()
.execute_with(|| {
let call = RuntimeCall::Balances(BalancesCall::transfer_allow_death {
dest: AccountKeyring::Eve.to_account_id().into(),
value: 500,
});
// 1 cĞD of tip
let xt = get_unchecked_extrinsic(call, 4u64, 8u64, AccountKeyring::Alice, 1u64);
let info = xt.get_dispatch_info();
println!("dispatch info:\n\t {:?}\n", info);
// nothing in treasury at start
// FIXME treasury is initialized at ED
assert_eq!(Balances::free_balance(Treasury::account_id()), 200);
// Alice gives 500 to Eve
assert_ok!(Executive::apply_extrinsic(xt));
// check amounts
assert_eq!(
Balances::free_balance(AccountKeyring::Alice.to_account_id()),
10_000 - 500 - 3 // initial - transfered - fees
);
assert_eq!(
Balances::free_balance(AccountKeyring::Eve.to_account_id()),
10_000 + 500 // initial + transfered
);
assert_eq!(Balances::free_balance(Treasury::account_id()), 203);
})
}
J’ai mis du temps à y arriver parce que j’avais initialisé la trésorerie à zéro et que donc il ne pouvait pas recevoir les frais parce qu’il était en dessous du dépôt existentiel (cf Soldes des comptes au genesis v2 - #7 by HugoTrentesaux). Donc j’ai lu de long en large le code de substrate sur l’exécution d’un extrinsic (pallet-executive
et primitives associées) et le paiement des frais de transaction (pallet-transaction-payment
et toute la mécanique du imbalance…). Bref c’était long ><
Par contre, le test manuel donne toujours la même chose :
Et la trésorerie était dans tous les cas initialisée à 2 ĞD, il y a un conflit entre balances
et duniter-account
je crois.