Solana -- 转账

SOL转账

import { WalletContextState } from '@solana/wallet-adapter-react';
import {
  clusterApiUrl,
  Connection,
  PublicKey,
  SystemProgram,
  Transaction,
  TransactionInstruction,
} from '@solana/web3.js';

const transferNativeSol = async ({
  toPubkey,
  amount,
  payerPublicKey,
  connection,
  wallet,
}: {
  toPubkey: PublicKey;
  amount: number;
  payerPublicKey?: PublicKey;
  connection: Connection;
  wallet: WalletContextState;
}) => {
  if (!payerPublicKey) {
    return console.error('error not connect wallet');
  }

  const instructions: TransactionInstruction[] = [];
  instructions.push(
    SystemProgram.transfer({
      fromPubkey: payerPublicKey,
      lamports: amount,
      toPubkey,
    }),
  );
  const transaction = new Transaction();

  instructions.forEach(instruction => {
    transaction.add(instruction);
  });
  transaction.recentBlockhash = (
    await connection.getRecentBlockhash('max')
  ).blockhash;
  transaction.feePayer = payerPublicKey;
  const signedTransaction = await wallet.signTransaction(transaction);
  const tx = await connection.sendRawTransaction(
    signedTransaction.serialize(),
  );
  return tx
};
复制代码

测试运行例子(钱包连接需要自己连接哦)

const a = () => {
  const solana = (window as any).solana;
  const connection = new Connection(clusterApiUrl('devnet'), 'recent');

  const toPubkey = new PublicKey(
    'FdU6FwgcDhqQGcpYtHwXg4T98YBT1SSiGinhzrPdEBr6',
  );
  const amount = 2;

  (window as any).test = async () => {
    transferNativeSol({
      payerPublicKey: solana.publicKey,
      toPubkey,
      amount: amount * 1e9,
      connection,
      wallet: solana as any,
    });
  };
};
复制代码

代币转账

官方Token源码

官方教程

这个稍微比较复杂,上面只需要transfer,这里需要判断对方是否有对应代币的地址,如果有选取金额最多的地址,如果没有给他创建对应帐户,完成后给他转账。

为了测试,我们需要先有一些代币,所以还得mint对应得币,并把权限给自己,后给自己转点钱。

// TODO

猜你喜欢

转载自juejin.im/post/7036337663648989197