import {ethers, web3} from "hardhat"; import fee from "../config/fee"; import contracts from "../config/contracts"; import logger from "../utils/logger"; describe('Calc test', () => { let inAmount = 1e15.toString() it('Univ3 calc test', async () => { const CALC_ABI = require('../artifacts/contracts/Calc.sol/Calc.json').abi let calc = new web3.eth.Contract(CALC_ABI, contracts.CALC) await calc.methods.getQuoteHandleFee(contracts.WETH, inAmount, contracts.USDT, fee._30_per_10000).call().then(console.log) }) it('Two points', () => { let value = 333333 let low: number = 0 let high: number = 1000000 let prevLow: number = low let prevHigh: number = high let checkNumber = low function check(checkNumber: number) { function final_check(checkNumber: number) { return checkNumber <= value } // [,,,,,c(,,,,,,,)] let too_low = false for (let i = 1; i <= 10; i++) { too_low = too_low || (final_check(checkNumber + i)) } if (too_low) return 'too_low' // [,,,,,(c,,,,,,,)] let too_high = true for (let i = 0; i < 10; i++) { too_high = too_high && (!final_check(checkNumber + i)) } if (too_high) return 'too_high' return 'ok' } let count = 0 while (true) { let checkRst = check(checkNumber) logger.debug(`[${low}, ${high}], c: ${checkNumber}, v: ${value}, ${checkRst}. [${++count}]`) if (checkRst == 'ok') { break } else { let tempHigh = high let tempLow = low if (checkNumber == low) { if (checkRst == 'too_high') { high = tempLow low = prevLow prevHigh = tempHigh prevLow = tempLow checkNumber = high } else if (checkRst == 'too_low') { low = low + Math.floor((high - low) / 2) prevLow = tempLow checkNumber = low } } else if (checkNumber == high) { if (checkRst == 'too_high') { high = low + Math.floor((high - low) / 2) prevHigh = tempHigh checkNumber = high } else if (checkRst == 'too_low') { low = tempHigh high = prevHigh prevHigh = tempHigh prevLow = tempLow checkNumber = low } } } } logger.debug(`Found value, is: ${checkNumber}`) }) })