Skip to main content

sbpf_runtime/cpi/builtins/
mod.rs

1pub mod system;
2
3use {
4    crate::{
5        cpi::request::CpiRequest,
6        errors::{RuntimeError, RuntimeResult},
7    },
8    solana_account::Account,
9    solana_address::Address,
10    solana_system_interface::program as system_program,
11    std::collections::HashMap,
12};
13
14pub const SYSTEM_PROGRAM_ID: Address = system_program::ID;
15
16pub fn is_builtin(program_id: &Address) -> bool {
17    *program_id == SYSTEM_PROGRAM_ID
18}
19
20pub fn execute_builtin(
21    program_id: &Address,
22    accounts: &mut HashMap<Address, Account>,
23    instruction: &CpiRequest,
24    signers: &[Address],
25    compute_remaining: u64,
26) -> RuntimeResult<u64> {
27    if *program_id == SYSTEM_PROGRAM_ID {
28        system::process(accounts, instruction, signers, compute_remaining)
29    } else {
30        Err(RuntimeError::BuiltinError(format!(
31            "unsupported builtin program: {}",
32            program_id
33        )))
34    }
35}
36
37#[cfg(test)]
38mod tests {
39    use super::*;
40
41    fn addr(seed: u8) -> Address {
42        Address::new_from_array([seed; 32])
43    }
44
45    #[test]
46    fn is_builtin_recognizes_system_program() {
47        assert!(is_builtin(&SYSTEM_PROGRAM_ID));
48    }
49
50    #[test]
51    fn is_builtin_rejects_other_programs() {
52        assert!(!is_builtin(&addr(9)));
53    }
54
55    #[test]
56    fn execute_builtin_rejects_unsupported_program() {
57        let mut accounts: HashMap<Address, Account> = HashMap::new();
58        let request = CpiRequest {
59            program_id: addr(9),
60            accounts: Vec::new(),
61            data: Vec::new(),
62            caller_accounts: Vec::new(),
63            signers: Vec::new(),
64        };
65        let err = execute_builtin(&addr(9), &mut accounts, &request, &[], 200_000).unwrap_err();
66        assert!(matches!(err, RuntimeError::BuiltinError(_)));
67        assert!(err.to_string().contains("unsupported builtin program"));
68    }
69}