Skip to content

Commit e5f1c2e

Browse files
authored
token-2022: Nits of token-2022 extensions (#348)
Nits
1 parent 4c05b40 commit e5f1c2e

File tree

15 files changed

+731
-735
lines changed

15 files changed

+731
-735
lines changed

programs/token-2022/src/instructions/extensions/default_account_state/initialize.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use {
2-
crate::instructions::extensions::ExtensionDiscriminator,
2+
crate::{instructions::extensions::ExtensionDiscriminator, state::AccountState},
33
solana_account_view::AccountView,
44
solana_address::Address,
55
solana_instruction_view::{cpi::invoke, InstructionAccount, InstructionView},
@@ -24,7 +24,7 @@ pub struct Initialize<'a, 'b> {
2424

2525
/// The default account state in which new token accounts should be
2626
/// initialized.
27-
pub state: u8,
27+
pub state: AccountState,
2828

2929
/// The token program.
3030
pub token_program: &'b Address,
@@ -42,7 +42,7 @@ impl Initialize<'_, '_> {
4242
data: &[
4343
ExtensionDiscriminator::DefaultAccountState as u8,
4444
Self::DISCRIMINATOR,
45-
self.state,
45+
self.state as u8,
4646
],
4747
},
4848
&[self.mint],

programs/token-2022/src/instructions/extensions/default_account_state/update.rs

Lines changed: 78 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
use {
2-
crate::instructions::{extensions::ExtensionDiscriminator, MAX_MULTISIG_SIGNERS},
2+
crate::{
3+
instructions::{extensions::ExtensionDiscriminator, MAX_MULTISIG_SIGNERS},
4+
state::AccountState,
5+
},
36
core::{mem::MaybeUninit, slice},
47
solana_account_view::AccountView,
58
solana_address::Address,
@@ -31,101 +34,110 @@ pub struct Update<'a, 'b, 'c> {
3134
pub freeze_authority: &'a AccountView,
3235

3336
/// The signer accounts if the authority is a multisig.
34-
pub signers: &'c [&'a AccountView],
37+
pub multisig_signers: &'c [&'a AccountView],
3538

3639
/// The new account state in which new token accounts should be
3740
/// initialized.
38-
pub state: u8,
41+
pub state: AccountState,
3942

4043
/// The token program.
4144
pub token_program: &'b Address,
4245
}
4346

44-
impl Update<'_, '_, '_> {
47+
impl<'a, 'b, 'c> Update<'a, 'b, 'c> {
4548
pub const DISCRIMINATOR: u8 = 1;
4649

50+
/// Creates a new `Update` instruction with a single owner/delegate
51+
/// authority.
52+
#[inline(always)]
53+
pub fn new(
54+
token_program: &'b Address,
55+
mint: &'a AccountView,
56+
freeze_authority: &'a AccountView,
57+
state: AccountState,
58+
) -> Self {
59+
Self::with_multisig_signers(token_program, mint, freeze_authority, state, &[])
60+
}
61+
62+
/// Creates a new `Update` instruction with a multisignature owner/delegate
63+
/// authority and signer accounts.
64+
#[inline(always)]
65+
pub fn with_multisig_signers(
66+
token_program: &'b Address,
67+
mint: &'a AccountView,
68+
freeze_authority: &'a AccountView,
69+
state: AccountState,
70+
multisig_signers: &'c [&'a AccountView],
71+
) -> Self {
72+
Self {
73+
mint,
74+
freeze_authority,
75+
multisig_signers,
76+
state,
77+
token_program,
78+
}
79+
}
80+
4781
#[inline(always)]
4882
pub fn invoke(&self) -> ProgramResult {
4983
self.invoke_signed(&[])
5084
}
5185

5286
#[inline(always)]
5387
pub fn invoke_signed(&self, signers: &[Signer]) -> ProgramResult {
54-
if self.signers.len() > MAX_MULTISIG_SIGNERS {
88+
if self.multisig_signers.len() > MAX_MULTISIG_SIGNERS {
5589
return Err(ProgramError::InvalidArgument);
5690
}
5791

58-
let expected_accounts = 2 + self.signers.len();
92+
let expected_accounts = 2 + self.multisig_signers.len();
5993

6094
// Instruction accounts.
6195

62-
const UNINIT_INSTRUCTION_ACCOUNTS: MaybeUninit<InstructionAccount> =
63-
MaybeUninit::<InstructionAccount>::uninit();
64-
let mut instruction_accounts = [UNINIT_INSTRUCTION_ACCOUNTS; 2 + MAX_MULTISIG_SIGNERS];
65-
66-
// SAFETY: The allocation is valid to the maximum number of accounts.
67-
unsafe {
68-
// mint
69-
instruction_accounts
70-
.get_unchecked_mut(0)
71-
.write(InstructionAccount::writable(self.mint.address()));
72-
73-
// freeze_authority
74-
instruction_accounts
75-
.get_unchecked_mut(1)
76-
.write(InstructionAccount::new(
77-
self.freeze_authority.address(),
78-
false,
79-
self.signers.is_empty(),
80-
));
81-
82-
// signer accounts
83-
for (account, signer) in instruction_accounts
84-
.get_unchecked_mut(2..)
85-
.iter_mut()
86-
.zip(self.signers.iter())
87-
{
88-
account.write(InstructionAccount::readonly_signer(signer.address()));
89-
}
90-
}
96+
let mut instruction_accounts =
97+
[const { MaybeUninit::<InstructionAccount>::uninit() }; 2 + MAX_MULTISIG_SIGNERS];
9198

92-
let instruction = InstructionView {
93-
program_id: self.token_program,
94-
data: &[
95-
ExtensionDiscriminator::DefaultAccountState as u8,
96-
Self::DISCRIMINATOR,
97-
self.state,
98-
],
99-
accounts: unsafe {
100-
slice::from_raw_parts(instruction_accounts.as_ptr() as _, expected_accounts)
101-
},
102-
};
99+
instruction_accounts[0].write(InstructionAccount::writable(self.mint.address()));
100+
101+
instruction_accounts[1].write(InstructionAccount::new(
102+
self.freeze_authority.address(),
103+
false,
104+
self.multisig_signers.is_empty(),
105+
));
106+
107+
for (account, signer) in instruction_accounts[2..]
108+
.iter_mut()
109+
.zip(self.multisig_signers.iter())
110+
{
111+
account.write(InstructionAccount::readonly_signer(signer.address()));
112+
}
103113

104114
// Accounts.
105115

106-
const UNINIT_ACCOUNT_VIEWS: MaybeUninit<&AccountView> = MaybeUninit::uninit();
107-
let mut accounts = [UNINIT_ACCOUNT_VIEWS; 2 + MAX_MULTISIG_SIGNERS];
108-
109-
// SAFETY: The allocation is valid to the maximum number of accounts.
110-
unsafe {
111-
// mint
112-
accounts.get_unchecked_mut(0).write(self.mint);
113-
114-
// freeze_authority
115-
accounts.get_unchecked_mut(1).write(self.freeze_authority);
116-
117-
// signer accounts
118-
for (account, signer) in accounts
119-
.get_unchecked_mut(2..)
120-
.iter_mut()
121-
.zip(self.signers.iter())
122-
{
123-
account.write(signer);
124-
}
116+
let mut accounts =
117+
[const { MaybeUninit::<&AccountView>::uninit() }; 2 + MAX_MULTISIG_SIGNERS];
118+
119+
accounts[0].write(self.mint);
120+
121+
accounts[1].write(self.freeze_authority);
122+
123+
for (account, signer) in accounts[2..].iter_mut().zip(self.multisig_signers.iter()) {
124+
account.write(signer);
125125
}
126126

127127
invoke_signed_with_bounds::<{ 2 + MAX_MULTISIG_SIGNERS }>(
128-
&instruction,
128+
&InstructionView {
129+
program_id: self.token_program,
130+
// SAFETY: instruction accounts has `expected_accounts` initialized.
131+
accounts: unsafe {
132+
slice::from_raw_parts(instruction_accounts.as_ptr() as _, expected_accounts)
133+
},
134+
data: &[
135+
ExtensionDiscriminator::DefaultAccountState as u8,
136+
Self::DISCRIMINATOR,
137+
self.state as u8,
138+
],
139+
},
140+
// SAFETY: accounts has `expected_accounts` initialized.
129141
unsafe { slice::from_raw_parts(accounts.as_ptr() as _, expected_accounts) },
130142
signers,
131143
)

programs/token-2022/src/instructions/extensions/group_member_pointer/initialize.rs

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,10 @@ impl Initialize<'_, '_> {
4242

4343
let mut instruction_data = [UNINIT_BYTE; 66];
4444

45-
// discriminators
46-
write_bytes(
47-
&mut instruction_data[..2],
48-
&[
49-
ExtensionDiscriminator::GroupMemberPointer as u8,
50-
Initialize::DISCRIMINATOR,
51-
],
52-
);
53-
// authority
45+
instruction_data[0].write(ExtensionDiscriminator::GroupMemberPointer as u8);
46+
47+
instruction_data[1].write(Self::DISCRIMINATOR);
48+
5449
write_bytes(
5550
&mut instruction_data[2..34],
5651
if let Some(authority) = self.authority {
@@ -59,7 +54,7 @@ impl Initialize<'_, '_> {
5954
&[0u8; 32]
6055
},
6156
);
62-
// member_address
57+
6358
write_bytes(
6459
&mut instruction_data[34..66],
6560
if let Some(member_address) = self.member_address {
@@ -69,14 +64,16 @@ impl Initialize<'_, '_> {
6964
},
7065
);
7166

72-
// Instruction.
73-
74-
let instruction = InstructionView {
75-
program_id: self.token_program,
76-
accounts: &[InstructionAccount::writable(self.mint.address())],
77-
data: unsafe { from_raw_parts(instruction_data.as_ptr() as _, instruction_data.len()) },
78-
};
79-
80-
invoke(&instruction, &[self.mint])
67+
invoke(
68+
&InstructionView {
69+
program_id: self.token_program,
70+
accounts: &[InstructionAccount::writable(self.mint.address())],
71+
// SAFETY: `instruction_data` is initialized.
72+
data: unsafe {
73+
from_raw_parts(instruction_data.as_ptr() as _, instruction_data.len())
74+
},
75+
},
76+
&[self.mint],
77+
)
8178
}
8279
}

0 commit comments

Comments
 (0)