你可以在 V2EX 设置中绑定 Solana 地址,然后就可以用 Phantom / Glow 登录 V2EX。
Get V2EX Coin9raUVuzeWUk53co63M4WXLWPWE4Xc6Lpn7RS9dnkpump
测试跑的 transaction:
gas 是很低..用的公共节点.. 需要私钥在代码里..佬哥注意私钥安全.. 需要配置私钥、目标地址、目标金额就行。代币位数会自动处理。
pip install solana spl-token base58
import os import time import base58 from solders.pubkey import Pubkey from solders.keypair import Keypair from solders.transaction import Transaction from solders.message import Message from solders.compute_budget import set_compute_unit_price from solana.rpc.api import Client from solana.rpc.types import TxOpts from solana.rpc.commitment import Confirmed from spl.token.client import Token from spl.token.constants import TOKEN_PROGRAM_ID from spl.token.instructions import get_associated_token_address, create_associated_token_account, transfer_checked, TransferCheckedParams # --- 1. 配置区域 --- # --- 请在这里修改您的转账信息 --- # 使用公共 RPC 节点 RPC_ENDPOINT = "https://api.mainnet-beta.solana.com" # 要转账的代币的 Mint Address TOKEN_MINT_ADDRESS = Pubkey.from_string("9raUVuzeWUk53co63M4WXLWPWE4Xc6Lpn7RS9dnkpump") PRIVATE_KEY_STRING= "PRIVATE_KEY_STRING" # 转账配置列表 TRANSFERS_COnFIG= [ {"address": "address", "amount": 2}, {"address": "address", "amount": 1}, {"address": "address", "amount": 2}, ] # 优先费 (Micro Lamports) PRIORITY_FEE_MICRO_LAMPORTS = 0 # --- 配置区域结束 --- def load_keypair_from_base58(private_key_b58: str) -> Keypair: try: keypair_bytes = base58.b58decode(private_key_b58) if len(keypair_bytes) != 64: raise ValueError(f"私钥解码后的长度应为 64 字节,实际为 {len(keypair_bytes)} 字节。") return Keypair.from_bytes(keypair_bytes) except Exception as e: print(f"错误:无法从 Base58 字符串加载密钥对。请检查.env 文件中的私钥。") raise e def main(): """主执行函数""" print("--- Solana SPL 代币批量转账脚本 (兼容新版 solana-py) ---") try: sender_keypair = load_keypair_from_base58(PRIVATE_KEY_STRING) client = Client(RPC_ENDPOINT) except Exception as e: print(f"初始化失败:{e}") return print(f"发送方地址: {sender_keypair.pubkey()}") print(f"代币地址: {TOKEN_MINT_ADDRESS}") print(f"共计 {len(TRANSFERS_CONFIG)} 笔转账任务") print("-" * 20) try: token_client = Token( cOnn=client, pubkey=TOKEN_MINT_ADDRESS, program_id=TOKEN_PROGRAM_ID, payer=sender_keypair ) mint_info = token_client.get_mint_info() decimals = mint_info.decimals print(f"代币小数位数: {decimals}") sender_ata = get_associated_token_address(sender_keypair.pubkey(), TOKEN_MINT_ADDRESS) print(f"发送方代币账户 (ATA): {sender_ata}") # --- 核心改动:新的交易构建流程 --- # 1. 将所有指令收集到一个列表中 instructiOns= [] if PRIORITY_FEE_MICRO_LAMPORTS > 0: instructions.append(set_compute_unit_price(PRIORITY_FEE_MICRO_LAMPORTS)) print(f"已添加优先费: {PRIORITY_FEE_MICRO_LAMPORTS} micro-lamports") print("正在为每个接收者生成转账指令...") for transfer_info in TRANSFERS_CONFIG: try: recipient_pubkey = Pubkey.from_string(transfer_info["address"]) amount = float(transfer_info["amount"]) amount_in_smallest_unit = int(amount * (10 ** decimals)) print(f" -> 任务: 向 {recipient_pubkey} 转账 {amount} 个代币") recipient_ata = get_associated_token_address(recipient_pubkey, TOKEN_MINT_ADDRESS) recipient_ata_info = client.get_account_info(recipient_ata).value if recipient_ata_info is None: print(f" 接收者 ATA ({recipient_ata}) 不存在,将添加 '创建 ATA' 指令。") instructions.append( create_associated_token_account( payer=sender_keypair.pubkey(), owner=recipient_pubkey, mint=TOKEN_MINT_ADDRESS ) ) instructions.append( transfer_checked( TransferCheckedParams( program_id=token_client.program_id, source=sender_ata, mint=TOKEN_MINT_ADDRESS, dest=recipient_ata, owner=sender_keypair.pubkey(), amount=amount_in_smallest_unit, decimals=decimals, signers=[] ) ) ) except Exception as e: print(f"处理转账任务 {transfer_info} 时出错: {e}") continue # 2. 获取最新区块哈希 print("正在获取最新区块哈希...") latest_blockhash = client.get_latest_blockhash(commitment=Confirmed).value.blockhash # 3. 使用指令、支付方和区块哈希创建 Message message = Message.new_with_blockhash( instructions, sender_keypair.pubkey(), latest_blockhash ) # 4. 使用 Message 和签名者创建 Transaction transaction = Transaction([sender_keypair], message, latest_blockhash) # --- 交易构建流程结束 --- print("正在发送交易到 Solana 网络...") opts = TxOpts(skip_preflight=False, preflight_commitment=Confirmed) # preflight 建议打开 tx_signature = client.send_transaction(transaction, opts=opts).value print("-" * 20) print(f" 交易已成功发送!") print(f" 交易签名: {tx_signature}") print(f" 在 Solscan 上查看: https://solscan.io/tx/{tx_signature}") print("正在等待交易确认...") client.confirm_transaction(tx_signature, commitment=Confirmed) print(" 交易已确认!批量转账完成。") except Exception as e: print(f"\n 执行过程中发生错误: {e}") if __name__ == "__main__": main()
![]() | 1 KING754 51 天前 佬们,可以测试了 |
![]() | 2 Oah1zO OP 唔,单笔交易有大小,现在单个交易估计跑 5-6 笔,多了会失败。。 |
![]() | 5 dongking 50 天前 okx 钱包就有这功能啊,很方便 |
![]() | 7 EasyMCT 50 天前 ![]() 试试我们这个 mct.xyz/solana/token-sender 对$v2ex 免手续费 |