1#![allow(unexpected_cfgs)]
2
3extern crate dlp_api;
4#[allow(unused_imports)]
5pub(crate) use dlp_api::diff;
6#[allow(unused_imports)]
7pub(crate) use dlp_api::{
8 account_size_class, args, compact, consts, discriminator, error, pda,
9 pod_view, requires, state,
10};
11#[allow(unused_imports)]
12pub(crate) use dlp_api::{
13 commit_record_seeds_from_delegated_account,
14 commit_state_seeds_from_delegated_account,
15 delegate_buffer_seeds_from_delegated_account,
16 delegation_metadata_seeds_from_delegated_account,
17 delegation_record_seeds_from_delegated_account,
18 ephemeral_balance_seeds_from_payer, fees_vault_seeds,
19 magic_fee_vault_seeds_from_validator, program_config_seeds_from_program_id,
20 undelegate_buffer_seeds_from_delegated_account,
21 validator_fees_vault_seeds_from_validator,
22};
23#[allow(unused_imports)]
24pub(crate) use dlp_api::{id, ID};
25#[allow(unused_imports)]
26pub(crate) use dlp_api::{
27 require, require_eq, require_eq_keys, require_ge, require_gt,
28 require_initialized_pda, require_initialized_pda_fast, require_le,
29 require_lt, require_n_accounts, require_n_accounts_with_optionals,
30 require_owned_by, require_pda, require_signer, require_some,
31};
32#[cfg(feature = "logging")]
33use solana_program::msg;
34#[cfg(feature = "processor")]
35use {
36 dlp_api::discriminator::DlpDiscriminator,
37 solana_program::{
38 account_info::AccountInfo, entrypoint::ProgramResult,
39 program_error::ProgramError, pubkey::Pubkey,
40 },
41};
42
43#[cfg(feature = "processor")]
44mod processor;
45
46#[allow(unused_imports)]
47pub(crate) use diff::*;
48
49#[cfg(feature = "log-cost")]
50mod cu;
51
52#[cfg(all(feature = "entrypoint", not(feature = "no-entrypoint")))]
53mod entrypoint;
54
55#[cfg(any(feature = "processor", feature = "pinocchio-rt"))]
56pub(crate) mod fast {
57 pinocchio::address::declare_id!(
58 "DELeGGvXpWV2fqJUhqcF5ZSYMS4JTLjteaAMARRSaeSh"
59 );
60}
61
62#[cfg(feature = "solana-security-txt")]
63solana_security_txt::security_txt! {
64 name: "MagicBlock Delegation Program",
65 project_url: "https://magicblock.xyz",
66 contacts: "email:dev@magicblock.gg,twitter:@magicblock",
67 policy: "https://github.com/magicblock-labs/delegation-program/blob/master/LICENSE.md",
68 preferred_languages: "en",
69 source_code: "https://github.com/magicblock-labs/delegation-program"
70}
71
72#[cfg(feature = "processor")]
73pub fn fast_process_instruction(
74 program_id: &pinocchio::Address,
75 accounts: &[pinocchio::AccountView],
76 data: &[u8],
77) -> Option<pinocchio::ProgramResult> {
78 if data.len() < 8 {
79 return Some(Err(
80 pinocchio::error::ProgramError::InvalidInstructionData,
81 ));
82 }
83
84 let (discriminator_bytes, data) = data.split_at(8);
85
86 let discriminator = match DlpDiscriminator::try_from(discriminator_bytes[0])
87 {
88 Ok(discriminator) => discriminator,
89 Err(_) => {
90 pinocchio_log::log!("Failed to read and parse discriminator");
91 return Some(Err(
92 pinocchio::error::ProgramError::InvalidInstructionData,
93 ));
94 }
95 };
96
97 #[cfg(feature = "logging")]
98 msg!("Processing instruction: {:?}", discriminator);
99
100 match discriminator {
101 DlpDiscriminator::Delegate => Some(processor::fast::process_delegate(
102 program_id, accounts, data,
103 )),
104 DlpDiscriminator::DelegateWithAnyValidator => {
105 Some(processor::fast::process_delegate_with_any_validator(
106 program_id, accounts, data,
107 ))
108 }
109 DlpDiscriminator::DelegateWithActions => {
110 Some(processor::fast::process_delegate_with_actions(
111 program_id, accounts, data,
112 ))
113 }
114 DlpDiscriminator::CommitState => Some(
115 processor::fast::process_commit_state(program_id, accounts, data),
116 ),
117 DlpDiscriminator::CommitStateFromBuffer => {
118 Some(processor::fast::process_commit_state_from_buffer(
119 program_id, accounts, data,
120 ))
121 }
122 DlpDiscriminator::CommitDiff => Some(
123 processor::fast::process_commit_diff(program_id, accounts, data),
124 ),
125 DlpDiscriminator::CommitDiffFromBuffer => {
126 Some(processor::fast::process_commit_diff_from_buffer(
127 program_id, accounts, data,
128 ))
129 }
130 DlpDiscriminator::CommitFinalize => {
131 Some(processor::fast::process_commit_finalize(
132 program_id, accounts, data,
133 ))
134 }
135 DlpDiscriminator::CommitFinalizeFromBuffer => {
136 Some(processor::fast::process_commit_finalize_from_buffer(
137 program_id, accounts, data,
138 ))
139 }
140 DlpDiscriminator::Finalize => Some(processor::fast::process_finalize(
141 program_id, accounts, data,
142 )),
143 DlpDiscriminator::Undelegate => Some(
144 processor::fast::process_undelegate(program_id, accounts, data),
145 ),
146 DlpDiscriminator::UndelegateConfinedAccount => {
147 Some(processor::fast::process_undelegate_confined_account(
148 program_id, accounts, data,
149 ))
150 }
151 _ => None,
152 }
153}
154
155#[cfg(feature = "processor")]
156pub fn slow_process_instruction(
157 program_id: &Pubkey,
158 accounts: &[AccountInfo],
159 data: &[u8],
160) -> ProgramResult {
161 if data.len() < 8 {
162 return Err(ProgramError::InvalidInstructionData);
163 }
164
165 let (tag, data) = data.split_at(8);
166 let ix = DlpDiscriminator::try_from(tag[0])
167 .or(Err(ProgramError::InvalidInstructionData))?;
168
169 match ix {
170 DlpDiscriminator::InitMagicFeeVault => {
171 processor::process_init_magic_fee_vault(program_id, accounts, data)?
172 }
173 DlpDiscriminator::InitValidatorFeesVault => {
174 processor::process_init_validator_fees_vault(
175 program_id, accounts, data,
176 )?
177 }
178 DlpDiscriminator::InitProtocolFeesVault => {
179 processor::process_init_protocol_fees_vault(
180 program_id, accounts, data,
181 )?
182 }
183 DlpDiscriminator::ValidatorClaimFees => {
184 processor::process_validator_claim_fees(program_id, accounts, data)?
185 }
186 DlpDiscriminator::WhitelistValidatorForProgram => {
187 processor::process_whitelist_validator_for_program(
188 program_id, accounts, data,
189 )?
190 }
191 DlpDiscriminator::TopUpEphemeralBalance => {
192 processor::process_top_up_ephemeral_balance(
193 program_id, accounts, data,
194 )?
195 }
196 DlpDiscriminator::DelegateEphemeralBalance => {
197 processor::process_delegate_ephemeral_balance(
198 program_id, accounts, data,
199 )?
200 }
201 DlpDiscriminator::DelegateMagicFeeVault => {
202 processor::process_delegate_magic_fee_vault(
203 program_id, accounts, data,
204 )?
205 }
206 DlpDiscriminator::CloseEphemeralBalance => {
207 processor::process_close_ephemeral_balance(
208 program_id, accounts, data,
209 )?
210 }
211 DlpDiscriminator::ProtocolClaimFees => {
212 processor::process_protocol_claim_fees(program_id, accounts, data)?
213 }
214 DlpDiscriminator::CloseValidatorFeesVault => {
215 processor::process_close_validator_fees_vault(
216 program_id, accounts, data,
217 )?
218 }
219 DlpDiscriminator::CallHandler => {
220 processor::process_call_handler(program_id, accounts, data)?
221 }
222 DlpDiscriminator::CallHandlerV2 => {
223 processor::process_call_handler_v2(program_id, accounts, data)?
224 }
225 _ => {
226 #[cfg(feature = "logging")]
227 msg!("PANIC: Instruction must be processed by fast_process_instruction");
228 return Err(ProgramError::InvalidInstructionData);
229 }
230 }
231 Ok(())
232}