UNPKG

rubic-sdk

Version:
136 lines • 6.64 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.UnichainUniswapV3QuoterController = void 0; const bignumber_js_1 = __importDefault(require("bignumber.js")); const errors_1 = require("../../../../../../../../../common/errors"); const blockchain_1 = require("../../../../../../../../../common/utils/blockchain"); const decorators_1 = require("../../../../../../../../../common/utils/decorators"); const object_1 = require("../../../../../../../../../common/utils/object"); const contract_addresses_1 = require("../../../../unichain/uni-v3/constants/contract-addresses"); const quoter_v2_abi_1 = require("../../../../unichain/uni-v3/constants/quoter-v2-abi"); const uniswap_v3_quoter_controller_1 = require("./uniswap-v3-quoter-controller"); class UnichainUniswapV3QuoterController extends uniswap_v3_quoter_controller_1.UniswapV3QuoterController { constructor(blockchain, routerConfiguration) { super(blockchain, routerConfiguration, contract_addresses_1.UNICHAIN_UNISWAP_V3_QUOTER_V2_CONTRACT_ADDRESS, quoter_v2_abi_1.UNICHAIN_UNISWAP_V3_QUOTER_V2_CONTRACT_ABI, contract_addresses_1.UNICHAIN_UNISWAP_V3_FACTORY_CONTRACT_ADDRESS); this.feeAmounts = [500, 3000]; } /** * Returns swap method's name and arguments to pass it to Quoter contract. * @param poolsPath Pools, included in the route. * @param from From token. * @param to To token. * @param exact Is exact input or output trade. * @param weiAmount Amount of tokens to trade. */ static getQuoterMethodData(poolsPath, from, to, exact, weiAmount) { if (exact === 'output') { throw new errors_1.RubicSdkError('Exact "output" is not supported in UnichainUniswapV3QuoterController!'); } if (poolsPath.length === 1 && poolsPath?.[0]) { const sqrtPriceLimitX96 = 0; return { poolsPath, methodData: { methodName: 'quoteExactInputSingle', methodArguments: [ from.address, to.address, weiAmount, poolsPath[0].fee, sqrtPriceLimitX96 ] } }; } return { poolsPath, methodData: { methodName: 'quoteExactInput', methodArguments: [ uniswap_v3_quoter_controller_1.UniswapV3QuoterController.getEncodedPoolsPath(poolsPath, from.address), weiAmount ] } }; } async getAllRoutes(from, to, exact, weiAmount, routeMaxTransitTokens) { const routesLiquidityPools = await this.getAllLiquidityPools(from, to); const options = { routesLiquidityPools, from, to, exact, weiAmount }; const quoterMethodsData = [...Array(routeMaxTransitTokens + 1)] .map((_, maxTransitTokens) => this.getQuoterMethodsData({ ...options, maxTransitTokens }, [], from.address)) .flat(); const results = await this.web3Public.multicallContractMethods(this.quoterContractAddress, this.quoterContractABI, quoterMethodsData.map(quoterMethodData => { if (quoterMethodData.methodData.methodName.toLowerCase().includes('single')) { return { methodName: quoterMethodData.methodData.methodName, methodArguments: [quoterMethodData.methodData.methodArguments] }; } return quoterMethodData.methodData; })); return results .map((result, index) => { const pool = quoterMethodsData?.[index]; if (!pool) { throw new errors_1.RubicSdkError('Pool has to be defined'); } if (result.success) { return { outputAbsoluteAmount: new bignumber_js_1.default(result.output), poolsPath: pool.poolsPath, initialTokenAddress: from.address }; } return null; }) .filter(object_1.notNull); } /** * Returns swap methods' names and arguments, built with passed pools' addresses, to use it in Quoter contract. */ getQuoterMethodsData(options, path, lastTokenAddress) { const { routesLiquidityPools, from, to, exact, weiAmount, maxTransitTokens } = options; if (path.length === maxTransitTokens) { const pools = routesLiquidityPools.filter(pool => pool.isPoolWithTokens(lastTokenAddress, to.address)); return pools.map(pool => UnichainUniswapV3QuoterController.getQuoterMethodData(path.concat(pool), from, to, exact, weiAmount)); } return routesLiquidityPools .filter(pool => !path.includes(pool)) .map(pool => { const methodsData = []; if ((0, blockchain_1.compareAddresses)(pool.token0.address, lastTokenAddress)) { const extendedPath = path.concat(pool); methodsData.push(...this.getQuoterMethodsData(options, extendedPath, pool.token1.address)); } if ((0, blockchain_1.compareAddresses)(pool.token1.address, lastTokenAddress)) { const extendedPath = path.concat(pool); methodsData.push(...this.getQuoterMethodsData(options, extendedPath, pool.token0.address)); } return methodsData; }) .flat(); } } exports.UnichainUniswapV3QuoterController = UnichainUniswapV3QuoterController; __decorate([ decorators_1.Cache ], UnichainUniswapV3QuoterController, "getQuoterMethodData", null); //# sourceMappingURL=uniswap-v3-unichain-quoter-controller.js.map