最近pumpfun升级了自己的内盘和外盘合约,导致我们的机器人无法进行交易。通过研究,发现如下问题:pumpfun:在交易中的第十个账号变更了,之前是固定值,现在要计算pumpfunamm:池子新增了一个creator数据,这个数据用于计算新增的交易账号交易账号列表新增了两个,且这
最近pumpfun升级了自己的内盘和外盘合约,导致我们的机器人无法进行交易。 通过研究,发现如下问题:
pumpfun:
pumpfun amm:
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
}
计算好之后,填充到账号列表的最后两个,然后就可以正常交易了。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!