import { BaseChain, ChainId, initialChainTable } from "iziswap-sdk/lib/base/index.js"; import Web3 from "web3"; import { getLiquidities, getLimitOrders, getPointDelta, getPoolContract, getPoolState, } from "iziswap-sdk/lib/pool/index.js"; import { getPoolAddress, getLiquidityManagerContract } from "iziswap-sdk/lib/liquidityManager/index.js"; import { Orders } from "iziswap-sdk/lib/swapQuery/library/Orders.js"; import { LogPowMath } from "iziswap-sdk/lib/swapQuery/library/LogPowMath.js"; import { iZiSwapPool } from "iziswap-sdk/lib/swapQuery/iZiSwapPool.js"; import { decimal2Amount, fetchToken } from "iziswap-sdk/lib/base/token/token.js"; import { SwapQuery } from "iziswap-sdk/lib/swapQuery/library/State.js"; import { SwapX2YModule } from "iziswap-sdk/lib/swapQuery/swapX2YModule.js"; import JSBI from "jsbi"; import { getQuoterContract, quoterSwapSingleWithExactInput } from "iziswap-sdk/lib/quoter/funcs.js"; import { QuoterSwapSingleWithExactInputParams } from "iziswap-sdk/lib/quoter/index.js"; async function main() { const chain = initialChainTable[ChainId.ZkSyncAlphaTest]; // test net const rpc = "https://zksync2-testnet.zksync.dev/"; console.log("rpc: ", rpc); const web3 = new Web3(new Web3.providers.HttpProvider(rpc)); const liquidityManagerAddress = "0x25727b360604E1e6B440c3B25aF368F54fc580B6"; const liquidityManagerContract = getLiquidityManagerContract(liquidityManagerAddress, web3); console.log("liquidity manager address: ", liquidityManagerAddress); const iZiAddress = "0xA5900cce51c45Ab9730039943B3863C822342034".toLowerCase(); const iZi = await fetchToken(iZiAddress, chain, web3); const BNB = await fetchToken(BNBAddress, chain, web3); const fee = 2000; // 2000 means 0.2% const poolAddress = await getPoolAddress(liquidityManagerContract, iZi, chain.token, fee); const tokenXAddress = iZiAddress < BNBAddress ? iZiAddress : BNBAddress; const tokenYAddress = iZiAddress < BNBAddress ? BNBAddress : iZiAddress; const poolContract = getPoolContract(poolAddress, web3); const state = await getPoolState(poolContract); console.log("state: ", state); const pointDelta = await getPointDelta(poolContract); console.log("pointDelta: ", pointDelta); const leftPoint = state.currentPoint - 5000; const rightPoint = state.currentPoint + 5000; const batchsize = 2000; const liquidityData = await getLiquidities( poolContract, leftPoint, rightPoint, state.currentPoint, pointDelta, state.liquidity, batchsize ); console.log( "liquidityData.liquidities: ", liquidityData.liquidities.map((e) => e.toString()) ); console.log("liquidityData.point: ", liquidityData.point); const limitOrderData = await getLimitOrders(poolContract, leftPoint, rightPoint, pointDelta, batchsize); console.log( "limitOrderData.sellingX: ", limitOrderData.sellingX.map((e) => e.toString()) ); console.log("limitOrderData.sellingXPoint: ", limitOrderData.sellingXPoint); console.log( "limitOrderData.sellingY: ", limitOrderData.sellingY.map((e) => e.toString()) ); console.log("limitOrderData.sellingYPoint: ", limitOrderData.sellingYPoint); const orders = { liquidity: liquidityData.liquidities, liquidityDeltaPoint: liquidityData.point, sellingX: limitOrderData.sellingX, sellingXPoint: limitOrderData.sellingXPoint, sellingY: limitOrderData.sellingY, sellingYPoint: limitOrderData.sellingYPoint, }; const sqrtRate_96 = LogPowMath.getSqrtPrice(1); const swapQueryState = { currentPoint: state.currentPoint, liquidity: JSBI.BigInt(state.liquidity), sqrtPrice_96: LogPowMath.getSqrtPrice(state.currentPoint), liquidityX: JSBI.BigInt(state.liquidityX), }; const pool = new iZiSwapPool(swapQueryState, orders, sqrtRate_96, pointDelta, fee); const lowPt = state.currentPoint - 1500; const inputAmountStr = decimal2Amount(5, iZi).toFixed(0); const { amountX, amountY } = SwapX2YModule.swapX2Y(pool, JSBI.BigInt(inputAmountStr), lowPt); console.log("cost: ", amountX.toString()); console.log("acquire: ", amountY.toString()); // compare with quoter const quoterAddress = "0x4bCACcF9A0FC3246449AC8A42A8918F2349Ed543"; const quoterContract = getQuoterContract(quoterAddress, web3); const params = { inputToken: iZi, outputToken: BNB, fee: fee, inputAmount: inputAmountStr, boundaryPt: lowPt, }; const { outputAmount, finalPoint } = await quoterSwapSingleWithExactInput(quoterContract, params); console.log("outputAmount: ", outputAmount); console.log("finalPoint: ", finalPoint); } main() .then(() => process.exit(0)) .catch((error) => { console.error(error); process.exit(1); });