spl_token_2022/extension/memo_transfer/
instruction.rs1#[cfg(feature = "serde-traits")]
2use serde::{Deserialize, Serialize};
3use {
4 crate::{
5 check_program_account,
6 instruction::{encode_instruction, TokenInstruction},
7 },
8 num_enum::{IntoPrimitive, TryFromPrimitive},
9 solana_program::{
10 instruction::{AccountMeta, Instruction},
11 program_error::ProgramError,
12 pubkey::Pubkey,
13 },
14};
15
16#[cfg_attr(feature = "serde-traits", derive(Serialize, Deserialize))]
18#[cfg_attr(feature = "serde-traits", serde(rename_all = "camelCase"))]
19#[derive(Clone, Copy, Debug, PartialEq, IntoPrimitive, TryFromPrimitive)]
20#[repr(u8)]
21pub enum RequiredMemoTransfersInstruction {
22 Enable,
35 Disable,
50}
51
52pub fn enable_required_transfer_memos(
54 token_program_id: &Pubkey,
55 account: &Pubkey,
56 owner: &Pubkey,
57 signers: &[&Pubkey],
58) -> Result<Instruction, ProgramError> {
59 check_program_account(token_program_id)?;
60 let mut accounts = vec![
61 AccountMeta::new(*account, false),
62 AccountMeta::new_readonly(*owner, signers.is_empty()),
63 ];
64 for signer_pubkey in signers.iter() {
65 accounts.push(AccountMeta::new_readonly(**signer_pubkey, true));
66 }
67 Ok(encode_instruction(
68 token_program_id,
69 accounts,
70 TokenInstruction::MemoTransferExtension,
71 RequiredMemoTransfersInstruction::Enable,
72 &(),
73 ))
74}
75
76pub fn disable_required_transfer_memos(
78 token_program_id: &Pubkey,
79 account: &Pubkey,
80 owner: &Pubkey,
81 signers: &[&Pubkey],
82) -> Result<Instruction, ProgramError> {
83 check_program_account(token_program_id)?;
84 let mut accounts = vec![
85 AccountMeta::new(*account, false),
86 AccountMeta::new_readonly(*owner, signers.is_empty()),
87 ];
88 for signer_pubkey in signers.iter() {
89 accounts.push(AccountMeta::new_readonly(**signer_pubkey, true));
90 }
91 Ok(encode_instruction(
92 token_program_id,
93 accounts,
94 TokenInstruction::MemoTransferExtension,
95 RequiredMemoTransfersInstruction::Disable,
96 &(),
97 ))
98}