gmsol_mock_chainlink_verifier/
lib.rs

1use anchor_lang::prelude::*;
2
3declare_id!("4nMxSRfeW7W2zFbN8FJ4YDvuTzEzCo1e6GzJxJLnDUoZ");
4
5#[program]
6pub mod gmsol_mock_chainlink_verifier {
7
8    use super::*;
9
10    pub fn initialize(ctx: Context<Initialize>, user: Pubkey) -> Result<()> {
11        ctx.accounts.verifier_account.authority = ctx.accounts.payer.key();
12        ctx.accounts.verifier_account.access_controller = ctx.accounts.access_controller.key();
13        ctx.accounts.access_controller.user = user;
14        Ok(())
15    }
16
17    pub fn verify(_ctx: Context<VerifyContext>, compressed_report: Vec<u8>) -> Result<Vec<u8>> {
18        use chainlink_data_streams_report::report::decode_full_report;
19        use snap::raw::Decoder;
20
21        let mut decoder = Decoder::new();
22        let full_report = decoder
23            .decompress_vec(&compressed_report)
24            .expect("invalid compression");
25        let (_, report) = decode_full_report(&full_report).expect("invalid full report");
26
27        cfg_if::cfg_if! {
28            if #[cfg(feature = "mock")] {
29                Ok(report)
30            } else {
31                _ = report;
32                panic!("The `mock` feature is not enabled");
33            }
34        }
35    }
36}
37
38pub const DEFAULT_VERIFIER_ACCOUNT_SEEDS: &[u8; 8] = b"verifier";
39pub const DEFAULT_ACCESS_CONTROLLER_ACCOUNT_SEEDS: &[u8] = b"access_controller";
40
41/// Verifyer Account.
42#[account]
43#[derive(InitSpace)]
44pub struct VerifierAccount {
45    authority: Pubkey,
46    access_controller: Pubkey,
47}
48
49/// Access Controller.
50#[account]
51#[derive(InitSpace)]
52pub struct AccessController {
53    user: Pubkey,
54}
55
56#[derive(Accounts)]
57pub struct Initialize<'info> {
58    /// Payer.
59    #[account(mut)]
60    pub payer: Signer<'info>,
61    /// Verifier Account.
62    #[account(
63        init,
64        payer = payer,
65        space = 8 + VerifierAccount::INIT_SPACE,
66        seeds = [DEFAULT_VERIFIER_ACCOUNT_SEEDS],
67        bump,
68    )]
69    pub verifier_account: Account<'info, VerifierAccount>,
70    /// Access Controller Account.
71    #[account(
72        init,
73        payer = payer,
74        space = 8 + VerifierAccount::INIT_SPACE,
75        seeds = [DEFAULT_ACCESS_CONTROLLER_ACCOUNT_SEEDS],
76        bump,
77    )]
78    pub access_controller: Account<'info, AccessController>,
79    /// The System Program.
80    pub system_program: Program<'info, System>,
81}
82
83#[derive(Accounts)]
84pub struct VerifyContext<'info> {
85    /// Verifier Account.
86    #[account(
87        seeds = [DEFAULT_VERIFIER_ACCOUNT_SEEDS],
88        bump,
89        has_one = access_controller,
90    )]
91    pub verifier_account: Account<'info, VerifierAccount>,
92    /// Access Controller.
93    #[account(has_one = user)]
94    pub access_controller: Account<'info, AccessController>,
95    /// User.
96    pub user: Signer<'info>,
97    /// CHECK: Program will validate this based on report input.
98    pub config_account: UncheckedAccount<'info>,
99}