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
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**@}*/
							 |