diff --git a/runtime/src/accounts.rs b/runtime/src/accounts.rs index 75ed017f77..34ab81b420 100644 --- a/runtime/src/accounts.rs +++ b/runtime/src/accounts.rs @@ -236,6 +236,8 @@ impl Accounts { })? { SystemAccountKind::System => 0, SystemAccountKind::Nonce => { + // Should we ever allow a fees charge to zero a nonce account's + // balance. The state MUST be set to uninitialized in that case rent_collector.rent.minimum_balance(nonce::State::size()) } }; diff --git a/sdk/src/nonce_keyed_account.rs b/sdk/src/nonce_keyed_account.rs index 43eb5fe8f5..7925198a36 100644 --- a/sdk/src/nonce_keyed_account.rs +++ b/sdk/src/nonce_keyed_account.rs @@ -90,6 +90,7 @@ impl<'a> NonceKeyedAccount for KeyedAccount<'a> { if data.blockhash == recent_blockhashes[0].blockhash { return Err(NonceError::NotExpired.into()); } + self.set_state(&Versions::new_current(State::Uninitialized))?; } else { let min_balance = rent.minimum_balance(self.data_len()?); if lamports + min_balance > self.lamports()? { @@ -271,6 +272,11 @@ mod test { ); // Account balance goes to `to` assert_eq!(to_keyed.account.borrow().lamports, expect_to_lamports); + let state = AccountUtilsState::::state(keyed_account) + .unwrap() + .convert_to_current(); + // Empty balance deinitializes data + assert_eq!(state, State::Uninitialized); }) }) } @@ -627,6 +633,10 @@ mod test { &signers, ) .unwrap(); + let state = AccountUtilsState::::state(nonce_keyed) + .unwrap() + .convert_to_current(); + assert_eq!(state, State::Uninitialized); assert_eq!(nonce_keyed.account.borrow().lamports, nonce_expect_lamports); assert_eq!(to_keyed.account.borrow().lamports, to_expect_lamports); })