solana交易机器人pumpfun协议对接问题说明

最近pumpfun升级了自己的内盘和外盘合约,导致我们的机器人无法进行交易。通过研究,发现如下问题:pumpfun:在交易中的第十个账号变更了,之前是固定值,现在要计算pumpfunamm:池子新增了一个creator数据,这个数据用于计算新增的交易账号交易账号列表新增了两个,且这

最近pumpfun升级了自己的内盘和外盘合约,导致我们的机器人无法进行交易。 通过研究,发现如下问题:

pumpfun:

  • 在交易中的第十个账号变更了,之前是固定值,现在要计算

pumpfun amm:

  • 池子新增了一个creator数据,这个数据用于计算新增的交易账号
  • 交易账号列表新增了两个,且这两个都需要计算

pumpfun计算方式: 一、首先是解析池子数据,新增一个字段:

type PUMPBondingCurveData struct {
    BondingCurve             *BondingCurveLayout
    BondingCurvePk           solana.PublicKey
    AssociatedBondingCurvePk solana.PublicKey
    GlobalSettings           *GlobalSettingsLayout
    GlobalSettingsPk         solana.PublicKey
    MintAuthority            solana.PublicKey
    Creator                  solana.PublicKey
}

Creator是新增的,之前没有,也可能是之前有,我们代码没定义

二、计算第十个账号的方法

func getCreatorVault(creator solana.PublicKey) (solana.PublicKey, error) {
    // 固定前缀 seed:等价于 []byte("creator-vault")
    seed1 := []byte{99, 114, 101, 97, 116, 111, 114, 45, 118, 97, 117, 108, 116}

    seed2 := creator.Bytes()

    // 计算 PDA
    pda, _, err := solana.FindProgramAddress([][]byte{seed1, seed2}, global.PumpProgramAccount)
    if err != nil {
        return solana.PublicKey{}, err
    }

    return pda, nil
}

该方法就是返回第十个账号,直接填充在账号列表中,就可以正常交易。

pumpfun amm计算方式: 新增了两个字段,如下:

CoinCreatorVaultAta
CoinCreatorVaultAuthority

这两个字段需要计算,计算方式如下:

func getCoinCreatorVaultAuthority(coinCreator solana.PublicKey) (solana.PublicKey, error) {
    // 第一个 seed 是常量字符串 "creator_vault"
    seed1 := []byte{99, 114, 101, 97, 116, 111, 114, 95, 118, 97, 117, 108, 116}

    // 构造 PDA
    seeds := [][]byte{
        seed1,
        coinCreator.Bytes(),
    }

    pda, _, err := solana.FindProgramAddress(seeds, solana.MustPublicKeyFromBase58(config.PumpFunAMMProgramID))
    if err != nil {
        return solana.PublicKey{}, err
    }

    return pda, nil
}

func getCoinCreatorVaultAta(coinCreatorVaultAuthority, quoteMint solana.PublicKey) (solana.PublicKey, error) {
    quoteTokenProgram := solana.TokenProgramID

    // IDL 里的 program ID bytes
    programIDBytes := []byte{
        140, 151, 37, 143, 78, 36, 137, 241, 187, 61, 16, 41, 20, 142, 13, 131,
        11, 90, 19, 153, 218, 255, 16, 132, 4, 142, 123, 216, 219, 233, 248, 89,
    }

    programID2 := solana.PublicKeyFromBytes(programIDBytes)

    // 构造 seeds
    seeds := [][]byte{
        coinCreatorVaultAuthority.Bytes(),
        quoteTokenProgram.Bytes(),
        quoteMint.Bytes(),
    }

    // PDA 计算
    pda, _, err := solana.FindProgramAddress(seeds, programID2)
    if err != nil {
        return solana.PublicKey{}, err
    }

    return pda, nil
}

计算好之后,填充到账号列表的最后两个,然后就可以正常交易了。

  • 原创
  • 学分: 0
  • 分类: Solana
  • 标签:
点赞 0
收藏 0
分享

0 条评论

请先 登录 后评论
加密曙光
加密曙光
0xADd4...8F00
区块链爱好者,研究员,微信:kevin76702,我们的机器人站点:https://product-bot.gitbook.io/aurora-dev