@maxosllc/smart-order-router
Version:
BlockDAG Smart Order Router
109 lines • 8.33 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.V3PoolProvider = void 0;
const v3_sdk_1 = require("@uniswap/v3-sdk");
const compute_pool_address_1 = require("./compute-pool-address");
const async_retry_1 = __importDefault(require("async-retry"));
const IUniswapV3PoolState__factory_1 = require("../../types/v3/factories/IUniswapV3PoolState__factory");
const addresses_1 = require("../../util/addresses");
const log_1 = require("../../util/log");
const pool_provider_1 = require("../pool-provider");
class V3PoolProvider extends pool_provider_1.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,
}) {
super(chainId, multicall2Provider, retryOptions);
// Computing pool addresses is slow as it requires hashing, encoding etc.
// Addresses never change so can always be cached.
this.POOL_ADDRESS_CACHE = {};
}
async getPools(tokenPairs, providerConfig) {
return await super.getPoolsInternal(tokenPairs, providerConfig);
}
getPoolAddress(tokenA, tokenB, feeAmount) {
const { poolIdentifier, currency0, currency1 } = this.getPoolIdentifier([
tokenA,
tokenB,
feeAmount,
]);
return {
poolAddress: poolIdentifier,
token0: currency0,
token1: currency1,
};
}
getLiquidityFunctionName() {
return 'liquidity';
}
getSlot0FunctionName() {
return 'slot0';
}
async getPoolsData(poolAddresses, functionName, providerConfig) {
const { results, blockNumber } = await (0, async_retry_1.default)(async () => {
return this.multicall2Provider.callSameFunctionOnMultipleContracts({
addresses: poolAddresses,
contractInterface: IUniswapV3PoolState__factory_1.IUniswapV3PoolState__factory.createInterface(),
functionName: functionName,
providerConfig,
});
}, this.retryOptions);
log_1.log.debug(`Pool data fetched as of block ${blockNumber}`);
return results;
}
getPoolIdentifier(pool) {
const [tokenA, tokenB, feeAmount] = pool;
const [token0, token1] = tokenA.sortsBefore(tokenB)
? [tokenA, tokenB]
: [tokenB, tokenA];
const cacheKey = `${this.chainId}/${token0.address}/${token1.address}/${feeAmount}`;
const cachedAddress = this.POOL_ADDRESS_CACHE[cacheKey];
if (cachedAddress) {
return {
poolIdentifier: cachedAddress,
currency0: token0,
currency1: token1,
};
}
const poolAddress = (0, compute_pool_address_1.computePoolAddress)({
factoryAddress: addresses_1.V3_CORE_FACTORY_ADDRESSES[this.chainId],
tokenA: token0,
tokenB: token1,
fee: feeAmount,
initCodeHashManualOverride: undefined,
chainId: this.chainId,
});
this.POOL_ADDRESS_CACHE[cacheKey] = poolAddress;
return {
poolIdentifier: poolAddress,
currency0: token0,
currency1: token1,
};
}
instantiatePool(pool, slot0, liquidity) {
const [token0, token1, feeAmount] = pool;
return new v3_sdk_1.Pool(token0, token1, feeAmount, slot0.sqrtPriceX96.toString(), liquidity.toString(), slot0.tick);
}
instantiatePoolAccessor(poolIdentifierToPool) {
return {
getPool: (tokenA, tokenB, feeAmount) => {
const { poolAddress } = this.getPoolAddress(tokenA, tokenB, feeAmount);
return poolIdentifierToPool[poolAddress];
},
getPoolByAddress: (address) => poolIdentifierToPool[address],
getAllPools: () => Object.values(poolIdentifierToPool),
};
}
}
exports.V3PoolProvider = V3PoolProvider;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9vbC1wcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wcm92aWRlcnMvdjMvcG9vbC1wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFHQSw0Q0FBa0Q7QUFDbEQsaUVBQTREO0FBQzVELDhEQUE2RDtBQUU3RCx3R0FBcUc7QUFDckcsb0RBQWlFO0FBQ2pFLHdDQUFxQztBQUVyQyxvREFBb0U7QUF5RHBFLE1BQWEsY0FDWCxTQUFRLDRCQU1QO0lBTUQ7Ozs7O09BS0c7SUFDSCxZQUNFLE9BQWdCLEVBQ2hCLGtCQUFzQyxFQUN0QyxlQUFtQztRQUNqQyxPQUFPLEVBQUUsQ0FBQztRQUNWLFVBQVUsRUFBRSxFQUFFO1FBQ2QsVUFBVSxFQUFFLEdBQUc7S0FDaEI7UUFFRCxLQUFLLENBQUMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFlBQVksQ0FBQyxDQUFDO1FBbkJuRCx5RUFBeUU7UUFDekUsa0RBQWtEO1FBQzFDLHVCQUFrQixHQUE4QixFQUFFLENBQUM7SUFrQjNELENBQUM7SUFFTSxLQUFLLENBQUMsUUFBUSxDQUNuQixVQUE2QixFQUM3QixjQUErQjtRQUUvQixPQUFPLE1BQU0sS0FBSyxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRU0sY0FBYyxDQUNuQixNQUFhLEVBQ2IsTUFBYSxFQUNiLFNBQW9CO1FBRXBCLE1BQU0sRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztZQUN0RSxNQUFNO1lBQ04sTUFBTTtZQUNOLFNBQVM7U0FDVixDQUFDLENBQUM7UUFDSCxPQUFPO1lBQ0wsV0FBVyxFQUFFLGNBQWM7WUFDM0IsTUFBTSxFQUFFLFNBQVM7WUFDakIsTUFBTSxFQUFFLFNBQVM7U0FDbEIsQ0FBQztJQUNKLENBQUM7SUFFa0Isd0JBQXdCO1FBQ3pDLE9BQU8s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