96 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			96 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | #pragma once
 | ||
|  | /**
 | ||
|  |  * @brief Solana Cross-Program Invocation | ||
|  |  */ | ||
|  | 
 | ||
|  | #include <sol/types.h>
 | ||
|  | #include <sol/pubkey.h>
 | ||
|  | #include <sol/entrypoint.h>
 | ||
|  | 
 | ||
|  | #ifdef __cplusplus
 | ||
|  | extern "C" { | ||
|  | #endif
 | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Account Meta | ||
|  |  */ | ||
|  | typedef struct { | ||
|  |   SolPubkey *pubkey; /** An account's public key */ | ||
|  |   bool is_writable; /** True if the `pubkey` can be loaded as a read-write account */ | ||
|  |   bool is_signer; /** True if an Instruction requires a Transaction signature matching `pubkey` */ | ||
|  | } SolAccountMeta; | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Instruction | ||
|  |  */ | ||
|  | typedef struct { | ||
|  |   SolPubkey *program_id; /** Pubkey of the instruction processor that executes this instruction */ | ||
|  |   SolAccountMeta *accounts; /** Metadata for what accounts should be passed to the instruction processor */ | ||
|  |   uint64_t account_len; /** Number of SolAccountMetas */ | ||
|  |   uint8_t *data; /** Opaque data passed to the instruction processor */ | ||
|  |   uint64_t data_len; /** Length of the data in bytes */ | ||
|  | } SolInstruction; | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Internal cross-program invocation function | ||
|  |  */ | ||
|  | uint64_t sol_invoke_signed_c( | ||
|  |   const SolInstruction *instruction, | ||
|  |   const SolAccountInfo *account_infos, | ||
|  |   int account_infos_len, | ||
|  |   const SolSignerSeeds *signers_seeds, | ||
|  |   int signers_seeds_len | ||
|  | ); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * Invoke another program and sign for some of the keys | ||
|  |  * | ||
|  |  * @param instruction Instruction to process | ||
|  |  * @param account_infos Accounts used by instruction | ||
|  |  * @param account_infos_len Length of account_infos array | ||
|  |  * @param seeds Seed bytes used to sign program accounts | ||
|  |  * @param seeds_len Length of the seeds array | ||
|  |  */ | ||
|  | static uint64_t sol_invoke_signed( | ||
|  |     const SolInstruction *instruction, | ||
|  |     const SolAccountInfo *account_infos, | ||
|  |     int account_infos_len, | ||
|  |     const SolSignerSeeds *signers_seeds, | ||
|  |     int signers_seeds_len | ||
|  | ) { | ||
|  |   return sol_invoke_signed_c( | ||
|  |     instruction, | ||
|  |     account_infos, | ||
|  |     account_infos_len, | ||
|  |     signers_seeds, | ||
|  |     signers_seeds_len | ||
|  |   ); | ||
|  | } | ||
|  | /**
 | ||
|  |  * Invoke another program | ||
|  |  * | ||
|  |  * @param instruction Instruction to process | ||
|  |  * @param account_infos Accounts used by instruction | ||
|  |  * @param account_infos_len Length of account_infos array | ||
|  | */ | ||
|  | static uint64_t sol_invoke( | ||
|  |     const SolInstruction *instruction, | ||
|  |     const SolAccountInfo *account_infos, | ||
|  |     int account_infos_len | ||
|  | ) { | ||
|  |   const SolSignerSeeds signers_seeds[] = {{}}; | ||
|  |   return sol_invoke_signed( | ||
|  |     instruction, | ||
|  |     account_infos, | ||
|  |     account_infos_len, | ||
|  |     signers_seeds, | ||
|  |     0 | ||
|  |   ); | ||
|  | } | ||
|  | 
 | ||
|  | #ifdef __cplusplus
 | ||
|  | } | ||
|  | #endif
 | ||
|  | 
 | ||
|  | /**@}*/ |