diff --git a/CHANGELOG.md b/CHANGELOG.md index f4bf872d..ea0bddf9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## [Unreleased] +### Fixed + +- Return an error instead of panicking from `litesvm_token::get_spl_account` (and the `*Checked` token helpers that read the mint through it) when the account data is shorter than the requested state ([#433](https://github.com/LiteSVM/litesvm/pull/433)). + ## [0.18.0] - 2026-10-09 ### Added diff --git a/crates/token/src/lib.rs b/crates/token/src/lib.rs index b21167fa..cd7c705f 100644 --- a/crates/token/src/lib.rs +++ b/crates/token/src/lib.rs @@ -49,14 +49,11 @@ pub fn get_spl_account( svm: &LiteSVM, account: &Address, ) -> Result { - let account = T::unpack( - &svm.get_account(account) - .ok_or(FailedTransactionMetadata { - err: TransactionError::AccountNotFound, - meta: Default::default(), - })? - .data[..T::LEN], - )?; + let account = svm.get_account(account).ok_or(FailedTransactionMetadata { + err: TransactionError::AccountNotFound, + meta: Default::default(), + })?; + let account = T::unpack(account.data.get(..T::LEN).unwrap_or(&account.data))?; Ok(account) } diff --git a/crates/token/tests/one_owner.rs b/crates/token/tests/one_owner.rs index cb69658e..37afcfc4 100644 --- a/crates/token/tests/one_owner.rs +++ b/crates/token/tests/one_owner.rs @@ -192,3 +192,23 @@ fn test_with_account_keypair() { let token_account: Account = get_spl_account(svm, &returned_pk).unwrap(); assert_eq!(token_account.state, AccountState::Initialized); } + +#[test] +fn test_get_spl_account_with_short_data() { + let svm = &mut LiteSVM::new(); + let payer_kp = Keypair::new(); + let payer_pk = payer_kp.pubkey(); + svm.airdrop(&payer_pk, 10_000_000_000).unwrap(); + + let mint_pk = CreateMint::new(svm, &payer_kp).send().unwrap(); + + assert!(get_spl_account::(svm, &mint_pk).is_err()); + assert!(get_spl_account::(svm, &payer_pk).is_err()); + + let destination_pk = Keypair::new().pubkey(); + assert!( + TransferChecked::new(svm, &payer_kp, &payer_pk, &destination_pk, 1) + .send() + .is_err() + ); +}