mirror of
https://github.com/chainstacklabs/pumpfun-bonkfun-bot.git
synced 2026-07-27 23:37:45 +00:00
fix(examples): add bonding_curve_v2 to learning examples (#160)
* fix(examples): add bonding_curve_v2 remaining account to learning examples Add the required bonding_curve_v2 PDA as a remaining account to buy/sell instructions in manual_buy, manual_sell, mint_and_buy, and mint_and_buy_v2 learning examples, matching the pump.fun program upgrade. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(examples): add bonding_curve_v2 to manual_buy_geyser and manual_buy_cu_optimized Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -159,6 +159,14 @@ def _find_fee_config() -> Pubkey:
|
|||||||
return derived_address
|
return derived_address
|
||||||
|
|
||||||
|
|
||||||
|
def _find_bonding_curve_v2(mint: Pubkey) -> Pubkey:
|
||||||
|
derived_address, _ = Pubkey.find_program_address(
|
||||||
|
[b"bonding-curve-v2", bytes(mint)],
|
||||||
|
PUMP_PROGRAM,
|
||||||
|
)
|
||||||
|
return derived_address
|
||||||
|
|
||||||
|
|
||||||
async def get_fee_recipient(
|
async def get_fee_recipient(
|
||||||
client: AsyncClient, curve_state: BondingCurveState
|
client: AsyncClient, curve_state: BondingCurveState
|
||||||
) -> Pubkey:
|
) -> Pubkey:
|
||||||
@@ -253,9 +261,7 @@ async def buy_token(
|
|||||||
),
|
),
|
||||||
AccountMeta(pubkey=payer.pubkey(), is_signer=True, is_writable=True),
|
AccountMeta(pubkey=payer.pubkey(), is_signer=True, is_writable=True),
|
||||||
AccountMeta(pubkey=SYSTEM_PROGRAM, is_signer=False, is_writable=False),
|
AccountMeta(pubkey=SYSTEM_PROGRAM, is_signer=False, is_writable=False),
|
||||||
AccountMeta(
|
AccountMeta(pubkey=token_program, is_signer=False, is_writable=False),
|
||||||
pubkey=token_program, is_signer=False, is_writable=False
|
|
||||||
),
|
|
||||||
AccountMeta(pubkey=creator_vault, is_signer=False, is_writable=True),
|
AccountMeta(pubkey=creator_vault, is_signer=False, is_writable=True),
|
||||||
AccountMeta(
|
AccountMeta(
|
||||||
pubkey=PUMP_EVENT_AUTHORITY, is_signer=False, is_writable=False
|
pubkey=PUMP_EVENT_AUTHORITY, is_signer=False, is_writable=False
|
||||||
@@ -283,6 +289,12 @@ async def buy_token(
|
|||||||
is_signer=False,
|
is_signer=False,
|
||||||
is_writable=False,
|
is_writable=False,
|
||||||
),
|
),
|
||||||
|
# Remaining account: bonding_curve_v2 (readonly, required for all coins)
|
||||||
|
AccountMeta(
|
||||||
|
pubkey=_find_bonding_curve_v2(mint),
|
||||||
|
is_signer=False,
|
||||||
|
is_writable=False,
|
||||||
|
),
|
||||||
]
|
]
|
||||||
|
|
||||||
discriminator = struct.pack("<Q", 16927863322537952870)
|
discriminator = struct.pack("<Q", 16927863322537952870)
|
||||||
@@ -433,7 +445,9 @@ async def listen_for_create_transaction():
|
|||||||
if discriminator == create_discriminator:
|
if discriminator == create_discriminator:
|
||||||
instruction_name = "create"
|
instruction_name = "create"
|
||||||
token_program = SYSTEM_TOKEN_PROGRAM
|
token_program = SYSTEM_TOKEN_PROGRAM
|
||||||
elif discriminator == create_v2_discriminator:
|
elif (
|
||||||
|
discriminator == create_v2_discriminator
|
||||||
|
):
|
||||||
instruction_name = "create_v2"
|
instruction_name = "create_v2"
|
||||||
token_program = TOKEN_2022_PROGRAM
|
token_program = TOKEN_2022_PROGRAM
|
||||||
|
|
||||||
@@ -457,8 +471,12 @@ async def listen_for_create_transaction():
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
# Add token program info to decoded args
|
# Add token program info to decoded args
|
||||||
decoded_args["token_program"] = str(token_program)
|
decoded_args["token_program"] = str(
|
||||||
decoded_args["is_token_2022"] = (token_program == TOKEN_2022_PROGRAM)
|
token_program
|
||||||
|
)
|
||||||
|
decoded_args["is_token_2022"] = (
|
||||||
|
token_program == TOKEN_2022_PROGRAM
|
||||||
|
)
|
||||||
return decoded_args
|
return decoded_args
|
||||||
|
|
||||||
|
|
||||||
@@ -488,13 +506,21 @@ async def main():
|
|||||||
slippage = 0.3 # 30% slippage tolerance
|
slippage = 0.3 # 30% slippage tolerance
|
||||||
|
|
||||||
print(f"Bonding curve address: {bonding_curve}")
|
print(f"Bonding curve address: {bonding_curve}")
|
||||||
print(f"Token Program: {token_program} ({'Token2022' if token_data['is_token_2022'] else 'Standard Token'})")
|
print(
|
||||||
|
f"Token Program: {token_program} ({'Token2022' if token_data['is_token_2022'] else 'Standard Token'})"
|
||||||
|
)
|
||||||
print(f"Token price: {token_price_sol:.10f} SOL")
|
print(f"Token price: {token_price_sol:.10f} SOL")
|
||||||
print(
|
print(
|
||||||
f"Buying {amount:.6f} SOL worth of the new token with {slippage * 100:.1f}% slippage tolerance..."
|
f"Buying {amount:.6f} SOL worth of the new token with {slippage * 100:.1f}% slippage tolerance..."
|
||||||
)
|
)
|
||||||
await buy_token(
|
await buy_token(
|
||||||
mint, bonding_curve, associated_bonding_curve, creator_vault, token_program, amount, slippage
|
mint,
|
||||||
|
bonding_curve,
|
||||||
|
associated_bonding_curve,
|
||||||
|
creator_vault,
|
||||||
|
token_program,
|
||||||
|
amount,
|
||||||
|
slippage,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -180,6 +180,14 @@ def _find_fee_config() -> Pubkey:
|
|||||||
return derived_address
|
return derived_address
|
||||||
|
|
||||||
|
|
||||||
|
def _find_bonding_curve_v2(mint: Pubkey) -> Pubkey:
|
||||||
|
derived_address, _ = Pubkey.find_program_address(
|
||||||
|
[b"bonding-curve-v2", bytes(mint)],
|
||||||
|
PUMP_PROGRAM,
|
||||||
|
)
|
||||||
|
return derived_address
|
||||||
|
|
||||||
|
|
||||||
async def get_fee_recipient(
|
async def get_fee_recipient(
|
||||||
client: AsyncClient, curve_state: BondingCurveState
|
client: AsyncClient, curve_state: BondingCurveState
|
||||||
) -> Pubkey:
|
) -> Pubkey:
|
||||||
@@ -291,9 +299,7 @@ async def buy_token(
|
|||||||
),
|
),
|
||||||
AccountMeta(pubkey=payer.pubkey(), is_signer=True, is_writable=True),
|
AccountMeta(pubkey=payer.pubkey(), is_signer=True, is_writable=True),
|
||||||
AccountMeta(pubkey=SYSTEM_PROGRAM, is_signer=False, is_writable=False),
|
AccountMeta(pubkey=SYSTEM_PROGRAM, is_signer=False, is_writable=False),
|
||||||
AccountMeta(
|
AccountMeta(pubkey=token_program, is_signer=False, is_writable=False),
|
||||||
pubkey=token_program, is_signer=False, is_writable=False
|
|
||||||
),
|
|
||||||
AccountMeta(pubkey=creator_vault, is_signer=False, is_writable=True),
|
AccountMeta(pubkey=creator_vault, is_signer=False, is_writable=True),
|
||||||
AccountMeta(
|
AccountMeta(
|
||||||
pubkey=PUMP_EVENT_AUTHORITY, is_signer=False, is_writable=False
|
pubkey=PUMP_EVENT_AUTHORITY, is_signer=False, is_writable=False
|
||||||
@@ -321,6 +327,12 @@ async def buy_token(
|
|||||||
is_signer=False,
|
is_signer=False,
|
||||||
is_writable=False,
|
is_writable=False,
|
||||||
),
|
),
|
||||||
|
# Remaining account: bonding_curve_v2 (readonly, required for all coins)
|
||||||
|
AccountMeta(
|
||||||
|
pubkey=_find_bonding_curve_v2(mint),
|
||||||
|
is_signer=False,
|
||||||
|
is_writable=False,
|
||||||
|
),
|
||||||
]
|
]
|
||||||
|
|
||||||
discriminator = struct.pack("<Q", 16927863322537952870)
|
discriminator = struct.pack("<Q", 16927863322537952870)
|
||||||
@@ -475,7 +487,9 @@ async def listen_for_create_transaction():
|
|||||||
if discriminator == create_discriminator:
|
if discriminator == create_discriminator:
|
||||||
instruction_name = "create"
|
instruction_name = "create"
|
||||||
token_program = SYSTEM_TOKEN_PROGRAM
|
token_program = SYSTEM_TOKEN_PROGRAM
|
||||||
elif discriminator == create_v2_discriminator:
|
elif (
|
||||||
|
discriminator == create_v2_discriminator
|
||||||
|
):
|
||||||
instruction_name = "create_v2"
|
instruction_name = "create_v2"
|
||||||
token_program = TOKEN_2022_PROGRAM
|
token_program = TOKEN_2022_PROGRAM
|
||||||
|
|
||||||
@@ -499,8 +513,12 @@ async def listen_for_create_transaction():
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
# Add token program info to decoded args
|
# Add token program info to decoded args
|
||||||
decoded_args["token_program"] = str(token_program)
|
decoded_args["token_program"] = str(
|
||||||
decoded_args["is_token_2022"] = (token_program == TOKEN_2022_PROGRAM)
|
token_program
|
||||||
|
)
|
||||||
|
decoded_args["is_token_2022"] = (
|
||||||
|
token_program == TOKEN_2022_PROGRAM
|
||||||
|
)
|
||||||
return decoded_args
|
return decoded_args
|
||||||
|
|
||||||
|
|
||||||
@@ -529,14 +547,22 @@ async def main():
|
|||||||
slippage = 0.3 # 30% slippage tolerance
|
slippage = 0.3 # 30% slippage tolerance
|
||||||
|
|
||||||
print(f"Bonding curve address: {bonding_curve}")
|
print(f"Bonding curve address: {bonding_curve}")
|
||||||
print(f"Token Program: {token_program} ({'Token2022' if token_data['is_token_2022'] else 'Standard Token'})")
|
print(
|
||||||
|
f"Token Program: {token_program} ({'Token2022' if token_data['is_token_2022'] else 'Standard Token'})"
|
||||||
|
)
|
||||||
print(f"Token price: {token_price_sol:.10f} SOL")
|
print(f"Token price: {token_price_sol:.10f} SOL")
|
||||||
print(
|
print(
|
||||||
f"Buying {amount:.6f} SOL worth of the new token with {slippage * 100:.1f}% slippage tolerance..."
|
f"Buying {amount:.6f} SOL worth of the new token with {slippage * 100:.1f}% slippage tolerance..."
|
||||||
)
|
)
|
||||||
print("CU Optimization: Enabled (512KB account data limit)")
|
print("CU Optimization: Enabled (512KB account data limit)")
|
||||||
await buy_token(
|
await buy_token(
|
||||||
mint, bonding_curve, associated_bonding_curve, creator_vault, token_program, amount, slippage
|
mint,
|
||||||
|
bonding_curve,
|
||||||
|
associated_bonding_curve,
|
||||||
|
creator_vault,
|
||||||
|
token_program,
|
||||||
|
amount,
|
||||||
|
slippage,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -172,6 +172,14 @@ def _find_fee_config() -> Pubkey:
|
|||||||
return derived_address
|
return derived_address
|
||||||
|
|
||||||
|
|
||||||
|
def _find_bonding_curve_v2(mint: Pubkey) -> Pubkey:
|
||||||
|
derived_address, _ = Pubkey.find_program_address(
|
||||||
|
[b"bonding-curve-v2", bytes(mint)],
|
||||||
|
PUMP_PROGRAM,
|
||||||
|
)
|
||||||
|
return derived_address
|
||||||
|
|
||||||
|
|
||||||
async def get_fee_recipient(
|
async def get_fee_recipient(
|
||||||
client: AsyncClient, curve_state: BondingCurveState
|
client: AsyncClient, curve_state: BondingCurveState
|
||||||
) -> Pubkey:
|
) -> Pubkey:
|
||||||
@@ -328,7 +336,7 @@ async def listen_for_create_transaction_geyser():
|
|||||||
|
|
||||||
# Add token program info to decoded args
|
# Add token program info to decoded args
|
||||||
token_data["token_program"] = str(token_program)
|
token_data["token_program"] = str(token_program)
|
||||||
token_data["is_token_2022"] = (token_program == SYSTEM_TOKEN_2022_PROGRAM)
|
token_data["is_token_2022"] = token_program == SYSTEM_TOKEN_2022_PROGRAM
|
||||||
|
|
||||||
signature = base58.b58encode(
|
signature = base58.b58encode(
|
||||||
bytes(update.transaction.transaction.signature)
|
bytes(update.transaction.transaction.signature)
|
||||||
@@ -391,9 +399,7 @@ async def buy_token(
|
|||||||
),
|
),
|
||||||
AccountMeta(pubkey=payer.pubkey(), is_signer=True, is_writable=True),
|
AccountMeta(pubkey=payer.pubkey(), is_signer=True, is_writable=True),
|
||||||
AccountMeta(pubkey=SYSTEM_PROGRAM, is_signer=False, is_writable=False),
|
AccountMeta(pubkey=SYSTEM_PROGRAM, is_signer=False, is_writable=False),
|
||||||
AccountMeta(
|
AccountMeta(pubkey=token_program, is_signer=False, is_writable=False),
|
||||||
pubkey=token_program, is_signer=False, is_writable=False
|
|
||||||
),
|
|
||||||
AccountMeta(pubkey=creator_vault, is_signer=False, is_writable=True),
|
AccountMeta(pubkey=creator_vault, is_signer=False, is_writable=True),
|
||||||
AccountMeta(
|
AccountMeta(
|
||||||
pubkey=PUMP_EVENT_AUTHORITY, is_signer=False, is_writable=False
|
pubkey=PUMP_EVENT_AUTHORITY, is_signer=False, is_writable=False
|
||||||
@@ -421,6 +427,12 @@ async def buy_token(
|
|||||||
is_signer=False,
|
is_signer=False,
|
||||||
is_writable=False,
|
is_writable=False,
|
||||||
),
|
),
|
||||||
|
# Remaining account: bonding_curve_v2 (readonly, required for all coins)
|
||||||
|
AccountMeta(
|
||||||
|
pubkey=_find_bonding_curve_v2(mint),
|
||||||
|
is_signer=False,
|
||||||
|
is_writable=False,
|
||||||
|
),
|
||||||
]
|
]
|
||||||
|
|
||||||
discriminator = struct.pack("<Q", 16927863322537952870)
|
discriminator = struct.pack("<Q", 16927863322537952870)
|
||||||
@@ -508,13 +520,21 @@ async def main():
|
|||||||
slippage = 0.3 # 30% slippage tolerance
|
slippage = 0.3 # 30% slippage tolerance
|
||||||
|
|
||||||
print(f"Bonding curve address: {bonding_curve}")
|
print(f"Bonding curve address: {bonding_curve}")
|
||||||
print(f"Token Program: {token_program} ({'Token2022' if token_data['is_token_2022'] else 'Standard Token'})")
|
print(
|
||||||
|
f"Token Program: {token_program} ({'Token2022' if token_data['is_token_2022'] else 'Standard Token'})"
|
||||||
|
)
|
||||||
# print(f"Token price: {token_price_sol:.10f} SOL")
|
# print(f"Token price: {token_price_sol:.10f} SOL")
|
||||||
print(
|
print(
|
||||||
f"Buying {amount:.6f} SOL worth of the new token with {slippage * 100:.1f}% slippage tolerance..."
|
f"Buying {amount:.6f} SOL worth of the new token with {slippage * 100:.1f}% slippage tolerance..."
|
||||||
)
|
)
|
||||||
await buy_token(
|
await buy_token(
|
||||||
mint, bonding_curve, associated_bonding_curve, creator_vault, token_program, amount, slippage
|
mint,
|
||||||
|
bonding_curve,
|
||||||
|
associated_bonding_curve,
|
||||||
|
creator_vault,
|
||||||
|
token_program,
|
||||||
|
amount,
|
||||||
|
slippage,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -147,6 +147,14 @@ def _find_fee_config() -> Pubkey:
|
|||||||
return derived_address
|
return derived_address
|
||||||
|
|
||||||
|
|
||||||
|
def _find_bonding_curve_v2(mint: Pubkey) -> Pubkey:
|
||||||
|
derived_address, _ = Pubkey.find_program_address(
|
||||||
|
[b"bonding-curve-v2", bytes(mint)],
|
||||||
|
PUMP_PROGRAM,
|
||||||
|
)
|
||||||
|
return derived_address
|
||||||
|
|
||||||
|
|
||||||
async def get_fee_recipient(
|
async def get_fee_recipient(
|
||||||
client: AsyncClient, curve_state: BondingCurveState
|
client: AsyncClient, curve_state: BondingCurveState
|
||||||
) -> Pubkey:
|
) -> Pubkey:
|
||||||
@@ -312,6 +320,12 @@ async def sell_token(
|
|||||||
is_signer=False,
|
is_signer=False,
|
||||||
is_writable=False,
|
is_writable=False,
|
||||||
),
|
),
|
||||||
|
# Remaining account: bonding_curve_v2 (readonly, required for all coins)
|
||||||
|
AccountMeta(
|
||||||
|
pubkey=_find_bonding_curve_v2(mint),
|
||||||
|
is_signer=False,
|
||||||
|
is_writable=False,
|
||||||
|
),
|
||||||
]
|
]
|
||||||
|
|
||||||
discriminator = struct.pack("<Q", 12502976635542562355)
|
discriminator = struct.pack("<Q", 12502976635542562355)
|
||||||
|
|||||||
@@ -143,6 +143,14 @@ def _find_fee_config() -> Pubkey:
|
|||||||
return derived_address
|
return derived_address
|
||||||
|
|
||||||
|
|
||||||
|
def _find_bonding_curve_v2(mint: Pubkey) -> Pubkey:
|
||||||
|
derived_address, _ = Pubkey.find_program_address(
|
||||||
|
[b"bonding-curve-v2", bytes(mint)],
|
||||||
|
PUMP_PROGRAM,
|
||||||
|
)
|
||||||
|
return derived_address
|
||||||
|
|
||||||
|
|
||||||
def create_pump_create_instruction(
|
def create_pump_create_instruction(
|
||||||
mint: Pubkey,
|
mint: Pubkey,
|
||||||
mint_authority: Pubkey,
|
mint_authority: Pubkey,
|
||||||
@@ -263,6 +271,12 @@ def create_buy_instruction(
|
|||||||
is_signer=False,
|
is_signer=False,
|
||||||
is_writable=False,
|
is_writable=False,
|
||||||
),
|
),
|
||||||
|
# Remaining account: bonding_curve_v2 (readonly, required for all coins)
|
||||||
|
AccountMeta(
|
||||||
|
pubkey=_find_bonding_curve_v2(mint),
|
||||||
|
is_signer=False,
|
||||||
|
is_writable=False,
|
||||||
|
),
|
||||||
]
|
]
|
||||||
|
|
||||||
# Encode OptionBool for track_volume
|
# Encode OptionBool for track_volume
|
||||||
|
|||||||
@@ -159,6 +159,14 @@ def _find_fee_config() -> Pubkey:
|
|||||||
return derived_address
|
return derived_address
|
||||||
|
|
||||||
|
|
||||||
|
def _find_bonding_curve_v2(mint: Pubkey) -> Pubkey:
|
||||||
|
derived_address, _ = Pubkey.find_program_address(
|
||||||
|
[b"bonding-curve-v2", bytes(mint)],
|
||||||
|
PUMP_PROGRAM,
|
||||||
|
)
|
||||||
|
return derived_address
|
||||||
|
|
||||||
|
|
||||||
def create_pump_create_v2_instruction(
|
def create_pump_create_v2_instruction(
|
||||||
mint: Pubkey,
|
mint: Pubkey,
|
||||||
mint_authority: Pubkey,
|
mint_authority: Pubkey,
|
||||||
@@ -307,6 +315,12 @@ def create_buy_instruction(
|
|||||||
is_signer=False,
|
is_signer=False,
|
||||||
is_writable=False,
|
is_writable=False,
|
||||||
),
|
),
|
||||||
|
# Remaining account: bonding_curve_v2 (readonly, required for all coins)
|
||||||
|
AccountMeta(
|
||||||
|
pubkey=_find_bonding_curve_v2(mint),
|
||||||
|
is_signer=False,
|
||||||
|
is_writable=False,
|
||||||
|
),
|
||||||
]
|
]
|
||||||
|
|
||||||
# Encode OptionBool for track_volume
|
# Encode OptionBool for track_volume
|
||||||
|
|||||||
Reference in New Issue
Block a user