znap

Crates.ioznap
lib.rsznap
version0.1.37
sourcesrc
created_at2024-06-17 18:11:31.128114
updated_at2024-08-31 16:24:01.969789
descriptionPerformance-first Framework to build APIs compatible with the Solana Actions Spec.
homepage
repositoryhttps://github.com/heavy-duty/znap
max_upload_size
id1274689
size18,317
Daniel Marin (danmt)

documentation

README

znap

Znap framework's core library to create Solana actions

znap is the core library that encompasses znap-macros, znap-syn and other essential components for Solana actions programming.

znap is responsible for coordinating the different modules and tools needed to parse, transform and generate code in Rust. By integrating znap-macros and znap-syn, znap allows developers to take full advantage of Rust's capabilities to create Solana actions.

How to import znap

  1. cargo add znap
  2. In your lib.rs file import: use znap::prelude::*

Package

Package Description Version Docs
znap Znap framework's core library to create Solana actions Crates.io Docs.rs

How to use

use solana_sdk::{message::Message, pubkey, pubkey::Pubkey, transaction::Transaction};
use spl_associated_token_account::get_associated_token_address;
use spl_token::{instruction::transfer, ID as TOKEN_PROGRAM_ID};
use std::str::FromStr;
use znap::prelude::*;

#[collection]
pub mod my_actions {
    use super::*;

    pub fn fixed_transfer(ctx: Context<FixedTransferAction>) -> Result<Transaction> {
        let account_pubkey = match Pubkey::from_str(&ctx.payload.account) {
            Ok(account_pubkey) => account_pubkey,
            _ => return Err(Error::from(ActionError::InvalidAccountPublicKey)),
        };
        let mint_pubkey = pubkey!("FtaDaiPPAy52vKtzdrpMLS3bXvG9LVUYJt6TeG6XxMUi");
        let receiver_pubkey = pubkey!("6GBLiSwAPhDMttmdjo3wvEsssEnCiW3yZwVyVZnhFm3G");
        let source_pubkey = get_associated_token_address(&account_pubkey, &mint_pubkey);
        let destination_pubkey = get_associated_token_address(&receiver_pubkey, &mint_pubkey);
        let transfer_instruction = match transfer(
            &spl_token::ID,
            &source_pubkey,
            &destination_pubkey,
            &account_pubkey,
            &[&account_pubkey],
            1,
        ) {
            Ok(transfer_instruction) => transfer_instruction,
            _ => return Err(Error::from(ActionError::InvalidInstruction)),
        };
        let transaction_message = Message::new(&[transfer_instruction], None);

        Ok(Transaction::new_unsigned(transaction_message))
    }
}

#[derive(Action)]
#[action(
    icon = "https://google.com",
    title = "Fixed transfer",
    description = "Send a fixed transfer to the treasury",
    label = "Send"
)]
pub struct FixedTransferAction;

#[derive(ErrorCode)]
enum ActionError {
    #[error(msg = "Invalid account public key")]
    InvalidAccountPublicKey,
    #[error(msg = "Invalid instruction")]
    InvalidInstruction,
}
Commit count: 65

cargo fmt