Prueba Completa
tests/cpi_test.rs
use litesvm::LiteSVM;use solana_sdk::{instruction::{AccountMeta, Instruction},pubkey::Pubkey,signature::{Keypair, Signer},transaction::Transaction,system_program,};#[test]fn test_cross_program_invocation() {let mut svm = LiteSVM::new();// Deploy both programslet caller_program = Pubkey::new_unique();let callee_program = Pubkey::new_unique();svm.add_program(caller_program,include_bytes!("../target/deploy/caller.so")).unwrap();svm.add_program(callee_program,include_bytes!("../target/deploy/callee.so")).unwrap();// Setup accountslet payer = Keypair::new();svm.airdrop(&payer.pubkey(), 10_000_000_000).unwrap();// Create instruction that will trigger CPIlet instruction = Instruction {program_id: caller_program,accounts: vec![AccountMeta::new(payer.pubkey(), true),AccountMeta::new_readonly(callee_program, false),AccountMeta::new_readonly(system_program::id(), false),],data: vec![1], // Instruction to trigger CPI};let tx = Transaction::new_signed_with_payer(&[instruction],Some(&payer.pubkey()),&[&payer],svm.latest_blockhash(),);let result = svm.send_transaction(tx).unwrap();// Verify both programs were invokedassert!(result.logs.iter().any(|log|log.contains(&format!("Program {} invoke", caller_program))));assert!(result.logs.iter().any(|log|log.contains(&format!("Program {} invoke", callee_program))));println!("CPI successful!");println!("Logs showing both programs:");for log in &result.logs {if log.contains("invoke") {println!(" {}", log);}}}
Puntos Clave
- Múltiples Programas: Despliega todos los programas involucrados en la cadena de CPI
- IDs de Programa: Pasa el ID del programa receptor como una cuenta en la instrucción
- System Program: A menudo necesario para operaciones de CPI (transferencias, creación de cuentas, etc.)
- Verificación de Logs: Revisa los logs para verificar que todos los programas en la cadena de llamadas se ejecutaron
Para información más detallada sobre el despliegue, lee esta sección.
Entendiendo los Logs de CPI
Cuando ocurre un Cross Program Invocation, verás logs como:
Program A invoke [1]Program B invoke [2]Program B successProgram A success
Los números entre corchetes indican la profundidad de la llamada.
Is this page helpful?