Expand description
Oculi — structured, Borsh-serialized Anchor events for Solana programs.
§Why this exists
Solana programs rely on msg! for observability, but msg! performs string
formatting on-chain. For a swap instruction logging an amount and a pubkey,
msg! costs roughly 11,000 CU. Oculi replaces that with a single
emit! call over a Borsh-serialized struct, cutting the same log entry to
~781 CU — a 92.96% reduction.
The emitted events are standard Anchor events, visible as Program data:
entries in transaction metadata and decodable by any Borsh-aware client.
§Quick start
ⓘ
use anchor_lang::prelude::*;
use oculi::{log_info, log_warn};
#[derive(AnchorSerialize, AnchorDeserialize)]
pub struct SwapExecuted {
pub amount: u64,
pub user: Pubkey,
}
pub fn swap(ctx: Context<Swap>, amount: u64) -> Result<()> {
log_info!("swap_executed", SwapExecuted {
amount,
user: ctx.accounts.user.key(),
});
Ok(())
}§Feature flags
| Flag | Default | Effect |
|---|---|---|
devnet-only | off | Compiles out all emit! calls. Enable in mainnet builds. |
no-entrypoint | off | Passes through to anchor-lang/no-entrypoint. |
Re-exports§
pub use event::OculiEvent;pub use level::LogLevel;
Modules§
Macros§
- log
- Emits a structured
OculiEventwith a Borsh-serialized payload. - log_
debug - Emits an
OculiEventatLogLevel::Debug. - log_
error - Emits an
OculiEventatLogLevel::Error. - log_
info - Emits an
OculiEventatLogLevel::Info. - log_
warn - Emits an
OculiEventatLogLevel::Warn.