gor22_token/extension/scaled_ui_amount/
instruction.rs1#[cfg(feature = "serde-traits")]
2use serde::{Deserialize, Serialize};
3use {
4 crate::{
5 check_program_account,
6 extension::scaled_ui_amount::{PodF64, UnixTimestamp},
7 instruction::{encode_instruction, TokenInstruction},
8 },
9 bytemuck::{Pod, Zeroable},
10 num_enum::{IntoPrimitive, TryFromPrimitive},
11 solana_program::{
12 instruction::{AccountMeta, Instruction},
13 program_error::ProgramError,
14 pubkey::Pubkey,
15 },
16 spl_pod::optional_keys::OptionalNonZeroPubkey,
17 std::convert::TryInto,
18};
19
20#[cfg_attr(feature = "serde-traits", derive(Serialize, Deserialize))]
22#[cfg_attr(feature = "serde-traits", serde(rename_all = "camelCase"))]
23#[derive(Clone, Copy, Debug, PartialEq, IntoPrimitive, TryFromPrimitive)]
24#[repr(u8)]
25pub enum ScaledUiAmountMintInstruction {
26 Initialize,
45 UpdateMultiplier,
69}
70
71#[cfg_attr(feature = "serde-traits", derive(Serialize, Deserialize))]
73#[cfg_attr(feature = "serde-traits", serde(rename_all = "camelCase"))]
74#[derive(Clone, Copy, Pod, Zeroable)]
75#[repr(C)]
76pub struct InitializeInstructionData {
77 pub authority: OptionalNonZeroPubkey,
79 pub multiplier: PodF64,
81}
82
83#[cfg_attr(feature = "serde-traits", derive(Serialize, Deserialize))]
85#[cfg_attr(feature = "serde-traits", serde(rename_all = "camelCase"))]
86#[derive(Clone, Copy, Pod, Zeroable)]
87#[repr(C)]
88pub struct UpdateMultiplierInstructionData {
89 pub multiplier: PodF64,
91 pub effective_timestamp: UnixTimestamp,
93}
94
95pub fn initialize(
97 token_program_id: &Pubkey,
98 mint: &Pubkey,
99 authority: Option<Pubkey>,
100 multiplier: f64,
101) -> Result<Instruction, ProgramError> {
102 check_program_account(token_program_id)?;
103 let accounts = vec![AccountMeta::new(*mint, false)];
104 Ok(encode_instruction(
105 token_program_id,
106 accounts,
107 TokenInstruction::ScaledUiAmountExtension,
108 ScaledUiAmountMintInstruction::Initialize,
109 &InitializeInstructionData {
110 authority: authority.try_into()?,
111 multiplier: multiplier.into(),
112 },
113 ))
114}
115
116pub fn update_multiplier(
118 token_program_id: &Pubkey,
119 mint: &Pubkey,
120 authority: &Pubkey,
121 signers: &[&Pubkey],
122 multiplier: f64,
123 effective_timestamp: i64,
124) -> Result<Instruction, ProgramError> {
125 check_program_account(token_program_id)?;
126 let mut accounts = vec![
127 AccountMeta::new(*mint, false),
128 AccountMeta::new_readonly(*authority, signers.is_empty()),
129 ];
130 for signer_pubkey in signers.iter() {
131 accounts.push(AccountMeta::new_readonly(**signer_pubkey, true));
132 }
133 Ok(encode_instruction(
134 token_program_id,
135 accounts,
136 TokenInstruction::ScaledUiAmountExtension,
137 ScaledUiAmountMintInstruction::UpdateMultiplier,
138 &UpdateMultiplierInstructionData {
139 effective_timestamp: effective_timestamp.into(),
140 multiplier: multiplier.into(),
141 },
142 ))
143}