You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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

火山引擎 最新活动