【问题标题】:How to transfer custom token by '@solana/web3.js'如何通过“@solana/web3.js”传输自定义令牌
【发布时间】:2021-09-15 01:24:44
【问题描述】:

我想使用 solana web3.js 发送我部署的令牌而不是 sol,但我不知道如何。找了很久的官方文档,还是找不到。如果您有这方面的任何信息,请告诉我吗?谢谢

【问题讨论】:

    标签: solana


    【解决方案1】:

    现有答案的问题在于,它们仅向您展示如何首先创建一个新的自定义令牌,然后执行从一个钱包到另一个钱包的转移。在这里,我将展示如何使用现有的自定义令牌来执行此操作。

    import { Token, TOKEN_PROGRAM_ID } from "@solana/spl-token";
    import { web3, Wallet } from "@project-serum/anchor";
    
    async function transfer(tokenMintAddress: string, wallet: Wallet, to: string, connection: web3.Connection, amount: number) {
      const mintPublicKey = new web3.PublicKey(tokenMintAddress);    
      const mintToken = new Token(
        connection,
        mintPublicKey,
        TOKEN_PROGRAM_ID,
        wallet.payer // the wallet owner will pay to transfer and to create recipients associated token account if it does not yet exist.
      );
            
      const fromTokenAccount = await mintToken.getOrCreateAssociatedAccountInfo(
        wallet.publicKey
      );
    
      const destPublicKey = new web3.PublicKey(to);
    
      // Get the derived address of the destination wallet which will hold the custom token
      const associatedDestinationTokenAddr = await Token.getAssociatedTokenAddress(
        mintToken.associatedProgramId,
        mintToken.programId,
        mintPublicKey,
        destPublicKey
      );
    
      const receiverAccount = await connection.getAccountInfo(associatedDestinationTokenAddr);
            
      const instructions: web3.TransactionInstruction[] = [];  
    
      if (receiverAccount === null) {
    
        instructions.push(
          Token.createAssociatedTokenAccountInstruction(
            mintToken.associatedProgramId,
            mintToken.programId,
            mintPublicKey,
            associatedDestinationTokenAddr,
            destPublicKey,
            wallet.publicKey
          )
        )
    
      }
      
      instructions.push(
        Token.createTransferInstruction(
          TOKEN_PROGRAM_ID,
          fromTokenAccount.address,
          associatedDestinationTokenAddr,
          wallet.publicKey,
          [],
          amount
        )
      );
    
      const transaction = new web3.Transaction().add(...instructions);
      transaction.feePayer = wallet.publicKey;
      transaction.recentBlockhash = (await connection.getRecentBlockhash()).blockhash;
      
      const transactionSignature = await connection.sendRawTransaction(
        transaction.serialize(),
        { skipPreflight: true }
      );
    
      await connection.confirmTransaction(transactionSignature);
    }
    

    如果收件人没有自定义令牌帐户,请注意我们如何添加创建自定义令牌帐户的说明。

    【讨论】:

      【解决方案2】:

      您需要确保为令牌程序安装 npm 绑定,如下面的导入所示

      import * as web3 from "@solana/web3.js";
      import * as splToken from "@solana/spl-token";
      
      // Address: 9vpsmXhZYMpvhCKiVoX5U8b1iKpfwJaFpPEEXF7hRm9N
      const DEMO_WALLET_SECRET_KEY = new Uint8Array([
        37, 21, 197, 185, 105, 201, 212, 148, 164, 108, 251, 159, 174, 252, 43, 246,
        225, 156, 38, 203, 99, 42, 244, 73, 252, 143, 34, 239, 15, 222, 217, 91, 132,
        167, 105, 60, 17, 211, 120, 243, 197, 99, 113, 34, 76, 127, 190, 18, 91, 246,
        121, 93, 189, 55, 165, 129, 196, 104, 25, 157, 209, 168, 165, 149,
      ]);
      (async () => {
        // Connect to cluster
        var connection = new web3.Connection(web3.clusterApiUrl("devnet"));
        // Construct wallet keypairs
        var fromWallet = web3.Keypair.fromSecretKey(DEMO_WALLET_SECRET_KEY);
        var toWallet = web3.Keypair.generate();
        // Construct my token class
        var myMint = new web3.PublicKey("My Mint Public Address");
        var myToken = new splToken.Token(
          connection,
          myMint,
          splToken.TOKEN_PROGRAM_ID,
          fromWallet
        );
        // Create associated token accounts for my token if they don't exist yet
        var fromTokenAccount = await myToken.getOrCreateAssociatedAccountInfo(
          fromWallet.publicKey
        )
        var toTokenAccount = await myToken.getOrCreateAssociatedAccountInfo(
          toWallet.publicKey
        )
        // Add token transfer instructions to transaction
        var transaction = new web3.Transaction()
          .add(
            splToken.Token.createTransferInstruction(
              splToken.TOKEN_PROGRAM_ID,
              fromTokenAccount.address,
              toTokenAccount.address,
              fromWallet.publicKey,
              [],
              0
            )
          );
        // Sign transaction, broadcast, and confirm
        var signature = await web3.sendAndConfirmTransaction(
          connection,
          transaction,
          [fromWallet]
        );
        console.log("SIGNATURE", signature);
        console.log("SUCCESS");
      })();

      【讨论】:

      • 我们可以访问代码中的密钥似乎是一个错误的假设。
      猜你喜欢
      • 2021-12-20
      • 2021-11-02
      • 2021-09-10
      • 2021-12-10
      • 2021-09-27
      • 2021-12-05
      • 2021-12-09
      • 2018-06-17
      • 2021-12-22
      相关资源
      最近更新 更多