如何用JavaScript检查Solana流动性池LP代币是否已锁定销毁?
判断Solana流动性池LP代币是否锁定销毁的实现方案
核心逻辑
LP代币锁定销毁的核心判断依据是:
- 要么LP代币的总供应量为0(完全销毁)
- 要么所有LP代币都存放在不可赎回的黑洞地址(如Solana标准黑洞地址
11111111111111111111111111111111)
基于现有代码的扩展实现
1. 补充依赖与基础配置
确保已安装必要依赖:
npm install @solana/web3.js @orca-so/sdk
2. 完整代码实现
import { Connection, PublicKey, MintLayout } from "@solana/web3.js"; import { LIQUIDITY_STATE_LAYOUT_V4 } from "@orca-so/sdk/dist/whirlpool"; // Solana主网连接(测试网可替换为https://api.devnet.solana.com) const connection = new Connection("https://api.mainnet-beta.solana.com", "confirmed"); // 标准黑洞地址(不可赎回) const BLACKHOLE_ADDRESS = new PublicKey("11111111111111111111111111111111"); async function checkLpLockedAndBurned(poolAddress) { // 1. 获取流动性池账户信息 const poolInfo = await connection.getAccountInfo(new PublicKey(poolAddress)); if (!poolInfo) { console.error("流动性池地址无效"); return false; } // 2. 解析池状态,提取LP代币的mint地址 const poolState = LIQUIDITY_STATE_LAYOUT_V4.decode(poolInfo.data); const lpMintAddress = poolState.lpMint; console.log("LP代币Mint地址:", lpMintAddress.toBase58()); // 3. 获取LP代币的Mint账户信息 const lpMintInfo = await connection.getAccountInfo(lpMintAddress); if (!lpMintInfo) { console.error("LP代币Mint地址无效"); return false; } // 4. 解析Mint状态,获取总供应量 const mintState = MintLayout.decode(lpMintInfo.data); const totalSupply = mintState.supply; console.log("LP代币总供应量:", totalSupply.toString()); // 5. 判断是否完全销毁(总供应量为0) if (totalSupply.toNumber() === 0) { console.log("LP代币已完全销毁"); return true; } // 6. 查询LP代币的所有持有者,判断是否全在黑洞地址 const holders = await connection.getTokenLargestAccounts(lpMintAddress); let allInBlackhole = true; for (const account of holders.value) { const amount = account.uiAmount; const ownerData = await connection.getParsedAccountInfo(account.address); // 跳过零余额账户 if (amount === 0) continue; // 检查持有者是否为黑洞地址 const ownerAddress = ownerData.value?.data?.parsed?.info?.owner; if (ownerAddress !== BLACKHOLE_ADDRESS.toBase58()) { allInBlackhole = false; console.log("发现LP代币持有者:", ownerAddress, "余额:", amount); break; } } if (allInBlackhole) { console.log("所有LP代币已锁定在黑洞地址(不可赎回,等同于销毁)"); return true; } else { console.log("LP代币未完全锁定销毁"); return false; } } // 测试用的SOL-USDC池地址 const SOL_USDC_POOL_ID = "58oQChx4yWmvKdwLLZzBi4ChoCc2fqCUWBkwMihLYQo2"; checkLpLockedAndBurned(SOL_USDC_POOL_ID);
关键说明
- 解析池状态:通过
LIQUIDITY_STATE_LAYOUT_V4解码后,lpMint字段就是该池LP代币的铸造地址 - 总供应量判断:如果LP代币的总供应量为0,说明已被完全销毁
- 黑洞地址判断:如果所有非零余额的LP代币都存放在黑洞地址,说明无法被提取,等同于锁定销毁
- 自定义锁仓地址:若项目使用专属锁仓地址,替换
BLACKHOLE_ADDRESS为项目指定地址即可
内容的提问来源于stack exchange,提问作者Adejunior
相关产品推荐
相关产品推荐

