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