agave_syscalls/
cpi.rs

1use {
2    super::*,
3    solana_instruction::Instruction,
4    solana_program_runtime::cpi::{
5        cpi_common, translate_accounts_c, translate_accounts_rust, translate_instruction_c,
6        translate_instruction_rust, translate_signers_c, translate_signers_rust,
7        SyscallInvokeSigned, TranslatedAccount,
8    },
9};
10
11declare_builtin_function!(
12    /// Cross-program invocation called from Rust
13    SyscallInvokeSignedRust,
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        memory_mapping: &mut MemoryMapping,
22    ) -> Result<u64, Error> {
23        cpi_common::<Self>(
24            invoke_context,
25            instruction_addr,
26            account_infos_addr,
27            account_infos_len,
28            signers_seeds_addr,
29            signers_seeds_len,
30            memory_mapping,
31        )
32    }
33);
34
35impl SyscallInvokeSigned for SyscallInvokeSignedRust {
36    fn translate_instruction(
37        addr: u64,
38        memory_mapping: &MemoryMapping,
39        invoke_context: &mut InvokeContext,
40        check_aligned: bool,
41    ) -> Result<Instruction, Error> {
42        translate_instruction_rust(addr, memory_mapping, invoke_context, check_aligned)
43    }
44
45    fn translate_accounts<'a>(
46        account_infos_addr: u64,
47        account_infos_len: u64,
48        memory_mapping: &MemoryMapping<'_>,
49        invoke_context: &mut InvokeContext,
50        check_aligned: bool,
51    ) -> Result<Vec<TranslatedAccount<'a>>, Error> {
52        translate_accounts_rust(
53            account_infos_addr,
54            account_infos_len,
55            memory_mapping,
56            invoke_context,
57            check_aligned,
58        )
59    }
60
61    fn translate_signers(
62        program_id: &Pubkey,
63        signers_seeds_addr: u64,
64        signers_seeds_len: u64,
65        memory_mapping: &MemoryMapping,
66        check_aligned: bool,
67    ) -> Result<Vec<Pubkey>, Error> {
68        translate_signers_rust(
69            program_id,
70            signers_seeds_addr,
71            signers_seeds_len,
72            memory_mapping,
73            check_aligned,
74        )
75    }
76}
77
78declare_builtin_function!(
79    /// Cross-program invocation called from C
80    SyscallInvokeSignedC,
81    fn rust(
82        invoke_context: &mut InvokeContext,
83        instruction_addr: u64,
84        account_infos_addr: u64,
85        account_infos_len: u64,
86        signers_seeds_addr: u64,
87        signers_seeds_len: u64,
88        memory_mapping: &mut MemoryMapping,
89    ) -> Result<u64, Error> {
90        cpi_common::<Self>(
91            invoke_context,
92            instruction_addr,
93            account_infos_addr,
94            account_infos_len,
95            signers_seeds_addr,
96            signers_seeds_len,
97            memory_mapping,
98        )
99    }
100);
101
102impl SyscallInvokeSigned for SyscallInvokeSignedC {
103    fn translate_instruction(
104        addr: u64,
105        memory_mapping: &MemoryMapping,
106        invoke_context: &mut InvokeContext,
107        check_aligned: bool,
108    ) -> Result<Instruction, Error> {
109        translate_instruction_c(addr, memory_mapping, invoke_context, check_aligned)
110    }
111
112    fn translate_accounts<'a>(
113        account_infos_addr: u64,
114        account_infos_len: u64,
115        memory_mapping: &MemoryMapping<'_>,
116        invoke_context: &mut InvokeContext,
117        check_aligned: bool,
118    ) -> Result<Vec<TranslatedAccount<'a>>, Error> {
119        translate_accounts_c(
120            account_infos_addr,
121            account_infos_len,
122            memory_mapping,
123            invoke_context,
124            check_aligned,
125        )
126    }
127
128    fn translate_signers(
129        program_id: &Pubkey,
130        signers_seeds_addr: u64,
131        signers_seeds_len: u64,
132        memory_mapping: &MemoryMapping,
133        check_aligned: bool,
134    ) -> Result<Vec<Pubkey>, Error> {
135        translate_signers_c(
136            program_id,
137            signers_seeds_addr,
138            signers_seeds_len,
139            memory_mapping,
140            check_aligned,
141        )
142    }
143}