Skip to content

Commit 4b8f37d

Browse files
committed
feat: Impl V2 Delegate
1 parent 3432395 commit 4b8f37d

13 files changed

Lines changed: 949 additions & 2 deletions

File tree

src/lib.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ pub mod state;
3434

3535
mod account_size_class;
3636

37+
mod v2;
38+
3739
pub use account_size_class::*;
3840

3941
#[cfg(not(feature = "sdk"))]
@@ -79,6 +81,8 @@ pub fn fast_process_instruction(
7981
accounts: &[pinocchio::AccountView],
8082
data: &[u8],
8183
) -> Option<pinocchio::ProgramResult> {
84+
use crate::v2::DlpInstruction;
85+
8286
if data.len() < 8 {
8387
return Some(Err(
8488
pinocchio::error::ProgramError::InvalidInstructionData,
@@ -87,6 +91,11 @@ pub fn fast_process_instruction(
8791

8892
let (discriminator_bytes, data) = data.split_at(8);
8993

94+
if discriminator_bytes[0] >= DlpInstruction::Delegate as u8 {
95+
use crate::v2::v2_process_instruction;
96+
return Some(v2_process_instruction(accounts, data));
97+
}
98+
9099
let discriminator = match DlpDiscriminator::try_from(discriminator_bytes[0])
91100
{
92101
Ok(discriminator) => discriminator,

src/processor/fast/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ mod delegate;
88
mod finalize;
99
mod undelegate;
1010
mod undelegate_confined_account;
11-
mod utils;
11+
pub mod utils;
1212

1313
pub(crate) mod internal;
1414

src/processor/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ mod init_protocol_fees_vault;
77
mod init_validator_fees_vault;
88
mod protocol_claim_fees;
99
mod top_up_ephemeral_balance;
10-
mod utils;
10+
pub mod utils;
1111
mod validator_claim_fees;
1212
mod whitelist_validator_for_program;
1313

src/v2/instruction.rs

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
use num_enum::TryFromPrimitive;
2+
use pinocchio::{error::ProgramError, ProgramResult};
3+
use strum::IntoStaticStr;
4+
5+
#[repr(u8)]
6+
#[derive(Clone, Copy, Debug, Eq, PartialEq, TryFromPrimitive, IntoStaticStr)]
7+
#[rustfmt::skip]
8+
pub enum DlpInstruction {
9+
///
10+
/// Delegate group: [101, 110] => 10 slots
11+
///
12+
Delegate = 101,
13+
DelegateWithAnyValidator = 102,
14+
15+
///
16+
/// Commit group: [111, 120] => 10 slots
17+
///
18+
Commit = 111,
19+
CommitFromBuffer = 112,
20+
CommitFinalize = 113,
21+
CommitFinalizeFromBuffer = 114,
22+
23+
///
24+
/// Finalize group: [121, 130] => 10 slots
25+
///
26+
Finalize = 121,
27+
28+
///
29+
/// Undelegate group: [131, 140] => 10 slots
30+
///
31+
Undelegate = 131,
32+
UndelegateConfinedAccount = 132,
33+
34+
///
35+
/// User group: [141, 150] => 10 slots
36+
///
37+
CallHandler = 141,
38+
39+
///
40+
/// Vaults group: [151, 160] => 10 slots
41+
///
42+
InitProtocolFeesVault = 151,
43+
ProtocolClaimFees = 152,
44+
InitValidatorFeesVault = 153,
45+
ValidatorClaimFees = 154,
46+
CloseValidatorFeesVault = 155,
47+
48+
///
49+
/// Misc group: [161, 180] => 20 slots
50+
///
51+
WhitelistValidatorForProgram = 161,
52+
TopUpEphemeralBalance = 162,
53+
DelegateEphemeralBalance = 163,
54+
CloseEphemeralBalance = 164,
55+
}
56+
57+
impl DlpInstruction {
58+
pub fn to_vec(self) -> Vec<u8> {
59+
let num = self as u64;
60+
num.to_le_bytes().to_vec()
61+
}
62+
63+
pub fn name(&self) -> &'static str {
64+
self.into()
65+
}
66+
}
67+
68+
pub fn v2_process_instruction(
69+
accounts: &[pinocchio::AccountView],
70+
data: &[u8],
71+
) -> ProgramResult {
72+
let (ix, data) = data.split_at(8);
73+
74+
let ix = match DlpInstruction::try_from(ix[0]) {
75+
Ok(discriminator) => discriminator,
76+
Err(_) => {
77+
pinocchio_log::log!("Failed to read and parse discriminator");
78+
return Err(pinocchio::error::ProgramError::InvalidInstructionData);
79+
}
80+
};
81+
82+
use super::processor::*;
83+
84+
let coming_soon = || {
85+
solana_program::msg!("Instruction {:#?} not yet implemented", ix);
86+
return Err(ProgramError::InvalidInstructionData);
87+
};
88+
89+
match ix {
90+
DlpInstruction::Delegate => process_delegate(accounts, data),
91+
DlpInstruction::DelegateWithAnyValidator => {
92+
process_delegate_with_any_validator(accounts, data)
93+
}
94+
DlpInstruction::Commit => coming_soon(),
95+
DlpInstruction::CommitFromBuffer => coming_soon(),
96+
DlpInstruction::CommitFinalize => coming_soon(),
97+
DlpInstruction::CommitFinalizeFromBuffer => coming_soon(),
98+
DlpInstruction::Finalize => coming_soon(),
99+
DlpInstruction::Undelegate => coming_soon(),
100+
DlpInstruction::UndelegateConfinedAccount => coming_soon(),
101+
DlpInstruction::CallHandler => coming_soon(),
102+
DlpInstruction::InitProtocolFeesVault => coming_soon(),
103+
DlpInstruction::ProtocolClaimFees => coming_soon(),
104+
DlpInstruction::InitValidatorFeesVault => coming_soon(),
105+
DlpInstruction::ValidatorClaimFees => coming_soon(),
106+
DlpInstruction::CloseValidatorFeesVault => coming_soon(),
107+
DlpInstruction::WhitelistValidatorForProgram => coming_soon(),
108+
DlpInstruction::TopUpEphemeralBalance => coming_soon(),
109+
DlpInstruction::DelegateEphemeralBalance => coming_soon(),
110+
DlpInstruction::CloseEphemeralBalance => coming_soon(),
111+
}
112+
}

src/v2/mod.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
mod instruction;
2+
mod processor;
3+
mod requires;
4+
mod state;
5+
6+
pub use instruction::*;
7+
pub use processor::*;
8+
pub use requires::*;
9+
pub use state::*;

src/v2/processor/delegate.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
use pinocchio::{AccountView, ProgramResult};
2+
3+
use crate::v2::processor::internal::process_delegate_internal;
4+
5+
pub fn process_delegate(
6+
accounts: &[AccountView],
7+
data: &[u8],
8+
) -> ProgramResult {
9+
process_delegate_internal::<false>(accounts, data)
10+
}
11+
12+
///
13+
/// delegates an account while allowing any validator identity
14+
///
15+
pub fn process_delegate_with_any_validator(
16+
accounts: &[AccountView],
17+
data: &[u8],
18+
) -> ProgramResult {
19+
process_delegate_internal::<true>(accounts, data)
20+
}

0 commit comments

Comments
 (0)