rubic-sdk
Version:
Simplify dApp creation
136 lines • 6.64 kB
JavaScript
;
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