Skip to content

Add support for printing logs to terminal in pinocchio template #305

@adpthegreat

Description

@adpthegreat

in my project, i modified the helpers in setup.rs to something like this

pub fn send_transaction(
        &mut self,
        instruction: Instruction,
        signers: &[&Keypair],
    ) -> Result<u64, Box<dyn std::error::Error>> {
        match self.send_transaction_inner(instruction, signers) {
            Ok((cu, logs)) => {
                if std::env::var("TX_LOGS").is_ok() {
                    println!("[TX OK] logs:\n{}", logs.join("\n"));
                }
                Ok(cu)
            }
            Err((err, logs)) => {
                if std::env::var("TX_LOGS").is_ok() {
                    println!("[TX ERR] logs:\n{}", logs.join("\n"));
                }
                Err(format!("Transaction failed: {:?}", err).into())
            }
        }
    }

    pub fn send_transaction_expect_error(
        &mut self,
        instruction: Instruction,
        signers: &[&Keypair],
    ) -> TransactionError {
        match self.send_transaction_inner(instruction, signers) {
            Ok((_, logs)) => {
                if std::env::var("TX_LOGS").is_ok() {
                    println!("[TX OK - unexpected] logs:\n{}", logs.join("\n"));
                }
                panic!("Transaction should fail");
            }
            Err((err, logs)) => {
                if std::env::var("TX_LOGS").is_ok() {
                    println!("[TX ERR] logs:\n{}", logs.join("\n"));
                }
                err
            }
        }
    }

    fn send_transaction_inner(
        &mut self,
        instruction: Instruction,
        signers: &[&Keypair],
    ) -> Result<(u64, Vec<String>), (TransactionError, Vec<String>)> {
        let mut all_signers = vec![&self.payer as &dyn Signer];
        all_signers.extend(signers.iter().map(|k| *k as &dyn Signer));

        let transaction = Transaction::new_signed_with_payer(
            &[instruction],
            Some(&self.payer.pubkey()),
            &all_signers,
            self.svm.latest_blockhash(),
        );

        match self.svm.send_transaction(transaction) {
            Ok(meta) => Ok((meta.compute_units_consumed, meta.logs)),
            Err(failed) => Err((failed.err, failed.meta.logs)),
        }
    }

So i can be able to print logs to the terminal when i test my code, and not just test passing cases, so i run

TX_LOGS=1 cargo test test_name -- --nocapture

and i get tx logs

running 1 test
[TX OK] logs:
Program 11111111111111111111111111111111 invoke [1]
Program 11111111111111111111111111111111 success
[TX OK] logs:
Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA invoke [1]
Program log: Instruction: InitializeMint
Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA consumed 2920 of 200000 compute units
Program TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA success
[TX OK] logs:
Program 11111111111111111111111111111111 invoke [1]
Program 11111111111111111111111111111111 success
[TX OK] logs:

it will be great to incorporate something like this, its really helpful

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions