Skip to main content

dlp/
lib.rs

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}