All Posts

solana实现批量发送mutisend

May 20
·
views
·
likes

solana链好像每个tx携带的字符有限,所以建议一次转10个地址

const web3 = require('@solana/web3.js');
const bs58 = require('bs58'); // 引入bs58库来处理Base58编码
 
async function multisendSOL(senderKeypair, transfers, connection) {
    let transaction = new web3.Transaction();
 
    // 为每个接收者添加一个转账指令到交易中
    transfers.forEach(transfer => {
        // console.log('Attempting to transfer to:', transfer.to); // 打印出要转账的地址
        try {
            const toPubkey = new web3.PublicKey(transfer.to);
            transaction.add(
                web3.SystemProgram.transfer({
                    fromPubkey: senderKeypair.publicKey,
                    toPubkey: toPubkey,
                    lamports: transfer.amount * web3.LAMPORTS_PER_SOL,
                })
            );
        } catch (error) {
            console.error('Error creating PublicKey for address:', transfer.to, error);
        }
    });
 
    // 签名并发送交易
    try {
        console.log('Sending transaction...');
        const signature = await web3.sendAndConfirmTransaction(
            connection,
            transaction,
            [senderKeypair]
        );
        console.log('Transaction sent:', signature);
    } catch (error) {
        console.error( error);
    }
}
 
async function main() {
    // 使用devnet
    const connection = new web3.Connection('rpc_url', 'confirmed');
    // console.log('Connected to cluster testnet',connection);
    // 从Base58编码的字符串转换为密钥数组
    const senderPrivateKeyBase58 = '私钥';
    const senderSecretKey = bs58.decode(senderPrivateKeyBase58);
    const senderKeypair = web3.Keypair.fromSecretKey(senderSecretKey);
 
    const transfers = [
        {
            "to": "地址1",
            "amount": 0.03
        },
        {
            "to": "5RpmhhyFjVasXcgHSu33Jko6engA7tUQJ4ApfHYdrW78",
            "amount": 0.03
        },
 
    ];
 
    await multisendSOL(senderKeypair, transfers, connection);
}
 
// 安装bs58库:npm install bs58
main().catch(console.error);