Skip to main content

solana_syscalls/
cpi.rs

1use {
2    super::*,
3    solana_instruction::Instruction,
4    solana_program_runtime::cpi::{
5        SyscallInvokeSigned, TranslatedAccount, cpi_common, translate_accounts_c,
6        translate_accounts_rust, translate_instruction_c, translate_instruction_rust,
7    },
8};
9
10declare_builtin_function!(
11    /// Cross-program invocation called from Rust
12    SyscallInvokeSignedRust,
13    fn rust(
14        invoke_context: &mut InvokeContext<'_, '_>,
15        instruction_addr: u64,
16        account_infos_addr: u64,
17        account_infos_len: u64,
18        signers_seeds_addr: u64,
19        signers_seeds_len: u64,
20    ) -> Result<u64, Error> {
21        cpi_common::<Self>(
22            invoke_context,
23            instruction_addr,
24            account_infos_addr,
25            account_infos_len,
26            signers_seeds_addr,
27            signers_seeds_len,
28        )
29    }
30);
31
32impl SyscallInvokeSigned for SyscallInvokeSignedRust {
33    fn translate_instruction(
34        addr: u64,
35        invoke_context: &InvokeContext,
36    ) -> Result<Instruction, Error> {
37        translate_instruction_rust(addr, invoke_context)
38    }
39
40    fn translate_accounts<'a>(
41        account_infos_addr: u64,
42        account_infos_len: u64,
43        invoke_context: &InvokeContext,
44    ) -> Result<Vec<TranslatedAccount<'a>>, Error> {
45        translate_accounts_rust(account_infos_addr, account_infos_len, invoke_context)
46    }
47}
48
49declare_builtin_function!(
50    /// Cross-program invocation called from C
51    SyscallInvokeSignedC,
52    fn rust(
53        invoke_context: &mut InvokeContext<'_, '_>,
54        instruction_addr: u64,
55        account_infos_addr: u64,
56        account_infos_len: u64,
57        signers_seeds_addr: u64,
58        signers_seeds_len: u64,
59    ) -> Result<u64, Error> {
60        cpi_common::<Self>(
61            invoke_context,
62            instruction_addr,
63            account_infos_addr,
64            account_infos_len,
65            signers_seeds_addr,
66            signers_seeds_len,
67        )
68    }
69);
70
71impl SyscallInvokeSigned for SyscallInvokeSignedC {
72    fn translate_instruction(
73        addr: u64,
74        invoke_context: &InvokeContext,
75    ) -> Result<Instruction, Error> {
76        translate_instruction_c(addr, invoke_context)
77    }
78
79    fn translate_accounts<'a>(
80        account_infos_addr: u64,
81        account_infos_len: u64,
82        invoke_context: &InvokeContext,
83    ) -> Result<Vec<TranslatedAccount<'a>>, Error> {
84        translate_accounts_c(account_infos_addr, account_infos_len, invoke_context)
85    }
86}