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,
});
};
};
复制代码
代币转账
这个稍微比较复杂,上面只需要transfer,这里需要判断对方是否有对应代币的地址,如果有选取金额最多的地址,如果没有给他创建对应帐户,完成后给他转账。
为了测试,我们需要先有一些代币,所以还得mint对应得币,并把权限给自己,后给自己转点钱。
// TODO