使用Python获取Solana链上Pump Fun代币的市值
使用Python获取Solana链上Pump Fun代币的市值
Hey James, 我刚好之前折腾过类似的需求,那些第三方API要么难用要么收费,不如直接用Solana的免费公共RPC节点自己算,靠谱又不花钱,给你一步步拆解方案和代码~
首先得明白:Pump Fun代币的实时市值其实就是代币总供应量 × 实时代币价格,而价格可以从它的SOL流动性池(LP)里算出来——毕竟Pump Fun的代币都是基于Raydium的AMM模型创建LP的,我们只要拿到LP池里的SOL和代币储备,就能算出价格,再结合总供应量就得到市值了。
步骤1:安装依赖库
先装两个必要的库,用来和Solana RPC交互以及解码账户数据:
pip install solana base58
步骤2:完整代码示例
下面的代码可以直接运行,你只需要替换成目标代币的Mint地址就行:
from solana.rpc.api import Client from solana.publickey import PublicKey from base58 import b58decode import struct # 初始化Solana RPC客户端(用官方免费主网节点,限流的话可以换备用节点) solana_client = Client("https://api.mainnet-beta.solana.com") # 备用节点:https://solana-mainnet.g.alchemy.com/v2/demo (也是免费的) def get_token_total_supply(mint_address): """获取代币的总供应量(已考虑小数位数)""" mint_pubkey = PublicKey(mint_address) account_info = solana_client.get_account_info(mint_pubkey) if not account_info['result']['value']: raise ValueError(f"找不到代币Mint账户:{mint_address}") # 解码Mint账户数据:第4字节是小数位数,8-15字节是总供应量(64位无符号整数) account_data = b58decode(account_info['result']['value']['data'][0]) decimals = account_data[4] total_supply_raw = struct.unpack('<Q', account_data[8:16])[0] # 转换为实际可流通的供应量数值 return total_supply_raw / (10 ** decimals), decimals def get_lp_pool_reserves(token_mint): """获取代币与SOL的LP池储备金""" # Raydium AMM V4的程序ID,Pump Fun用的就是这个 amm_program_id = PublicKey("675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8") # SOL的官方Mint地址 sol_mint = PublicKey("So11111111111111111111111111111111111111112") # 通过程序ID和种子查找对应的LP账户 seed = [b"amm", bytes(sol_mint), bytes(PublicKey(token_mint))] lp_address, _ = PublicKey.find_program_address(seed, amm_program_id) lp_account_info = solana_client.get_account_info(lp_address) if not lp_account_info['result']['value']: raise ValueError("该代币还没有创建SOL流动性池,无法计算价格") # 解码LP账户数据,提取SOL和代币的储备金 lp_data = b58decode(lp_account_info['result']['value']['data'][0]) sol_reserve_raw = struct.unpack('<Q', lp_data[64:72])[0] token_reserve_raw = struct.unpack('<Q', lp_data[80:88])[0] return sol_reserve_raw, token_reserve_raw def calculate_token_market_cap(token_mint, sol_usd_price=None): """计算代币的实时市值(可选USD,需传入SOL的USD价格)""" # 1. 获取代币总供应量和小数位数 total_supply, token_decimals = get_token_total_supply(token_mint) # 2. 获取LP池储备 sol_reserve_raw, token_reserve_raw = get_lp_pool_reserves(token_mint) # 3. 计算1个代币对应的SOL价格(注意转换小数位数:SOL的小数是9位) sol_per_token = (sol_reserve_raw / 10**9) / (token_reserve_raw / 10**token_decimals) # 计算SOL市值 market_cap_sol = total_supply * sol_per_token result = { "total_supply": round(total_supply, 2), "sol_per_token": round(sol_per_token, 10), "market_cap_sol": round(market_cap_sol, 2) } # 如果传入了SOL的USD价格,计算USD市值 if sol_usd_price is not None: result["market_cap_usd"] = round(market_cap_sol * sol_usd_price, 2) return result if __name__ == "__main__": # 替换成你要查询的Pump Fun代币Mint地址(从Pump Fun页面复制) TARGET_TOKEN_MINT = "YOUR_TOKEN_MINT_ADDRESS_HERE" # 可选:手动传入当前SOL的USD价格(从行情平台查好实时价格后填入) CURRENT_SOL_USD_PRICE = 105.2 # 示例价格,实际请替换为实时价格 try: cap_data = calculate_token_market_cap(TARGET_TOKEN_MINT, CURRENT_SOL_USD_PRICE) print("=== 代币市值计算结果 ===") print(f"总供应量: {cap_data['total_supply']:,}") print(f"单代币SOL价格: {cap_data['sol_per_token']} SOL") print(f"SOL市值: {cap_data['market_cap_sol']:,} SOL") if "market_cap_usd" in cap_data: print(f"USD市值: ${cap_data['market_cap_usd']:,}") except Exception as e: print(f"出错了: {str(e)}")
一些注意事项
- RPC节点限流:免费节点有请求次数限制,如果频繁调用被限流,可以切换备用节点(比如上面注释的Alchemy演示节点)
- LP池不存在的情况:刚创建的Pump Fun代币可能还没添加流动性,这时候会报错,需要等流动性添加后再查询
- USD市值的获取:如果需要换算成USD,你可以从行情平台(比如交易所)查好实时SOL的USD价格,然后传入函数即可,不用依赖任何第三方API
- Mint地址正确性:一定要从Pump Fun的代币详情页复制正确的Mint地址,地址错了会查不到数据
备注:内容来源于stack exchange,提问作者James




