0

我在 Solana 程序中定义了 UserAction 枚举。

#[derive(AnchorDeserialize)]
#[derive(AnchorSerialize)]
pub enum UserAction {
    VIEW,
    LIKE,
    SHARE,
    COMMENT,
    DOWNLOAD,
}

在入口点使用它。

    pub fn my_fun(ctx: Context<DoPost>, action: UserAction) -> ProgramResult {
        // Do something
        Ok(())
    }

如何使用@solana/web3.js 传递枚举?

4

1 回答 1

0

正如您所注意到的,在 JS 中没有本地方法可以执行此操作,因此您必须手动进行编码,首先是一个字节来定义指令类型,然后是所有其他字节来定义指令数据。

这是一个简单的调用示例VIEW,假设它也需要一个u64

import * as BufferLayout from '@solana/buffer-layout';
const instructionLayout = BufferLayout.struct([
  BufferLayout.u8('instruction'),
  BufferLayout.ns64('number'),
]);
const data = Buffer.alloc(instructionLayout.span);
instructionLayout.encode({instruction: 0, number: 42}, data);
const instruction = TransactionInstruction({
      keys: [
        {pubkey: myPubkey, isSigner: false, isWritable: true},
// .. add all your account keys here
      ],
      programId: myProgramId,
      data,
    });

有关更完整的示例,请查看createAccountweb3.js 中系统程序的定义方式:https ://github.com/solana-labs/solana/blob/f0a235d16fd21da11176c21297176234121a3d8c/web3.js/src/system-program.ts# L655

于 2022-02-28T22:04:40.987 回答