diff --git a/prdoc/pr_9911.prdoc b/prdoc/pr_9911.prdoc new file mode 100644 index 0000000000000..356a5042ed1f5 --- /dev/null +++ b/prdoc/pr_9911.prdoc @@ -0,0 +1,9 @@ +title: '[pallet-revive] Allows setting evm balance for non-existing account' +doc: +- audience: Runtime User + description: |- + Allows calling set_evm_balance for a non-existing account on pallet-revive. + +crates: +- name: pallet-revive + bump: minor diff --git a/substrate/frame/revive/src/lib.rs b/substrate/frame/revive/src/lib.rs index 7a67ad21dbf80..52cf9285ec67b 100644 --- a/substrate/frame/revive/src/lib.rs +++ b/substrate/frame/revive/src/lib.rs @@ -1566,8 +1566,12 @@ where .map_err(|_| >::BalanceConversionFailed)?; let account_id = T::AddressMapper::to_account_id(&address); T::Currency::set_balance(&account_id, balance); - AccountInfoOf::::mutate(address, |account| { - account.as_mut().map(|a| a.dust = dust); + AccountInfoOf::::mutate(&address, |account| { + if let Some(account) = account { + account.dust = dust; + } else { + *account = Some(AccountInfo { dust, ..Default::default() }); + } }); Ok(()) diff --git a/substrate/frame/revive/src/tests/pvm.rs b/substrate/frame/revive/src/tests/pvm.rs index d8c51ab03cccb..722f8456a3eea 100644 --- a/substrate/frame/revive/src/tests/pvm.rs +++ b/substrate/frame/revive/src/tests/pvm.rs @@ -197,6 +197,17 @@ fn eth_call_transfer_with_dust_works() { }); } +#[test] +fn set_evm_balance_for_eoa_works() { + ExtBuilder::default().existential_deposit(200).build().execute_with(|| { + let native_with_dust = BalanceWithDust::new_unchecked::(100, 10); + let evm_balance = Pallet::::convert_native_to_evm(native_with_dust); + let _ = Pallet::::set_evm_balance(&ALICE_ADDR, evm_balance); + + assert_eq!(Pallet::::evm_balance(&ALICE_ADDR), evm_balance); + }); +} + #[test] fn set_evm_balance_works() { let (binary, _) = compile_module("dummy").unwrap();