confidential-extension: forbid confidential transfer if nontransferable mint (#3542)

* forbid confidential transfer if nontransferable mint

* add a note about nontransferable mint in the transfer instruction

* disable deposit and withdraw if mint nontransferable
This commit is contained in:
samkim-crypto 2022-09-07 09:40:28 +09:00 committed by GitHub
parent 8ca2b8666b
commit 30870c96e8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 1 deletions

View File

@ -132,6 +132,7 @@ pub enum ConfidentialTransferInstruction {
/// into their available balance at a time of their choosing. /// into their available balance at a time of their choosing.
/// ///
/// Fails if the source or destination accounts are frozen. /// Fails if the source or destination accounts are frozen.
/// Fails if the associated mint is extended as `NonTransferable`.
/// ///
/// Accounts expected by this instruction: /// Accounts expected by this instruction:
/// ///
@ -156,6 +157,7 @@ pub enum ConfidentialTransferInstruction {
/// Withdraw SPL Tokens from the available balance of a confidential token account. /// Withdraw SPL Tokens from the available balance of a confidential token account.
/// ///
/// Fails if the source or destination accounts are frozen. /// Fails if the source or destination accounts are frozen.
/// Fails if the associated mint is extended as `NonTransferable`.
/// ///
/// Accounts expected by this instruction: /// Accounts expected by this instruction:
/// ///
@ -181,6 +183,8 @@ pub enum ConfidentialTransferInstruction {
/// Transfer tokens confidentially. /// Transfer tokens confidentially.
/// ///
/// Fails if the associated mint is extended as `NonTransferable`.
///
/// * Single owner/delegate /// * Single owner/delegate
/// 1. `[writable]` The source SPL Token account. /// 1. `[writable]` The source SPL Token account.
/// 2. `[writable]` The destination SPL Token account. /// 2. `[writable]` The destination SPL Token account.

View File

@ -4,6 +4,7 @@ use {
error::TokenError, error::TokenError,
extension::{ extension::{
confidential_transfer::{instruction::*, *}, confidential_transfer::{instruction::*, *},
non_transferable::NonTransferable,
StateWithExtensions, StateWithExtensionsMut, StateWithExtensions, StateWithExtensionsMut,
}, },
instruction::{decode_instruction_data, decode_instruction_type}, instruction::{decode_instruction_data, decode_instruction_type},
@ -279,6 +280,10 @@ fn process_deposit(
return Err(TokenError::MintDecimalsMismatch.into()); return Err(TokenError::MintDecimalsMismatch.into());
} }
if mint.get_extension::<NonTransferable>().is_ok() {
return Err(TokenError::NonTransferable.into());
}
// Process source account // Process source account
{ {
check_program_account(token_account_info.owner)?; check_program_account(token_account_info.owner)?;
@ -398,6 +403,10 @@ fn process_withdraw(
return Err(TokenError::MintDecimalsMismatch.into()); return Err(TokenError::MintDecimalsMismatch.into());
} }
if mint.get_extension::<NonTransferable>().is_ok() {
return Err(TokenError::NonTransferable.into());
}
let previous_instruction = let previous_instruction =
get_instruction_relative(proof_instruction_offset, instructions_sysvar_info)?; get_instruction_relative(proof_instruction_offset, instructions_sysvar_info)?;
@ -495,8 +504,12 @@ fn process_transfer(
check_program_account(mint_info.owner)?; check_program_account(mint_info.owner)?;
let mint_data = &mint_info.data.borrow_mut(); let mint_data = &mint_info.data.borrow_mut();
let mint = StateWithExtensions::<Mint>::unpack(mint_data)?; let mint = StateWithExtensions::<Mint>::unpack(mint_data)?;
let confidential_transfer_mint = mint.get_extension::<ConfidentialTransferMint>()?;
if mint.get_extension::<NonTransferable>().is_ok() {
return Err(TokenError::NonTransferable.into());
}
let confidential_transfer_mint = mint.get_extension::<ConfidentialTransferMint>()?;
let previous_instruction = let previous_instruction =
get_instruction_relative(proof_instruction_offset, instructions_sysvar_info)?; get_instruction_relative(proof_instruction_offset, instructions_sysvar_info)?;