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