Skip to content

Instantly share code, notes, and snippets.

@WilfredAlmeida
Last active August 24, 2023 09:22
Show Gist options
  • Save WilfredAlmeida/93cb327e55dbe6aff1fa05b416cb5961 to your computer and use it in GitHub Desktop.
Save WilfredAlmeida/93cb327e55dbe6aff1fa05b416cb5961 to your computer and use it in GitHub Desktop.
Solana Event Emitter

programs/logger/src/lib.rs

use anchor_lang::prelude::*;
use borsh::{BorshDeserialize, BorshSerialize};

declare_id!("ENdMF5CR3qvWj2L6xZWofrYiYaQVV3dM94ghtbrvJ9QN");

#[program]
pub mod logger {
    use super::*;

    pub fn emit_event(_ctx: Context<SetRoosterEvent>, data: String, label: String) -> Result<()> {

        let m_data = data;
        let m_label = label;

        emit!(RoosterEvent {
            data: m_data.to_string(),
            label: m_label.to_string(),
        });
        
        msg!(m_data.as_str());
        msg!(m_label.as_str());
        
        Ok(())
    }
}

#[derive(Accounts, AnchorDeserialize, AnchorSerialize)]
pub struct SetRoosterEvent<'info> {
     #[account(mut)]
    pub event: Account<'info, TestEvent>,
}

#[account]
pub struct TestEvent {
    pub ignore: u64,
}


#[event]
// #[derive(Clone, Debug, Default)]
pub struct RoosterEvent {
    pub data: String,
    pub label: String,
}

programs/consumer/src/lib.rs

use anchor_lang::prelude::*;
use logger::cpi::accounts::SetRoosterEvent;
use logger::program::Logger;
use logger::{self, TestEvent};

declare_id!("5M8M5VCtD3cDkqJJj3NmfgVwnrVj1t9NSpmdSB3XGKR6");

#[program]
pub mod consumer {

    use super::*;

    pub fn do_something(ctx: Context<DoSomething>) -> Result<()> {
        let cpi_program = ctx.accounts.logger_program.to_account_info().clone();
        let cpi_accounts = SetRoosterEvent {
            event: ctx.accounts.event.to_account_info().clone(),
        };
        let cpi_ctx = CpiContext::new(cpi_program, cpi_accounts);
        logger::cpi::emit_event(cpi_ctx, "data".to_string(), "label".to_string())?;
        Ok(())
    }

}

#[derive(Accounts)]
pub struct DoSomething<'info> {
    #[account(mut)]
    pub event: Account<'info, TestEvent>,
    pub logger_program: Program<'info, Logger>,
}

tests/logger.ts

import * as anchor from "@coral-xyz/anchor";
import { Program } from "@coral-xyz/anchor";
import { Logger } from "../target/types/logger";
import { Consumer } from "../target/types/consumer";

describe("logger", () => {
  const provider = anchor.AnchorProvider.env();
  anchor.setProvider(provider);

  const program = anchor.workspace.Logger as Program<Logger>;
  const consumer = anchor.workspace.Consumer as Program<Consumer>;
  
  const powerAccount = anchor.web3.Keypair.generate();


  it("Does CPI", async()=>{

    await consumer.methods.doSomething().accounts({
      event: powerAccount.publicKey,
      loggerProgram: program.programId,
    }).rpc();
    

  })
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment