| Crates.io | znap |
| lib.rs | znap |
| version | 0.1.37 |
| created_at | 2024-06-17 18:11:31.128114+00 |
| updated_at | 2024-08-31 16:24:01.969789+00 |
| description | Performance-first Framework to build APIs compatible with the Solana Actions Spec. |
| homepage | |
| repository | https://github.com/heavy-duty/znap |
| max_upload_size | |
| id | 1274689 |
| size | 18,317 |
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.
cargo add znapuse znap::prelude::*| Package | Description | Version | Docs |
|---|---|---|---|
znap |
Znap framework's core library to create Solana actions |
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,
}