diff --git a/ts/client/scripts/token-spec.ts b/ts/client/scripts/token-spec.ts new file mode 100644 index 000000000..29c3634cd --- /dev/null +++ b/ts/client/scripts/token-spec.ts @@ -0,0 +1,76 @@ +import { AnchorProvider } from '@coral-xyz/anchor'; +import { getMint } from '@solana/spl-token'; +import { Connection, PublicKey } from '@solana/web3.js'; +import fetch from 'node-fetch'; + +const { MB_CLUSTER_URL, MB_PAYER_KEYPAIR, MB_PAYER3_KEYPAIR, MINT } = + process.env; + +async function main() { + const mintPk = new PublicKey( + MINT ?? + // 'RLBxxFkseAZ4RgJH3Sqn8jXxhmGoz9jWxDNJMh8pL7a', // rlb + // 'MangoCzJ36AjZyKwVj3VnYU4GTonjfVEnJmvvWaxLac', // mngo + 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', // usdc + ); + + const options = AnchorProvider.defaultOptions(); + const connection = new Connection(MB_CLUSTER_URL!, options); + const mint = await getMint(connection, mintPk); + + // does the mint have an authority? + console.log(`Mint has freezeAuthority - ${mint.freezeAuthority != null}`); + console.log(`Mint has mintAuthority - ${mint.mintAuthority != null}`); + + const supplyUi = Number(mint.supply) / Math.pow(10, mint.decimals); + + // how does the token holder distribution look like? + const res = await connection.getTokenLargestAccounts(mintPk); + console.log(`Top 20 token distribution`); + for (const account of res.value) { + console.log( + `- ${account.address.toBase58().padStart(45)} - ${( + (account.uiAmount! * 100) / + supplyUi + ).toFixed(2)}%`, + ); + } + + // are their amm pools? how is their tvl? + // maybe birdeye can provide this? + + // give stats on max,min swap that can be performed at various slippage + // mngo cloud router doesnt work for most mints, maybe use jup api? + const wsolMint = 'So11111111111111111111111111111111111111112'; + async function swap( + priceImpact: number, + inputMint: string, + outputMint: string, + ): Promise { + const response = await fetch( + `https://api.mngo.cloud/router/v1/depth?inputMint=${inputMint}&outputMint=${outputMint}&priceImpactLimit=${priceImpact}`, + ); + const res = await response.json(); + console.log( + `at price impact of ${(priceImpact * 100) + .toString() + .padStart( + 3, + )}%, ${res.maxInput.toLocaleString()} ${inputMint} can be swapped to ${res.minOutput.toLocaleString()} ${outputMint}`, + ); + } + for (const priceImpact of [0.01, 0.1, 0.2]) { + swap(priceImpact, wsolMint, mintPk.toBase58()); + swap(priceImpact, mintPk.toBase58(), wsolMint); + } + + // what was the volume traded yday + // get from jup api? + + // how does the oracle look like? + + + // how was the price volatility yday? +} + +main();