Skip to content
This repository was archived by the owner on Mar 11, 2025. It is now read-only.

Commit 6fd638e

Browse files
authored
token-2022: [L-02] Check for non-transferable extension consistently (#6862)
token-2022: Check for non-transferable extension consistently
1 parent d103601 commit 6fd638e

File tree

1 file changed

+25
-12
lines changed
  • token/program-2022/src/extension/confidential_transfer

1 file changed

+25
-12
lines changed

token/program-2022/src/extension/confidential_transfer/processor.rs

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
use crate::extension::transfer_hook;
44
#[cfg(feature = "zk-ops")]
55
use {
6-
crate::extension::non_transferable::NonTransferable,
6+
crate::extension::non_transferable::NonTransferableAccount,
77
solana_zk_token_sdk::zk_token_elgamal::ops as syscall,
88
};
99
use {
@@ -269,13 +269,15 @@ fn process_deposit(
269269
return Err(TokenError::MintDecimalsMismatch.into());
270270
}
271271

272-
if mint.get_extension::<NonTransferable>().is_ok() {
273-
return Err(TokenError::NonTransferable.into());
274-
}
275-
276272
check_program_account(token_account_info.owner)?;
277273
let token_account_data = &mut token_account_info.data.borrow_mut();
278274
let mut token_account = PodStateWithExtensionsMut::<PodAccount>::unpack(token_account_data)?;
275+
if token_account
276+
.get_extension::<NonTransferableAccount>()
277+
.is_ok()
278+
{
279+
return Err(TokenError::NonTransferable.into());
280+
}
279281

280282
Processor::validate_owner(
281283
program_id,
@@ -367,13 +369,15 @@ fn process_withdraw(
367369
return Err(TokenError::MintDecimalsMismatch.into());
368370
}
369371

370-
if mint.get_extension::<NonTransferable>().is_ok() {
371-
return Err(TokenError::NonTransferable.into());
372-
}
373-
374372
check_program_account(token_account_info.owner)?;
375373
let token_account_data = &mut token_account_info.data.borrow_mut();
376374
let mut token_account = PodStateWithExtensionsMut::<PodAccount>::unpack(token_account_data)?;
375+
if token_account
376+
.get_extension::<NonTransferableAccount>()
377+
.is_ok()
378+
{
379+
return Err(TokenError::NonTransferable.into());
380+
}
377381

378382
Processor::validate_owner(
379383
program_id,
@@ -450,9 +454,6 @@ fn process_transfer(
450454
let mint_data = mint_info.data.borrow_mut();
451455
let mint = PodStateWithExtensions::<PodMint>::unpack(&mint_data)?;
452456

453-
if mint.get_extension::<NonTransferable>().is_ok() {
454-
return Err(TokenError::NonTransferable.into());
455-
}
456457
let confidential_transfer_mint = mint.get_extension::<ConfidentialTransferMint>()?;
457458

458459
// A `Transfer` instruction must be accompanied by a zero-knowledge proof
@@ -677,6 +678,12 @@ fn process_source_for_transfer(
677678
let authority_info_data_len = authority_info.data_len();
678679
let token_account_data = &mut source_account_info.data.borrow_mut();
679680
let mut token_account = PodStateWithExtensionsMut::<PodAccount>::unpack(token_account_data)?;
681+
if token_account
682+
.get_extension::<NonTransferableAccount>()
683+
.is_ok()
684+
{
685+
return Err(TokenError::NonTransferable.into());
686+
}
680687

681688
Processor::validate_owner(
682689
program_id,
@@ -803,6 +810,12 @@ fn process_source_for_transfer_with_fee(
803810
let authority_info_data_len = authority_info.data_len();
804811
let token_account_data = &mut source_account_info.data.borrow_mut();
805812
let mut token_account = PodStateWithExtensionsMut::<PodAccount>::unpack(token_account_data)?;
813+
if token_account
814+
.get_extension::<NonTransferableAccount>()
815+
.is_ok()
816+
{
817+
return Err(TokenError::NonTransferable.into());
818+
}
806819

807820
Processor::validate_owner(
808821
program_id,

0 commit comments

Comments
 (0)