sbpf_runtime/cpi/builtins/
mod.rs1pub 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}