bonfida-macros 0.7.0

Bonfida-utils macros
Documentation
use quote::quote;
use std::str::FromStr;

use proc_macro2::{Span, TokenStream};
use solana_program::pubkey::Pubkey;
use syn::{LitByte, LitStr};

pub fn process(item: TokenStream) -> TokenStream {
    let item_copy = item.clone();
    let str: LitStr = syn::parse(item.into()).unwrap();
    let key = str.value();
    let pubkey = Pubkey::from_str(&key).unwrap();
    let pubkey_bytes = pubkey.to_bytes();
    let (central_state, central_state_nonce) =
        Pubkey::find_program_address(&[&pubkey_bytes], &pubkey);
    let central_state_array = central_state.to_bytes();
    let central_state_bytes = central_state_array
        .iter()
        .map(|b| LitByte::new(*b, Span::call_site()));
    let pubkey_bytes = pubkey_bytes
        .iter()
        .map(|b| LitByte::new(*b, Span::call_site()));
    quote!(
        use solana_program::declare_id;
        pub mod central_state {
            use solana_program::pubkey::Pubkey;
            pub static KEY_BYTES: [u8;32] = [#(#central_state_bytes),*];
            pub static KEY: Pubkey = Pubkey::new_from_array(KEY_BYTES);
            pub static NONCE: u8 = #central_state_nonce;
            pub static SIGNER_SEEDS: [&'static [u8]; 2] = [&super::ID_BYTES, &[NONCE]];
        }
        declare_id!(#item_copy);
        pub static ID_BYTES: [u8;32] = [#(#pubkey_bytes),*];
    )
}