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
10pub 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
50pub 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}