#action #solana #framework #spec #compatible #build #api

znap

性能优先的框架,用于构建与 Solana Actions 规范兼容的 API

34 个版本

0.1.35 2024 年 8 月 5 日
0.1.34 2024 年 8 月 1 日
0.1.31 2024 年 7 月 26 日
0.1.19 2024 年 6 月 29 日

#468 in 魔法豆

Download history 441/week @ 2024-06-15 882/week @ 2024-06-22 724/week @ 2024-06-29 868/week @ 2024-07-06 58/week @ 2024-07-13 65/week @ 2024-07-20 441/week @ 2024-07-27 143/week @ 2024-08-03 10/week @ 2024-08-10

659 次每月下载

Apache-2.0

19KB
290

znap

Znap 框架的核心库,用于创建 Solana 操作

znap 是一个核心库,包含 znap-macros、znap-syn 和其他用于 Solana 操作编程的必要组件。

znap 负责协调解析、转换和生成 Rust 代码所需的不同模块和工具。通过集成 znap-macrosznap-synznap 允许开发者充分利用 Rust 的功能来创建 Solana 操作。

如何导入 znap

  1. cargo添加 znap
  2. 在你的 lib.rs 文件中导入: use znap::prelude::*

描述 版本 文档
znap Znap 框架的核心库,用于创建 Solana 操作 Crates.io Docs.rs

使用方法

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,
}

依赖项

~75MB
~1.5M SLoC