You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解码Pump.fun创建代币的区块链日志以获取完整Token数据?

如何修改Metaplex交易日志解码函数以获取完整代币数据

要解析出包含mint、bondingCurve、user在内的完整数据,需要扩展现有解码逻辑,添加Solana公钥的读取处理(Solana公钥固定为32字节,编码格式为Base58)。以下是具体修改方案:

1. 依赖准备

确保项目中已安装Base58编码依赖,可使用@solana/web3.js中的PublicKey类,或直接安装base58包:

npm install @solana/web3.js
# 或
npm install base58

2. 修改解码函数

更新后的完整代码如下(包含类型定义和公钥读取逻辑):

import { PublicKey } from '@solana/web3.js';
// 若使用base58包则替换为:import base58 from 'base58';

export interface DecodeMetadataToken {
  name: string;
  symbol: string;
  uri: string;
  mint: string;
  bondingCurve: string;
  user: string;
}

export class LogDecode {
  static decodeMetadataToken(base64: string): DecodeMetadataToken {
    try {
      const buffer = Buffer.from(base64, "base64");
      let offset = 0;

      // 读取带长度前缀的UTF-8字符串
      const readString = () => {
        if (offset + 4 > buffer.length) {
          throw new Error(`Buffer overflow at offset ${offset}`);
        }
        const length = buffer.readUInt32LE(offset);
        offset += 4;
        if (offset + length > buffer.length) {
          throw new Error(`Buffer overflow while reading string at offset ${offset}`);
        }
        const str = buffer.toString("utf8", offset, offset + length);
        offset += length;
        return str;
      };

      // 读取32字节公钥并转为Base58格式
      const readPublicKey = () => {
        if (offset + 32 > buffer.length) {
          throw new Error(`Buffer overflow while reading public key at offset ${offset}`);
        }
        const keyBytes = buffer.slice(offset, offset + 32);
        offset += 32;
        // 使用@solana/web3.js的PublicKey
        return new PublicKey(keyBytes).toBase58();
        // 若使用base58包则替换为:return base58.encode(keyBytes);
      };

      // 跳过前8字节头部
      offset += 8;

      // 读取基础字符串字段
      const name = readString();
      const symbol = readString();
      const uri = readString();

      // 读取公钥字段
      const mint = readPublicKey();
      const bondingCurve = readPublicKey();
      const user = readPublicKey();

      logger.info(`Токен:\nНазвание: ${name}\nСимвол: ${symbol}\nUri: ${uri}\nMint: ${mint}\nBondingCurve: ${bondingCurve}\nUser: ${user}`);

      return {
        name,
        symbol,
        uri,
        mint,
        bondingCurve,
        user,
      };
    } catch (error) {
      logger.error(`Ошибка при декодировании токена: ${(error as Error).message}`);
      throw error;
    }
  }
}

关键修改点说明

  • 新增readPublicKey辅助函数:从Buffer中读取固定32字节的公钥数据,通过Base58编码转换为Solana地址格式。
  • 扩展返回类型:更新DecodeMetadataToken接口,添加mint、bondingCurve、user三个字符串字段(对应Base58编码的公钥)。
  • 顺序读取公钥:在完成name、symbol、uri的读取后,按Metaplex日志数据的顺序依次读取三个公钥字段。
  • 增强错误处理:为公钥读取添加Buffer溢出检查,避免解码异常。

内容的提问来源于stack exchange,提问作者user29029379

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 06:00:55