import { Connection, PublicKey } from "@solana/web3.js";
import { createHash } from "crypto";
const RPC_URL = "<YOUR_RPC_URL>";
const PROGRAM_ID = new PublicKey("CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C");
// Anchor discriminator: sha256("account:AmmConfig") の先頭 8 バイト
const discriminator = createHash("sha256")
.update("account:AmmConfig")
.digest()
.subarray(0, 8);
interface AmmConfig {
bump: number;
disableCreatePool: boolean;
index: number;
tradeFeeRate: bigint;
protocolFeeRate: bigint;
fundFeeRate: bigint;
createPoolFee: bigint;
protocolOwner: PublicKey;
fundOwner: PublicKey;
creatorFeeRate: bigint;
}
function parseAmmConfig(data: Buffer): AmmConfig {
let offset = 8; // Anchor discriminator をスキップ
const bump = data.readUInt8(offset); offset += 1;
const disableCreatePool = data.readUInt8(offset) !== 0; offset += 1;
const index = data.readUInt16LE(offset); offset += 2;
const tradeFeeRate = data.readBigUInt64LE(offset); offset += 8;
const protocolFeeRate = data.readBigUInt64LE(offset); offset += 8;
const fundFeeRate = data.readBigUInt64LE(offset); offset += 8;
const createPoolFee = data.readBigUInt64LE(offset); offset += 8;
const protocolOwner = new PublicKey(data.subarray(offset, offset + 32)); offset += 32;
const fundOwner = new PublicKey(data.subarray(offset, offset + 32)); offset += 32;
const creatorFeeRate = data.readBigUInt64LE(offset);
return {
bump, disableCreatePool, index, tradeFeeRate,
protocolFeeRate, fundFeeRate, createPoolFee,
protocolOwner, fundOwner, creatorFeeRate,
};
}
async function main() {
const connection = new Connection(RPC_URL, "confirmed");
console.log("すべての AmmConfig アカウントを取得しています...\n");
const accounts = await connection.getProgramAccounts(PROGRAM_ID, {
filters: [{
memcmp: {
offset: 0,
bytes: discriminator.toString("base64"),
encoding: "base64",
},
}],
});
console.log(`AmmConfig アカウントを ${accounts.length} 件見つけました\n`);
for (const { pubkey, account } of accounts) {
const config = parseAmmConfig(account.data as Buffer);
console.log(`--- Config index: ${config.index} ---`);
console.log(` Address: ${pubkey.toBase58()}`);
console.log(` Trade Fee Rate: ${config.tradeFeeRate} (${Number(config.tradeFeeRate) / 10000}%)`);
console.log(` Protocol Fee Rate: ${config.protocolFeeRate} (${Number(config.protocolFeeRate) / 10000}% of trade fee)`);
console.log(` Fund Fee Rate: ${config.fundFeeRate} (${Number(config.fundFeeRate) / 10000}% of trade fee)`);
console.log(` Creator Fee Rate: ${config.creatorFeeRate} (${Number(config.creatorFeeRate) / 10000}%)`);
console.log(` Create Pool Fee: ${config.createPoolFee} lamports (${Number(config.createPoolFee) / 1e9} SOL)`);
console.log(` Disable Pool: ${config.disableCreatePool}`);
console.log(` Protocol Owner: ${config.protocolOwner.toBase58()}`);
console.log(` Fund Owner: ${config.fundOwner.toBase58()}`);
console.log();
}
}
main().catch(console.error);