Skip to content

Commit f9133d3

Browse files
committed
implement authority type
1 parent c22a5fe commit f9133d3

File tree

4 files changed

+22
-4
lines changed

4 files changed

+22
-4
lines changed

interface/src/extension/permissioned_burn/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use serde::{Deserialize, Serialize};
33
use {
44
crate::extension::{Extension, ExtensionType},
55
bytemuck::{Pod, Zeroable},
6-
solana_pubkey::Pubkey,
6+
spl_pod::optional_keys::OptionalNonZeroPubkey
77
};
88

99
/// Instruction types for the permissioned burn extension
@@ -16,7 +16,7 @@ pub mod instruction;
1616
#[repr(C)]
1717
pub struct PermissionedBurnConfig {
1818
/// Authority that is required for burning
19-
pub authority: Pubkey,
19+
pub authority: OptionalNonZeroPubkey,
2020
}
2121

2222
impl Extension for PermissionedBurnConfig {

interface/src/instruction.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1160,6 +1160,8 @@ pub enum AuthorityType {
11601160
ScaledUiAmount,
11611161
/// Authority to pause or resume minting / transferring / burning
11621162
Pause,
1163+
/// Authority to perform a permissioned token burn
1164+
PermissionedBurn,
11631165
}
11641166

11651167
impl AuthorityType {
@@ -1182,6 +1184,7 @@ impl AuthorityType {
11821184
AuthorityType::GroupMemberPointer => 14,
11831185
AuthorityType::ScaledUiAmount => 15,
11841186
AuthorityType::Pause => 16,
1187+
AuthorityType::PermissionedBurn => 17,
11851188
}
11861189
}
11871190

@@ -1205,6 +1208,7 @@ impl AuthorityType {
12051208
14 => Ok(AuthorityType::GroupMemberPointer),
12061209
15 => Ok(AuthorityType::ScaledUiAmount),
12071210
16 => Ok(AuthorityType::Pause),
1211+
17 => Ok(AuthorityType::PermissionedBurn),
12081212
_ => Err(TokenError::InvalidInstruction.into()),
12091213
}
12101214
}

program/src/extension/permissioned_burn/processor.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ fn process_initialize(
2828
let mut mint = PodStateWithExtensionsMut::<PodMint>::unpack_uninitialized(&mut mint_data)?;
2929

3030
let extension = mint.init_extension::<PermissionedBurnConfig>(true)?;
31-
extension.authority = *authority;
31+
extension.authority = Some(*authority).try_into()?;
3232

3333
Ok(())
3434
}

program/src/processor.rs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -967,6 +967,19 @@ impl Processor {
967967
)?;
968968
extension.authority = new_authority.try_into()?;
969969
}
970+
AuthorityType::PermissionedBurn => {
971+
let extension = mint.get_extension_mut::<PermissionedBurnConfig>()?;
972+
let maybe_authority: Option<Pubkey> = extension.authority.into();
973+
let authority = maybe_authority.ok_or(TokenError::AuthorityTypeNotSupported)?;
974+
Self::validate_owner(
975+
program_id,
976+
&authority,
977+
authority_info,
978+
authority_info_data_len,
979+
account_info_iter.as_slice(),
980+
)?;
981+
extension.authority = new_authority.try_into()?;
982+
}
970983
_ => {
971984
return Err(TokenError::AuthorityTypeNotSupported.into());
972985
}
@@ -1118,7 +1131,8 @@ impl Processor {
11181131
return Err(ProgramError::MissingRequiredSignature);
11191132
}
11201133

1121-
if *approver_ai.key != ext.authority {
1134+
let maybe_burn_authority: Option<Pubkey> = ext.authority.into();
1135+
if Some(*approver_ai.key) != maybe_burn_authority {
11221136
return Err(ProgramError::InvalidAccountData);
11231137
}
11241138
}

0 commit comments

Comments
 (0)