Skip to content

Commit

Permalink
Add get_minimum_delegation_data() helper function
Browse files Browse the repository at this point in the history
  • Loading branch information
brooksprumo committed Apr 11, 2022
1 parent f7b00ad commit 9e36279
Show file tree
Hide file tree
Showing 7 changed files with 97 additions and 0 deletions.
7 changes: 7 additions & 0 deletions programs/bpf/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions programs/bpf/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ members = [
"rust/error_handling",
"rust/log_data",
"rust/external_spend",
"rust/get_minimum_delegation_data",
"rust/finalize",
"rust/instruction_introspection",
"rust/invoke",
Expand Down
1 change: 1 addition & 0 deletions programs/bpf/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ fn main() {
"log_data",
"external_spend",
"finalize",
"get_minimum_delegation_data",
"instruction_introspection",
"invoke",
"invoke_and_error",
Expand Down
19 changes: 19 additions & 0 deletions programs/bpf/rust/get_minimum_delegation_data/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
[package]
name = "solana-bpf-rust-get-minimum-delegation-data"
version = "1.11.0"
description = "Solana BPF test program written in Rust"
authors = ["Solana Maintainers <[email protected]>"]
repository = "https://github.com/solana-labs/solana"
license = "Apache-2.0"
homepage = "https://solana.com/"
documentation = "https://docs.rs/solana-bpf-rust-get-minimum-delegation-data"
edition = "2021"

[dependencies]
solana-program = { path = "../../../../sdk/program", version = "=1.11.0" }

[lib]
crate-type = ["cdylib"]

[package.metadata.docs.rs]
targets = ["x86_64-unknown-linux-gnu"]
24 changes: 24 additions & 0 deletions programs/bpf/rust/get_minimum_delegation_data/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
//! Example/test program for calling GetMinimumDelegation and then the
//! helper function to return the minimum delegation value.
#![allow(unreachable_code)]

extern crate solana_program;
use solana_program::{
account_info::AccountInfo, entrypoint::ProgramResult, program, pubkey::Pubkey, stake,
};

solana_program::entrypoint!(process_instruction);
#[allow(clippy::unnecessary_wraps)]
fn process_instruction(
_program_id: &Pubkey,
_accounts: &[AccountInfo],
_instruction_data: &[u8],
) -> ProgramResult {
let get_minimum_delegation_instruction = stake::instruction::get_minimum_delegation();
program::invoke(&get_minimum_delegation_instruction, &[]).unwrap();

let minimum_delegation = stake::instruction::utils::get_minimum_delegation_data();
assert!(minimum_delegation.is_some());
Ok(())
}
30 changes: 30 additions & 0 deletions programs/bpf/tests/programs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ use {
pubkey::Pubkey,
rent::Rent,
signature::{keypair_from_seed, Keypair, Signer},
stake,
system_instruction::{self, MAX_PERMITTED_DATA_LENGTH},
system_program,
sysvar::{self, clock, rent},
Expand Down Expand Up @@ -3524,3 +3525,32 @@ fn test_program_fees() {
let post_balance = bank_client.get_balance(&mint_keypair.pubkey()).unwrap();
assert_eq!(pre_balance - post_balance, expected_min_fee);
}

#[test]
#[cfg(feature = "bpf_rust")]
fn test_get_minimum_delegation_data() {
let GenesisConfigInfo {
genesis_config,
mint_keypair,
..
} = create_genesis_config(100_123_456_789);
let mut bank = Bank::new_for_tests(&genesis_config);
bank.feature_set = Arc::new(FeatureSet::all_enabled());

let (name, id, entrypoint) = solana_bpf_loader_program!();
bank.add_builtin(&name, &id, entrypoint);
let bank = Arc::new(bank);
let bank_client = BankClient::new_shared(&bank);

let program_id = load_bpf_program(
&bank_client,
&bpf_loader::id(),
&mint_keypair,
"solana_bpf_rust_get_minimum_delegation_data",
);

let account_metas = vec![AccountMeta::new_readonly(stake::program::id(), false)];
let instruction = Instruction::new_with_bytes(program_id, &[], account_metas);
let result = bank_client.send_and_confirm_instruction(&mint_keypair, instruction);
assert!(result.is_ok());
}
15 changes: 15 additions & 0 deletions sdk/program/src/stake/instruction.rs
Original file line number Diff line number Diff line change
Expand Up @@ -695,6 +695,21 @@ pub fn get_minimum_delegation() -> Instruction {
)
}

pub mod utils {
/// Helper function for programs to get the actual data after calling GetMinimumDelegation
///
/// This fn handles calling `get_return_data()`, ensures the result is from the correct
/// program, and returns the correct type. Returns `None` otherwise.
pub fn get_minimum_delegation_data() -> Option<u64> {
solana_program::program::get_return_data()
.and_then(|(program_id, return_data)| {
(program_id == crate::stake::program::id()).then(|| return_data)
})
.and_then(|return_data| return_data.try_into().ok())
.map(|return_data| u64::from_le_bytes(return_data))
}
}

#[cfg(test)]
mod tests {
use {super::*, crate::instruction::InstructionError};
Expand Down

0 comments on commit 9e36279

Please sign in to comment.