如何使用@solana-labs/web3.js发送USDC-SPL

How to send USDC-SPL using @solana-labs/web3.js

我可以使用 web3.js 发送 SOL 代币,但无法使用 USDC-SPL 代币发送。这是我当前发送 SOL 代币的代码:

 // .......
 const connection = new Connection(network);
 const transaction = new Transaction()
  .add(
    SystemProgram.transfer({
      fromPubkey: publicKey,
      toPubkey: to,
      lamports: Number(amount) * 1000000000,
    })
  );
  const { blockhash } = await connection.getRecentBlockhash();
  transaction.recentBlockhash = blockhash;
  transaction.feePayer = publicKey;
  let signedTransaction: any = null;
  if ("solana" in window) {
    signedTransaction = await window.solana.signTransaction(transaction)
  } else if ("solflare" in window) {
    signedTransaction = await window.solflare.signTransaction(transaction);
  }
 // .......

我之前看到的答案来自发送他们自己定制的令牌的人

solana 上的所有 spl 代币(也是 USDC 代币)均由 spl-token 程序所有。 因此,您可以通过将代币地址更改为 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'(这是 solana 主网上的 USDC spl 代币地址),以与发送您自己定制的代币相同的方式发送 USDC。 例如:

import * as web3 from "@solana/web3.js";
import * as splToken from "@solana/spl-token";

const DEMO_WALLET_SECRET_KEY = new Uint8Array([
    ...
  ]);

const SOLANA_MAINNET_USDC_PUBKEY = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v";

(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 USDC_pubkey = new web3.PublicKey(SOLANA_MAINNET_USDC_PUBKEY);
  var USDC_Token = new splToken.Token(
    connection,
    USDC_pubkey,
    splToken.TOKEN_PROGRAM_ID,
    fromWallet
  );
  // Create associated token accounts for my token if they don't exist yet
  var fromTokenAccount = await USDC_Token.getOrCreateAssociatedAccountInfo(
    fromWallet.publicKey
  )
  var toTokenAccount = await USDC_Token.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");
})();