From d803e1de3c937edbf1286f040e81c442a862bedb Mon Sep 17 00:00:00 2001 From: Ake Date: Fri, 20 Dec 2024 23:22:44 +0700 Subject: [PATCH] Add bonding curve state check & Raydium migration event listening --- idl/raydium_amm_idl.json | 2317 +++++++++++++++++ .../check_boding_curve_status.py | 96 + .../listen_to_raydium_migration.py | 92 + 3 files changed, 2505 insertions(+) create mode 100644 idl/raydium_amm_idl.json create mode 100644 learning-examples/check_boding_curve_status.py create mode 100644 learning-examples/listen_to_raydium_migration.py diff --git a/idl/raydium_amm_idl.json b/idl/raydium_amm_idl.json new file mode 100644 index 0000000..08bf20d --- /dev/null +++ b/idl/raydium_amm_idl.json @@ -0,0 +1,2317 @@ +{ + "version": "0.3.0", + "name": "raydium_amm", + "instructions": [ + { + "name": "initialize", + "accounts": [ + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "rent", + "isMut": false, + "isSigner": false + }, + { + "name": "amm", + "isMut": true, + "isSigner": false + }, + { + "name": "ammAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "ammOpenOrders", + "isMut": true, + "isSigner": false + }, + { + "name": "lpMintAddress", + "isMut": true, + "isSigner": false + }, + { + "name": "coinMintAddress", + "isMut": false, + "isSigner": false + }, + { + "name": "pcMintAddress", + "isMut": false, + "isSigner": false + }, + { + "name": "poolCoinTokenAccount", + "isMut": false, + "isSigner": false + }, + { + "name": "poolPcTokenAccount", + "isMut": false, + "isSigner": false + }, + { + "name": "poolWithdrawQueue", + "isMut": true, + "isSigner": false + }, + { + "name": "poolTargetOrdersAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "userLpTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "poolTempLpTokenAccount", + "isMut": false, + "isSigner": false + }, + { + "name": "serumProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "serumMarket", + "isMut": false, + "isSigner": false + }, + { + "name": "userWallet", + "isMut": true, + "isSigner": true + } + ], + "args": [ + { + "name": "nonce", + "type": "u8" + }, + { + "name": "openTime", + "type": "u64" + } + ] + }, + { + "name": "initialize2", + "accounts": [ + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "splAssociatedTokenAccount", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "rent", + "isMut": false, + "isSigner": false + }, + { + "name": "amm", + "isMut": true, + "isSigner": false + }, + { + "name": "ammAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "ammOpenOrders", + "isMut": true, + "isSigner": false + }, + { + "name": "lpMint", + "isMut": true, + "isSigner": false + }, + { + "name": "coinMint", + "isMut": false, + "isSigner": false + }, + { + "name": "pcMint", + "isMut": false, + "isSigner": false + }, + { + "name": "poolCoinTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "poolPcTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "poolWithdrawQueue", + "isMut": true, + "isSigner": false + }, + { + "name": "ammTargetOrders", + "isMut": true, + "isSigner": false + }, + { + "name": "poolTempLp", + "isMut": true, + "isSigner": false + }, + { + "name": "serumProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "serumMarket", + "isMut": false, + "isSigner": false + }, + { + "name": "userWallet", + "isMut": true, + "isSigner": true + }, + { + "name": "userTokenCoin", + "isMut": true, + "isSigner": false + }, + { + "name": "userTokenPc", + "isMut": true, + "isSigner": false + }, + { + "name": "userLpTokenAccount", + "isMut": true, + "isSigner": false + } + ], + "args": [ + { + "name": "nonce", + "type": "u8" + }, + { + "name": "openTime", + "type": "u64" + }, + { + "name": "initPcAmount", + "type": "u64" + }, + { + "name": "initCoinAmount", + "type": "u64" + } + ] + }, + { + "name": "monitorStep", + "accounts": [ + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "rent", + "isMut": false, + "isSigner": false + }, + { + "name": "clock", + "isMut": false, + "isSigner": false + }, + { + "name": "amm", + "isMut": true, + "isSigner": false + }, + { + "name": "ammAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "ammOpenOrders", + "isMut": true, + "isSigner": false + }, + { + "name": "ammTargetOrders", + "isMut": true, + "isSigner": false + }, + { + "name": "poolCoinTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "poolPcTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "poolWithdrawQueue", + "isMut": true, + "isSigner": false + }, + { + "name": "serumProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "serumMarket", + "isMut": true, + "isSigner": false + }, + { + "name": "serumCoinVaultAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "serumPcVaultAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "serumVaultSigner", + "isMut": false, + "isSigner": false + }, + { + "name": "serumReqQ", + "isMut": true, + "isSigner": false + }, + { + "name": "serumEventQ", + "isMut": true, + "isSigner": false + }, + { + "name": "serumBids", + "isMut": true, + "isSigner": false + }, + { + "name": "serumAsks", + "isMut": true, + "isSigner": false + } + ], + "args": [ + { + "name": "planOrderLimit", + "type": "u16" + }, + { + "name": "placeOrderLimit", + "type": "u16" + }, + { + "name": "cancelOrderLimit", + "type": "u16" + } + ] + }, + { + "name": "deposit", + "accounts": [ + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "amm", + "isMut": true, + "isSigner": false + }, + { + "name": "ammAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "ammOpenOrders", + "isMut": false, + "isSigner": false + }, + { + "name": "ammTargetOrders", + "isMut": true, + "isSigner": false + }, + { + "name": "lpMintAddress", + "isMut": true, + "isSigner": false + }, + { + "name": "poolCoinTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "poolPcTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "serumMarket", + "isMut": false, + "isSigner": false + }, + { + "name": "userCoinTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "userPcTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "userLpTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "userOwner", + "isMut": false, + "isSigner": true + }, + { + "name": "serumEventQueue", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "maxCoinAmount", + "type": "u64" + }, + { + "name": "maxPcAmount", + "type": "u64" + }, + { + "name": "baseSide", + "type": "u64" + } + ] + }, + { + "name": "withdraw", + "accounts": [ + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "amm", + "isMut": true, + "isSigner": false + }, + { + "name": "ammAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "ammOpenOrders", + "isMut": true, + "isSigner": false + }, + { + "name": "ammTargetOrders", + "isMut": true, + "isSigner": false + }, + { + "name": "lpMintAddress", + "isMut": true, + "isSigner": false + }, + { + "name": "poolCoinTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "poolPcTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "poolWithdrawQueue", + "isMut": true, + "isSigner": false + }, + { + "name": "poolTempLpTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "serumProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "serumMarket", + "isMut": true, + "isSigner": false + }, + { + "name": "serumCoinVaultAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "serumPcVaultAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "serumVaultSigner", + "isMut": false, + "isSigner": false + }, + { + "name": "userLpTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "uerCoinTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "uerPcTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "userOwner", + "isMut": false, + "isSigner": true + }, + { + "name": "serumEventQ", + "isMut": true, + "isSigner": false + }, + { + "name": "serumBids", + "isMut": true, + "isSigner": false + }, + { + "name": "serumAsks", + "isMut": true, + "isSigner": false + } + ], + "args": [ + { + "name": "amount", + "type": "u64" + } + ] + }, + { + "name": "migrateToOpenBook", + "accounts": [ + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "rent", + "isMut": false, + "isSigner": false + }, + { + "name": "amm", + "isMut": true, + "isSigner": false + }, + { + "name": "ammAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "ammOpenOrders", + "isMut": true, + "isSigner": false + }, + { + "name": "ammTokenCoin", + "isMut": true, + "isSigner": false + }, + { + "name": "ammTokenPc", + "isMut": true, + "isSigner": false + }, + { + "name": "ammTargetOrders", + "isMut": true, + "isSigner": false + }, + { + "name": "serumProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "serumMarket", + "isMut": true, + "isSigner": false + }, + { + "name": "serumBids", + "isMut": true, + "isSigner": false + }, + { + "name": "serumAsks", + "isMut": true, + "isSigner": false + }, + { + "name": "serumEventQueue", + "isMut": true, + "isSigner": false + }, + { + "name": "serumCoinVault", + "isMut": true, + "isSigner": false + }, + { + "name": "serumPcVault", + "isMut": true, + "isSigner": false + }, + { + "name": "serumVaultSigner", + "isMut": false, + "isSigner": false + }, + { + "name": "newAmmOpenOrders", + "isMut": true, + "isSigner": false + }, + { + "name": "newSerumProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "newSerumMarket", + "isMut": false, + "isSigner": false + }, + { + "name": "admin", + "isMut": true, + "isSigner": true + } + ], + "args": [] + }, + { + "name": "setParams", + "accounts": [ + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "amm", + "isMut": true, + "isSigner": false + }, + { + "name": "ammAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "ammOpenOrders", + "isMut": true, + "isSigner": false + }, + { + "name": "ammTargetOrders", + "isMut": true, + "isSigner": false + }, + { + "name": "ammCoinVault", + "isMut": true, + "isSigner": false + }, + { + "name": "ammPcVault", + "isMut": true, + "isSigner": false + }, + { + "name": "serumProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "serumMarket", + "isMut": true, + "isSigner": false + }, + { + "name": "serumCoinVault", + "isMut": true, + "isSigner": false + }, + { + "name": "serumPcVault", + "isMut": true, + "isSigner": false + }, + { + "name": "serumVaultSigner", + "isMut": false, + "isSigner": false + }, + { + "name": "serumEventQueue", + "isMut": true, + "isSigner": false + }, + { + "name": "serumBids", + "isMut": true, + "isSigner": false + }, + { + "name": "serumAsks", + "isMut": true, + "isSigner": false + }, + { + "name": "ammAdminAccount", + "isMut": false, + "isSigner": true + } + ], + "args": [ + { + "name": "param", + "type": "u8" + }, + { + "name": "value", + "type": { + "option": "u64" + } + }, + { + "name": "newPubkey", + "type": { + "option": "publicKey" + } + }, + { + "name": "fees", + "type": { + "option": { + "defined": "Fees" + } + } + }, + { + "name": "lastOrderDistance", + "type": { + "option": { + "defined": "LastOrderDistance" + } + } + }, + { + "name": "needTakeAmounts", + "type": { + "option": { + "defined": "NeedTake" + } + } + } + ] + }, + { + "name": "withdrawPnl", + "accounts": [ + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "amm", + "isMut": true, + "isSigner": false + }, + { + "name": "ammConfig", + "isMut": false, + "isSigner": false + }, + { + "name": "ammAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "ammOpenOrders", + "isMut": true, + "isSigner": false + }, + { + "name": "poolCoinTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "poolPcTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "coinPnlTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "pcPnlTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "pnlOwnerAccount", + "isMut": false, + "isSigner": true + }, + { + "name": "ammTargetOrders", + "isMut": true, + "isSigner": false + }, + { + "name": "serumProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "serumMarket", + "isMut": true, + "isSigner": false + }, + { + "name": "serumEventQueue", + "isMut": false, + "isSigner": false + }, + { + "name": "serumCoinVaultAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "serumPcVaultAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "serumVaultSigner", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "withdrawSrm", + "accounts": [ + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "amm", + "isMut": false, + "isSigner": false + }, + { + "name": "ammOwnerAccount", + "isMut": false, + "isSigner": true + }, + { + "name": "ammAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "srmToken", + "isMut": true, + "isSigner": false + }, + { + "name": "destSrmToken", + "isMut": true, + "isSigner": false + } + ], + "args": [ + { + "name": "amount", + "type": "u64" + } + ] + }, + { + "name": "swapBaseIn", + "accounts": [ + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "amm", + "isMut": true, + "isSigner": false + }, + { + "name": "ammAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "ammOpenOrders", + "isMut": true, + "isSigner": false + }, + { + "name": "ammTargetOrders", + "isMut": true, + "isSigner": false + }, + { + "name": "poolCoinTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "poolPcTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "serumProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "serumMarket", + "isMut": true, + "isSigner": false + }, + { + "name": "serumBids", + "isMut": true, + "isSigner": false + }, + { + "name": "serumAsks", + "isMut": true, + "isSigner": false + }, + { + "name": "serumEventQueue", + "isMut": true, + "isSigner": false + }, + { + "name": "serumCoinVaultAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "serumPcVaultAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "serumVaultSigner", + "isMut": false, + "isSigner": false + }, + { + "name": "uerSourceTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "uerDestinationTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "userSourceOwner", + "isMut": false, + "isSigner": true + } + ], + "args": [ + { + "name": "amountIn", + "type": "u64" + }, + { + "name": "minimumAmountOut", + "type": "u64" + } + ] + }, + { + "name": "preInitialize", + "accounts": [ + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "rent", + "isMut": false, + "isSigner": false + }, + { + "name": "ammTargetOrders", + "isMut": true, + "isSigner": false + }, + { + "name": "poolWithdrawQueue", + "isMut": true, + "isSigner": false + }, + { + "name": "ammAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "lpMintAddress", + "isMut": true, + "isSigner": false + }, + { + "name": "coinMintAddress", + "isMut": false, + "isSigner": false + }, + { + "name": "pcMintAddress", + "isMut": false, + "isSigner": false + }, + { + "name": "poolCoinTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "poolPcTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "poolTempLpTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "serumMarket", + "isMut": false, + "isSigner": false + }, + { + "name": "userWallet", + "isMut": true, + "isSigner": true + } + ], + "args": [ + { + "name": "nonce", + "type": "u8" + } + ] + }, + { + "name": "swapBaseOut", + "accounts": [ + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "amm", + "isMut": true, + "isSigner": false + }, + { + "name": "ammAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "ammOpenOrders", + "isMut": true, + "isSigner": false + }, + { + "name": "ammTargetOrders", + "isMut": true, + "isSigner": false + }, + { + "name": "poolCoinTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "poolPcTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "serumProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "serumMarket", + "isMut": true, + "isSigner": false + }, + { + "name": "serumBids", + "isMut": true, + "isSigner": false + }, + { + "name": "serumAsks", + "isMut": true, + "isSigner": false + }, + { + "name": "serumEventQueue", + "isMut": true, + "isSigner": false + }, + { + "name": "serumCoinVaultAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "serumPcVaultAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "serumVaultSigner", + "isMut": false, + "isSigner": false + }, + { + "name": "uerSourceTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "uerDestinationTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "userSourceOwner", + "isMut": false, + "isSigner": true + } + ], + "args": [ + { + "name": "maxAmountIn", + "type": "u64" + }, + { + "name": "amountOut", + "type": "u64" + } + ] + }, + { + "name": "simulateInfo", + "accounts": [ + { + "name": "amm", + "isMut": false, + "isSigner": false + }, + { + "name": "ammAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "ammOpenOrders", + "isMut": false, + "isSigner": false + }, + { + "name": "poolCoinTokenAccount", + "isMut": false, + "isSigner": false + }, + { + "name": "poolPcTokenAccount", + "isMut": false, + "isSigner": false + }, + { + "name": "lpMintAddress", + "isMut": false, + "isSigner": false + }, + { + "name": "serumMarket", + "isMut": false, + "isSigner": false + }, + { + "name": "serumEventQueue", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "param", + "type": "u8" + }, + { + "name": "swapBaseInValue", + "type": { + "option": { + "defined": "SwapInstructionBaseIn" + } + } + }, + { + "name": "swapBaseOutValue", + "type": { + "option": { + "defined": "SwapInstructionBaseOut" + } + } + } + ] + }, + { + "name": "adminCancelOrders", + "accounts": [ + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "amm", + "isMut": false, + "isSigner": false + }, + { + "name": "ammAuthority", + "isMut": false, + "isSigner": false + }, + { + "name": "ammOpenOrders", + "isMut": true, + "isSigner": false + }, + { + "name": "ammTargetOrders", + "isMut": true, + "isSigner": false + }, + { + "name": "poolCoinTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "poolPcTokenAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "ammOwnerAccount", + "isMut": false, + "isSigner": true + }, + { + "name": "ammConfig", + "isMut": true, + "isSigner": false + }, + { + "name": "serumProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "serumMarket", + "isMut": true, + "isSigner": false + }, + { + "name": "serumCoinVaultAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "serumPcVaultAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "serumVaultSigner", + "isMut": false, + "isSigner": false + }, + { + "name": "serumEventQ", + "isMut": true, + "isSigner": false + }, + { + "name": "serumBids", + "isMut": true, + "isSigner": false + }, + { + "name": "serumAsks", + "isMut": true, + "isSigner": false + } + ], + "args": [ + { + "name": "limit", + "type": "u16" + } + ] + }, + { + "name": "createConfigAccount", + "accounts": [ + { + "name": "admin", + "isMut": true, + "isSigner": true + }, + { + "name": "ammConfig", + "isMut": true, + "isSigner": false + }, + { + "name": "owner", + "isMut": false, + "isSigner": false + }, + { + "name": "systemProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "rent", + "isMut": false, + "isSigner": false + } + ], + "args": [] + }, + { + "name": "updateConfigAccount", + "accounts": [ + { + "name": "admin", + "isMut": false, + "isSigner": true + }, + { + "name": "ammConfig", + "isMut": true, + "isSigner": false + } + ], + "args": [ + { + "name": "param", + "type": "u8" + }, + { + "name": "owner", + "type": "publicKey" + } + ] + } + ], + "accounts": [ + { + "name": "TargetOrders", + "type": { + "kind": "struct", + "fields": [ + { + "name": "owner", + "type": { + "array": [ + "u64", + 4 + ] + } + }, + { + "name": "buyOrders", + "type": { + "array": [ + { + "defined": "TargetOrder" + }, + 50 + ] + } + }, + { + "name": "padding1", + "type": { + "array": [ + "u64", + 8 + ] + } + }, + { + "name": "targetX", + "type": "u128" + }, + { + "name": "targetY", + "type": "u128" + }, + { + "name": "planXBuy", + "type": "u128" + }, + { + "name": "planYBuy", + "type": "u128" + }, + { + "name": "planXSell", + "type": "u128" + }, + { + "name": "planYSell", + "type": "u128" + }, + { + "name": "placedX", + "type": "u128" + }, + { + "name": "placedY", + "type": "u128" + }, + { + "name": "calcPnlX", + "type": "u128" + }, + { + "name": "calcPnlY", + "type": "u128" + }, + { + "name": "sellOrders", + "type": { + "array": [ + { + "defined": "TargetOrder" + }, + 50 + ] + } + }, + { + "name": "padding2", + "type": { + "array": [ + "u64", + 6 + ] + } + }, + { + "name": "replaceBuyClientId", + "type": { + "array": [ + "u64", + 10 + ] + } + }, + { + "name": "replaceSellClientId", + "type": { + "array": [ + "u64", + 10 + ] + } + }, + { + "name": "lastOrderNumerator", + "type": "u64" + }, + { + "name": "lastOrderDenominator", + "type": "u64" + }, + { + "name": "planOrdersCur", + "type": "u64" + }, + { + "name": "placeOrdersCur", + "type": "u64" + }, + { + "name": "validBuyOrderNum", + "type": "u64" + }, + { + "name": "validSellOrderNum", + "type": "u64" + }, + { + "name": "padding3", + "type": { + "array": [ + "u64", + 10 + ] + } + }, + { + "name": "freeSlotBits", + "type": "u128" + } + ] + } + }, + { + "name": "Fees", + "type": { + "kind": "struct", + "fields": [ + { + "name": "minSeparateNumerator", + "type": "u64" + }, + { + "name": "minSeparateDenominator", + "type": "u64" + }, + { + "name": "tradeFeeNumerator", + "type": "u64" + }, + { + "name": "tradeFeeDenominator", + "type": "u64" + }, + { + "name": "pnlNumerator", + "type": "u64" + }, + { + "name": "pnlDenominator", + "type": "u64" + }, + { + "name": "swapFeeNumerator", + "type": "u64" + }, + { + "name": "swapFeeDenominator", + "type": "u64" + } + ] + } + }, + { + "name": "AmmInfo", + "type": { + "kind": "struct", + "fields": [ + { + "name": "status", + "type": "u64" + }, + { + "name": "nonce", + "type": "u64" + }, + { + "name": "orderNum", + "type": "u64" + }, + { + "name": "depth", + "type": "u64" + }, + { + "name": "coinDecimals", + "type": "u64" + }, + { + "name": "pcDecimals", + "type": "u64" + }, + { + "name": "state", + "type": "u64" + }, + { + "name": "resetFlag", + "type": "u64" + }, + { + "name": "minSize", + "type": "u64" + }, + { + "name": "volMaxCutRatio", + "type": "u64" + }, + { + "name": "amountWave", + "type": "u64" + }, + { + "name": "coinLotSize", + "type": "u64" + }, + { + "name": "pcLotSize", + "type": "u64" + }, + { + "name": "minPriceMultiplier", + "type": "u64" + }, + { + "name": "maxPriceMultiplier", + "type": "u64" + }, + { + "name": "sysDecimalValue", + "type": "u64" + }, + { + "name": "fees", + "type": { + "defined": "Fees" + } + }, + { + "name": "outPut", + "type": { + "defined": "OutPutData" + } + }, + { + "name": "tokenCoin", + "type": "publicKey" + }, + { + "name": "tokenPc", + "type": "publicKey" + }, + { + "name": "coinMint", + "type": "publicKey" + }, + { + "name": "pcMint", + "type": "publicKey" + }, + { + "name": "lpMint", + "type": "publicKey" + }, + { + "name": "openOrders", + "type": "publicKey" + }, + { + "name": "market", + "type": "publicKey" + }, + { + "name": "serumDex", + "type": "publicKey" + }, + { + "name": "targetOrders", + "type": "publicKey" + }, + { + "name": "withdrawQueue", + "type": "publicKey" + }, + { + "name": "tokenTempLp", + "type": "publicKey" + }, + { + "name": "ammOwner", + "type": "publicKey" + }, + { + "name": "lpAmount", + "type": "u64" + }, + { + "name": "clientOrderId", + "type": "u64" + }, + { + "name": "padding", + "type": { + "array": [ + "u64", + 2 + ] + } + } + ] + } + } + ], + "types": [ + { + "name": "WithdrawDestToken", + "type": { + "kind": "struct", + "fields": [ + { + "name": "withdrawAmount", + "type": "u64" + }, + { + "name": "coinAmount", + "type": "u64" + }, + { + "name": "pcAmount", + "type": "u64" + }, + { + "name": "destTokenCoin", + "type": "publicKey" + }, + { + "name": "destTokenPc", + "type": "publicKey" + } + ] + } + }, + { + "name": "WithdrawQueue", + "type": { + "kind": "struct", + "fields": [ + { + "name": "owner", + "type": { + "array": [ + "u64", + 4 + ] + } + }, + { + "name": "head", + "type": "u64" + }, + { + "name": "count", + "type": "u64" + }, + { + "name": "buf", + "type": { + "array": [ + { + "defined": "WithdrawDestToken" + }, + 64 + ] + } + } + ] + } + }, + { + "name": "TargetOrder", + "type": { + "kind": "struct", + "fields": [ + { + "name": "price", + "type": "u64" + }, + { + "name": "vol", + "type": "u64" + } + ] + } + }, + { + "name": "OutPutData", + "type": { + "kind": "struct", + "fields": [ + { + "name": "needTakePnlCoin", + "type": "u64" + }, + { + "name": "needTakePnlPc", + "type": "u64" + }, + { + "name": "totalPnlPc", + "type": "u64" + }, + { + "name": "totalPnlCoin", + "type": "u64" + }, + { + "name": "poolOpenTime", + "type": "u64" + }, + { + "name": "punishPcAmount", + "type": "u64" + }, + { + "name": "punishCoinAmount", + "type": "u64" + }, + { + "name": "orderbookToInitTime", + "type": "u64" + }, + { + "name": "swapCoinInAmount", + "type": "u128" + }, + { + "name": "swapPcOutAmount", + "type": "u128" + }, + { + "name": "swapTakePcFee", + "type": "u64" + }, + { + "name": "swapPcInAmount", + "type": "u128" + }, + { + "name": "swapCoinOutAmount", + "type": "u128" + }, + { + "name": "swapTakeCoinFee", + "type": "u64" + } + ] + } + }, + { + "name": "AmmConfig", + "type": { + "kind": "struct", + "fields": [ + { + "name": "pnlOwner", + "type": "publicKey" + }, + { + "name": "cancelOwner", + "type": "publicKey" + }, + { + "name": "pending1", + "type": { + "array": [ + "u64", + 28 + ] + } + }, + { + "name": "pending2", + "type": { + "array": [ + "u64", + 32 + ] + } + } + ] + } + }, + { + "name": "LastOrderDistance", + "type": { + "kind": "struct", + "fields": [ + { + "name": "lastOrderNumerator", + "type": "u64" + }, + { + "name": "lastOrderDenominator", + "type": "u64" + } + ] + } + }, + { + "name": "NeedTake", + "type": { + "kind": "struct", + "fields": [ + { + "name": "needTakePc", + "type": "u64" + }, + { + "name": "needTakeCoin", + "type": "u64" + } + ] + } + }, + { + "name": "SwapInstructionBaseIn", + "type": { + "kind": "struct", + "fields": [ + { + "name": "amountIn", + "type": "u64" + }, + { + "name": "minimumAmountOut", + "type": "u64" + } + ] + } + }, + { + "name": "SwapInstructionBaseOut", + "type": { + "kind": "struct", + "fields": [ + { + "name": "maxAmountIn", + "type": "u64" + }, + { + "name": "amountOut", + "type": "u64" + } + ] + } + } + ], + "errors": [ + { + "code": 0, + "name": "AlreadyInUse", + "msg": "AlreadyInUse" + }, + { + "code": 1, + "name": "InvalidProgramAddress", + "msg": "InvalidProgramAddress" + }, + { + "code": 2, + "name": "ExpectedMint", + "msg": "ExpectedMint" + }, + { + "code": 3, + "name": "ExpectedAccount", + "msg": "ExpectedAccount" + }, + { + "code": 4, + "name": "InvalidCoinVault", + "msg": "InvalidCoinVault" + }, + { + "code": 5, + "name": "InvalidPCVault", + "msg": "InvalidPCVault" + }, + { + "code": 6, + "name": "InvalidTokenLP", + "msg": "InvalidTokenLP" + }, + { + "code": 7, + "name": "InvalidDestTokenCoin", + "msg": "InvalidDestTokenCoin" + }, + { + "code": 8, + "name": "InvalidDestTokenPC", + "msg": "InvalidDestTokenPC" + }, + { + "code": 9, + "name": "InvalidPoolMint", + "msg": "InvalidPoolMint" + }, + { + "code": 10, + "name": "InvalidOpenOrders", + "msg": "InvalidOpenOrders" + }, + { + "code": 11, + "name": "InvalidSerumMarket", + "msg": "InvalidSerumMarket" + }, + { + "code": 12, + "name": "InvalidSerumProgram", + "msg": "InvalidSerumProgram" + }, + { + "code": 13, + "name": "InvalidTargetOrders", + "msg": "InvalidTargetOrders" + }, + { + "code": 14, + "name": "InvalidWithdrawQueue", + "msg": "InvalidWithdrawQueue" + }, + { + "code": 15, + "name": "InvalidTempLp", + "msg": "InvalidTempLp" + }, + { + "code": 16, + "name": "InvalidCoinMint", + "msg": "InvalidCoinMint" + }, + { + "code": 17, + "name": "InvalidPCMint", + "msg": "InvalidPCMint" + }, + { + "code": 18, + "name": "InvalidOwner", + "msg": "InvalidOwner" + }, + { + "code": 19, + "name": "InvalidSupply", + "msg": "InvalidSupply" + }, + { + "code": 20, + "name": "InvalidDelegate", + "msg": "InvalidDelegate" + }, + { + "code": 21, + "name": "InvalidSignAccount", + "msg": "Invalid Sign Account" + }, + { + "code": 22, + "name": "InvalidStatus", + "msg": "InvalidStatus" + }, + { + "code": 23, + "name": "InvalidInstruction", + "msg": "Invalid instruction" + }, + { + "code": 24, + "name": "WrongAccountsNumber", + "msg": "Wrong accounts number" + }, + { + "code": 25, + "name": "WithdrawTransferBusy", + "msg": "Withdraw_transfer is busy" + }, + { + "code": 26, + "name": "WithdrawQueueFull", + "msg": "WithdrawQueue is full" + }, + { + "code": 27, + "name": "WithdrawQueueEmpty", + "msg": "WithdrawQueue is empty" + }, + { + "code": 28, + "name": "InvalidParamsSet", + "msg": "Params Set is invalid" + }, + { + "code": 29, + "name": "InvalidInput", + "msg": "InvalidInput" + }, + { + "code": 30, + "name": "ExceededSlippage", + "msg": "instruction exceeds desired slippage limit" + }, + { + "code": 31, + "name": "CalculationExRateFailure", + "msg": "CalculationExRateFailure" + }, + { + "code": 32, + "name": "CheckedSubOverflow", + "msg": "Checked_Sub Overflow" + }, + { + "code": 33, + "name": "CheckedAddOverflow", + "msg": "Checked_Add Overflow" + }, + { + "code": 34, + "name": "CheckedMulOverflow", + "msg": "Checked_Mul Overflow" + }, + { + "code": 35, + "name": "CheckedDivOverflow", + "msg": "Checked_Div Overflow" + }, + { + "code": 36, + "name": "CheckedEmptyFunds", + "msg": "Empty Funds" + }, + { + "code": 37, + "name": "CalcPnlError", + "msg": "Calc pnl error" + }, + { + "code": 38, + "name": "InvalidSplTokenProgram", + "msg": "InvalidSplTokenProgram" + }, + { + "code": 39, + "name": "TakePnlError", + "msg": "Take Pnl error" + }, + { + "code": 40, + "name": "InsufficientFunds", + "msg": "Insufficient funds" + }, + { + "code": 41, + "name": "ConversionFailure", + "msg": "Conversion to u64 failed with an overflow or underflow" + }, + { + "code": 42, + "name": "InvalidUserToken", + "msg": "user token input does not match amm" + }, + { + "code": 43, + "name": "InvalidSrmMint", + "msg": "InvalidSrmMint" + }, + { + "code": 44, + "name": "InvalidSrmToken", + "msg": "InvalidSrmToken" + }, + { + "code": 45, + "name": "TooManyOpenOrders", + "msg": "TooManyOpenOrders" + }, + { + "code": 46, + "name": "OrderAtSlotIsPlaced", + "msg": "OrderAtSlotIsPlaced" + }, + { + "code": 47, + "name": "InvalidSysProgramAddress", + "msg": "InvalidSysProgramAddress" + }, + { + "code": 48, + "name": "InvalidFee", + "msg": "The provided fee does not match the program owner's constraints" + }, + { + "code": 49, + "name": "RepeatCreateAmm", + "msg": "Repeat create amm about market" + }, + { + "code": 50, + "name": "NotAllowZeroLP", + "msg": "Not allow Zero LP" + }, + { + "code": 51, + "name": "InvalidCloseAuthority", + "msg": "Token account has a close authority" + }, + { + "code": 52, + "name": "InvalidFreezeAuthority", + "msg": "Pool token mint has a freeze authority" + }, + { + "code": 53, + "name": "InvalidReferPCMint", + "msg": "InvalidReferPCMint" + }, + { + "code": 54, + "name": "InvalidConfigAccount", + "msg": "InvalidConfigAccount" + }, + { + "code": 55, + "name": "RepeatCreateConfigAccount", + "msg": "Repeat create staking config account" + }, + { + "code": 56, + "name": "UnknownAmmError", + "msg": "Unknown Amm Error" + } + ] +} \ No newline at end of file diff --git a/learning-examples/check_boding_curve_status.py b/learning-examples/check_boding_curve_status.py new file mode 100644 index 0000000..2957b62 --- /dev/null +++ b/learning-examples/check_boding_curve_status.py @@ -0,0 +1,96 @@ +import asyncio +import struct +from typing import Final +from construct import Struct, Int64ul, Flag +from solana.rpc.async_api import AsyncClient +from solders.pubkey import Pubkey +import argparse +import sys +import os + +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) +from config import RPC_ENDPOINT, PUMP_PROGRAM + +# Constants +EXPECTED_DISCRIMINATOR: Final[bytes] = struct.pack(" None: + parsed = self._STRUCT.parse(data[8:]) + self.__dict__.update(parsed) + +def get_associated_bonding_curve_address(mint: Pubkey, program_id: Pubkey) -> tuple[Pubkey, int]: + """ + Derives the associated bonding curve address for a given mint + """ + return Pubkey.find_program_address( + [ + b"bonding-curve", + bytes(mint) + ], + program_id + ) + +async def get_bonding_curve_state(conn: AsyncClient, curve_address: Pubkey) -> BondingCurveState: + response = await conn.get_account_info(curve_address) + if not response.value or not response.value.data: + raise ValueError("Invalid curve state: No data") + + data = response.value.data + if data[:8] != EXPECTED_DISCRIMINATOR: + raise ValueError("Invalid curve state discriminator") + + return BondingCurveState(data) + +async def check_token_status(mint_address: str) -> None: + try: + mint = Pubkey.from_string(mint_address) + + # Get the associated bonding curve address + bonding_curve_address, bump = get_associated_bonding_curve_address(mint, PUMP_PROGRAM) + + print("\nToken Status:") + print("-" * 50) + print(f"Token Mint: {mint}") + print(f"Associated Bonding Curve: {bonding_curve_address}") + print(f"Bump Seed: {bump}") + print("-" * 50) + + # Check completion status + async with AsyncClient(RPC_ENDPOINT) as client: + try: + curve_state = await get_bonding_curve_state(client, bonding_curve_address) + + print("\nBonding Curve Status:") + print("-" * 50) + print(f"Completion Status: {'Completed' if curve_state.complete else 'Not Completed'}") + if curve_state.complete: + print("\nNote: This bonding curve has completed and liquidity has been migrated to Raydium.") + print("-" * 50) + + except ValueError as e: + print(f"\nError accessing bonding curve: {e}") + + except ValueError as e: + print(f"\nError: Invalid address format - {e}") + except Exception as e: + print(f"\nUnexpected error: {e}") + +def main(): + parser = argparse.ArgumentParser(description='Check token bonding curve status') + parser.add_argument('mint_address', help='The token mint address') + + args = parser.parse_args() + asyncio.run(check_token_status(args.mint_address)) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/learning-examples/listen_to_raydium_migration.py b/learning-examples/listen_to_raydium_migration.py new file mode 100644 index 0000000..1a7b331 --- /dev/null +++ b/learning-examples/listen_to_raydium_migration.py @@ -0,0 +1,92 @@ +import websockets +import asyncio +import json +import base64 +from solders.pubkey import Pubkey +import sys +import os + +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) +from config import WSS_ENDPOINT, PUMP_LIQUIDITY_MIGRATOR + +def process_initialize2_transaction(data): + """Process and decode an initialize2 transaction""" + try: + signature = data['transaction']['signatures'][0] + account_keys = data['transaction']['message']['accountKeys'] + + # Check raydium_amm_idl.json for the account keys + # The token address is typically the 19th account (index 18) + # The liquidity pool address is typically the 3rd account (index 2) + if len(account_keys) > 18: + token_address = account_keys[18] + liquidity_address = account_keys[2] + + print(f"\nSignature: {signature}") + print(f"Token Address: {token_address}") + print(f"Liquidity Address: {liquidity_address}") + print("=" * 50) + else: + print(f"\nError: Not enough account keys (found {len(account_keys)})") + + except Exception as e: + print(f"\nError: {str(e)}") + +async def listen_for_events(): + while True: + try: + async with websockets.connect(WSS_ENDPOINT) as websocket: + subscription_message = json.dumps({ + "jsonrpc": "2.0", + "id": 1, + "method": "blockSubscribe", + "params": [ + {"mentionsAccountOrProgram": str(PUMP_LIQUIDITY_MIGRATOR)}, + { + "commitment": "confirmed", + "encoding": "json", + "showRewards": False, + "transactionDetails": "full", + "maxSupportedTransactionVersion": 0 + } + ] + }) + + await websocket.send(subscription_message) + response = await websocket.recv() + print(f"Subscription response: {response}") + print("\nListening for Raydium pool initialization events...") + + while True: + try: + response = await asyncio.wait_for(websocket.recv(), timeout=30) + data = json.loads(response) + + if 'method' in data and data['method'] == 'blockNotification': + if 'params' in data and 'result' in data['params']: + block_data = data['params']['result'] + if 'value' in block_data and 'block' in block_data['value']: + block = block_data['value']['block'] + if 'transactions' in block: + for tx in block['transactions']: + logs = tx.get('meta', {}).get('logMessages', []) + + # Check for initialize2 instruction + for log in logs: + if "Program log: initialize2: InitializeInstruction2" in log: + print("Found initialize2 instruction!") + process_initialize2_transaction(tx) + break + + except asyncio.TimeoutError: + print("\nChecking connection...") + print("Connection alive") + continue + + except Exception as e: + print(f"\nConnection error: {str(e)}") + print("Retrying in 5 seconds...") + await asyncio.sleep(5) + +if __name__ == "__main__": + asyncio.run(listen_for_events()) \ No newline at end of file