2021-11-17 10:35:07 -08:00
|
|
|
//! Stable program log messages
|
|
|
|
//!
|
|
|
|
//! The format of these log messages should not be modified to avoid breaking downstream consumers
|
|
|
|
//! of program logging
|
2021-12-03 09:00:31 -08:00
|
|
|
use {
|
|
|
|
crate::{ic_logger_msg, log_collector::LogCollector},
|
|
|
|
itertools::Itertools,
|
|
|
|
solana_sdk::{instruction::InstructionError, pubkey::Pubkey},
|
|
|
|
std::{cell::RefCell, rc::Rc},
|
|
|
|
};
|
2021-11-17 10:35:07 -08:00
|
|
|
|
|
|
|
/// Log a program invoke.
|
|
|
|
///
|
|
|
|
/// The general form is:
|
|
|
|
///
|
|
|
|
/// ```notrust
|
|
|
|
/// "Program <address> invoke [<depth>]"
|
|
|
|
/// ```
|
2021-11-23 04:23:40 -08:00
|
|
|
pub fn program_invoke(
|
|
|
|
log_collector: &Option<Rc<RefCell<LogCollector>>>,
|
|
|
|
program_id: &Pubkey,
|
|
|
|
invoke_depth: usize,
|
|
|
|
) {
|
|
|
|
ic_logger_msg!(
|
|
|
|
log_collector,
|
|
|
|
"Program {} invoke [{}]",
|
|
|
|
program_id,
|
|
|
|
invoke_depth
|
|
|
|
);
|
2021-11-17 10:35:07 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Log a message from the program itself.
|
|
|
|
///
|
|
|
|
/// The general form is:
|
|
|
|
///
|
|
|
|
/// ```notrust
|
|
|
|
/// "Program log: <program-generated output>"
|
|
|
|
/// ```
|
|
|
|
///
|
|
|
|
/// That is, any program-generated output is guaranteed to be prefixed by "Program log: "
|
2021-11-23 04:23:40 -08:00
|
|
|
pub fn program_log(log_collector: &Option<Rc<RefCell<LogCollector>>>, message: &str) {
|
|
|
|
ic_logger_msg!(log_collector, "Program log: {}", message);
|
2021-11-17 10:35:07 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Emit a program data.
|
|
|
|
///
|
|
|
|
/// The general form is:
|
|
|
|
///
|
|
|
|
/// ```notrust
|
|
|
|
/// "Program data: <binary-data-in-base64>*"
|
|
|
|
/// ```
|
|
|
|
///
|
|
|
|
/// That is, any program-generated output is guaranteed to be prefixed by "Program data: "
|
2021-11-23 04:23:40 -08:00
|
|
|
pub fn program_data(log_collector: &Option<Rc<RefCell<LogCollector>>>, data: &[&[u8]]) {
|
2021-11-17 10:35:07 -08:00
|
|
|
ic_logger_msg!(
|
2021-11-23 04:23:40 -08:00
|
|
|
log_collector,
|
2021-11-17 10:35:07 -08:00
|
|
|
"Program data: {}",
|
|
|
|
data.iter().map(base64::encode).join(" ")
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Log return data as from the program itself. This line will not be present if no return
|
|
|
|
/// data was set, or if the return data was set to zero length.
|
|
|
|
///
|
|
|
|
/// The general form is:
|
|
|
|
///
|
|
|
|
/// ```notrust
|
|
|
|
/// "Program return: <program-id> <program-generated-data-in-base64>"
|
|
|
|
/// ```
|
|
|
|
///
|
|
|
|
/// That is, any program-generated output is guaranteed to be prefixed by "Program return: "
|
2021-11-23 04:23:40 -08:00
|
|
|
pub fn program_return(
|
|
|
|
log_collector: &Option<Rc<RefCell<LogCollector>>>,
|
|
|
|
program_id: &Pubkey,
|
|
|
|
data: &[u8],
|
|
|
|
) {
|
2021-11-17 10:35:07 -08:00
|
|
|
ic_logger_msg!(
|
2021-11-23 04:23:40 -08:00
|
|
|
log_collector,
|
2021-11-17 10:35:07 -08:00
|
|
|
"Program return: {} {}",
|
|
|
|
program_id,
|
|
|
|
base64::encode(data)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Log successful program execution.
|
|
|
|
///
|
|
|
|
/// The general form is:
|
|
|
|
///
|
|
|
|
/// ```notrust
|
|
|
|
/// "Program <address> success"
|
|
|
|
/// ```
|
2021-11-23 04:23:40 -08:00
|
|
|
pub fn program_success(log_collector: &Option<Rc<RefCell<LogCollector>>>, program_id: &Pubkey) {
|
|
|
|
ic_logger_msg!(log_collector, "Program {} success", program_id);
|
2021-11-17 10:35:07 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Log program execution failure
|
|
|
|
///
|
|
|
|
/// The general form is:
|
|
|
|
///
|
|
|
|
/// ```notrust
|
|
|
|
/// "Program <address> failed: <program error details>"
|
|
|
|
/// ```
|
|
|
|
pub fn program_failure(
|
2021-11-23 04:23:40 -08:00
|
|
|
log_collector: &Option<Rc<RefCell<LogCollector>>>,
|
2021-11-17 10:35:07 -08:00
|
|
|
program_id: &Pubkey,
|
|
|
|
err: &InstructionError,
|
|
|
|
) {
|
2021-11-23 04:23:40 -08:00
|
|
|
ic_logger_msg!(log_collector, "Program {} failed: {}", program_id, err);
|
2021-11-17 10:35:07 -08:00
|
|
|
}
|