// Get addresses for the current network
const chainId = 84532; // Base Sepolia (change to 8453 for Base Mainnet, 130 for Unichain Mainnet, etc.)
const addresses = DOPPLER_V4_ADDRESSES[chainId];
const airlockAddress = addresses.airlock;
// Create a read factory instance
const factory = new ReadFactory(
airlockAddress,
drift,
);
// Get information about a deployed asset
const assetData = await factory.getAssetData(tokenAddress);
console.log('Asset details:', {
numeraire: assetData.numeraire,
governance: assetData.governance,
pool: assetData.pool,
migrationPool: assetData.migrationPool,
totalSupply: assetData.totalSupply.toString()
});
// Check module state
const moduleState = await factory.getModuleState(moduleAddress);
console.log('Module state:', moduleState);
// Get the asset data to find the pool information
const assetData = await factory.getAssetData(deployedTokenAddress);
// Create a doppler lens instance
const lens = new ReadDopplerLens(addresses.dopplerLensQuoter, drift);
// Define pool key for the created token
const poolKey = {
currency0: assetData.numeraire,
currency1: deployedTokenAddress,
fee: 20_000, // 2% fee tier
tickSpacing: 2,
hooks: assetData.hook // Hook address from asset data
};
// Get comprehensive pool state data
const poolData = await lens.quoteDopplerLensData({
poolKey,
zeroForOne: true,
exactAmount: 1n, // Minimal amount for state query
hookData: "0x"
});
console.log('Pool state:', {
sqrtPriceX96: poolData.sqrtPriceX96.toString(),
tick: poolData.tick,
totalToken0: poolData.amount0.toString(),
totalToken1: poolData.amount1.toString()
});
try {
const { createParams } = factory.buildConfig(config, addresses);
} catch (error) {
if (error.message.includes('Invalid tick range')) {
console.log('Tick range is invalid for the specified fee tier');
} else if (error.message.includes('Hook mining failed')) {
console.log('Could not find suitable hook address');
} else {
console.error('Unexpected error:', error);
}
}