UNPKG

@maxosllc/smart-order-router

Version:
66 lines 6.97 kB
import _ from 'lodash'; import { log, poolToString } from '../util'; export class PoolProvider { /** * Creates an instance of V4PoolProvider. * @param chainId The chain id to use. * @param multicall2Provider The multicall provider to use to get the pools. * @param retryOptions The retry options for each call to the multicall. */ constructor(chainId, multicall2Provider, retryOptions = { retries: 2, minTimeout: 50, maxTimeout: 500, }) { this.chainId = chainId; this.multicall2Provider = multicall2Provider; this.retryOptions = retryOptions; } async getPoolsInternal(poolConstructs, providerConfig) { const poolIdentifierSet = new Set(); const sortedCurrencyPairs = []; const sortedPoolIdentifiers = []; for (const poolConstruct of poolConstructs) { const { poolIdentifier: poolIdentifier, currency0, currency1, } = this.getPoolIdentifier(poolConstruct); if (poolIdentifierSet.has(poolIdentifier)) { continue; } // It's the easiest way to change the pool construct in place, since we don't know the entire pool construct at compiling time. poolConstruct[0] = currency0; poolConstruct[1] = currency1; poolIdentifierSet.add(poolIdentifier); sortedCurrencyPairs.push(poolConstruct); sortedPoolIdentifiers.push(poolIdentifier); } log.debug(`getPools called with ${poolConstructs.length} token pairs. Deduped down to ${poolIdentifierSet.size}`); const [slot0Results, liquidityResults] = await Promise.all([ this.getPoolsData(sortedPoolIdentifiers, this.getSlot0FunctionName(), providerConfig), this.getPoolsData(sortedPoolIdentifiers, this.getLiquidityFunctionName(), providerConfig), ]); log.info(`Got liquidity and slot0s for ${poolIdentifierSet.size} pools ${(providerConfig === null || providerConfig === void 0 ? void 0 : providerConfig.blockNumber) ? `as of block: ${providerConfig === null || providerConfig === void 0 ? void 0 : providerConfig.blockNumber}.` : ``}`); const poolIdentifierToPool = {}; const invalidPools = []; for (let i = 0; i < sortedPoolIdentifiers.length; i++) { const slot0Result = slot0Results[i]; const liquidityResult = liquidityResults[i]; // These properties tell us if a pool is valid and initialized or not. if (!(slot0Result === null || slot0Result === void 0 ? void 0 : slot0Result.success) || !(liquidityResult === null || liquidityResult === void 0 ? void 0 : liquidityResult.success) || slot0Result.result.sqrtPriceX96.eq(0)) { invalidPools.push(sortedCurrencyPairs[i]); continue; } const slot0 = slot0Result.result; const liquidity = liquidityResult.result[0]; const pool = this.instantiatePool(sortedCurrencyPairs[i], slot0, liquidity); const poolIdentifier = sortedPoolIdentifiers[i]; poolIdentifierToPool[poolIdentifier] = pool; } const poolStrs = _.map(Object.values(poolIdentifierToPool), poolToString); log.debug({ poolStrs }, `Found ${poolStrs.length} valid pools`); return this.instantiatePoolAccessor(poolIdentifierToPool); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9vbC1wcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wcm92aWRlcnMvcG9vbC1wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFNQSxPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7QUFFdkIsT0FBTyxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFtQjVDLE1BQU0sT0FBZ0IsWUFBWTtJQU9oQzs7Ozs7T0FLRztJQUNILFlBQ1ksT0FBZ0IsRUFDaEIsa0JBQXNDLEVBQ3RDLGVBQTZCO1FBQ3JDLE9BQU8sRUFBRSxDQUFDO1FBQ1YsVUFBVSxFQUFFLEVBQUU7UUFDZCxVQUFVLEVBQUUsR0FBRztLQUNoQjtRQU5TLFlBQU8sR0FBUCxPQUFPLENBQVM7UUFDaEIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUN0QyxpQkFBWSxHQUFaLFlBQVksQ0FJckI7SUFDQyxDQUFDO0lBRUssS0FBSyxDQUFDLGdCQUFnQixDQUM5QixjQUFnQyxFQUNoQyxjQUErQjtRQUUvQixNQUFNLGlCQUFpQixHQUFnQixJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQ3pELE1BQU0sbUJBQW1CLEdBQTBCLEVBQUUsQ0FBQztRQUN0RCxNQUFNLHFCQUFxQixHQUFhLEVBQUUsQ0FBQztRQUUzQyxLQUFLLE1BQU0sYUFBYSxJQUFJLGNBQWMsRUFBRTtZQUMxQyxNQUFNLEVBQ0osY0FBYyxFQUFFLGNBQWMsRUFDOUIsU0FBUyxFQUNULFNBQVMsR0FDVixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUUxQyxJQUFJLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsRUFBRTtnQkFDekMsU0FBUzthQUNWO1lBRUQsK0hBQStIO1lBQy9ILGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUM7WUFDN0IsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMs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