import base, { ChainId } from "iziswap-sdk/lib/base/index.js"; import Web3 from "web3"; import { BigNumber } from "bignumber.js"; import quoter from "iziswap-sdk/lib/quoter/index.js"; import swap from "iziswap-sdk/lib/swap/index.js"; import token from "iziswap-sdk/lib/base/token/index.js"; import liquidityManager from "iziswap-sdk/lib/liquidityManager/index.js"; import pool from "iziswap-sdk/lib/pool/index.js"; import { Wallet, Provider } from "zksync-web3"; const chainId = base.ChainId.ZkSyncAlphaTest; const rpc = "https://zksync2-testnet.zksync.dev/"; const walletAddress = "0x93626e5d46772652a8100a3ffc34d7bad8b29e00"; const privateKey = "0xd768b0b3f8dedcb465ad680268453391f7da6ec4e1942a13fdfcdea8773aab3e"; const quoterAddress = "0xE93D1d35a63f7C6b51ef46a27434375761a7Db28"; const swapAddress = "0x3040EE148D09e5B92956a64CDC78b49f48C0cDdc"; const toTokenAddress = "0xA5900cce51c45Ab9730039943B3863C822342034"; const liquidityManagerAddress = "0x25727b360604E1e6B440c3B25aF368F54fc580B6"; const tokenAAddress = "0x00"; const tokenBAddress = "0xA5900cce51c45Ab9730039943B3863C822342034"; const provider = new Provider(rpc); const wallet = new Wallet(privateKey).connect(provider); const chain = base.initialChainTable[chainId]; console.log("rpc: ", rpc); const web3 = new Web3(new Web3.providers.HttpProvider(rpc)); const account = web3.eth.accounts.privateKeyToAccount(privateKey); console.log("address: ", account.address); const liquidityManagerContract = liquidityManager.getLiquidityManagerContract(liquidityManagerAddress, web3); console.log("liquidity manager address: ", liquidityManagerAddress); const tokenA = base.getGasToken(chainId); console.log("tokenA: ", tokenA); const tokenB = await token.fetchToken(tokenBAddress, chain, web3); console.log("tokenB: ", tokenB); const fee = 2000; // 2000 means 0.2% const poolAddress = await liquidityManager.getPoolAddress(liquidityManagerContract, tokenA, tokenB, fee); console.log("pool address: ", poolAddress); const poolContract = pool.getPoolContract(poolAddress, web3); const state = await pool.getPoolState(poolContract); console.log("pool state: ", state); const currentPrice = base.point2PriceDecimal(tokenA, tokenB, state.currentPoint); console.log("current price: ", currentPrice); const point1 = base.priceDecimal2Point( tokenA, tokenB, currentPrice * 0.98, base.PriceRoundingType.PRICE_ROUNDING_NEAREST ); const point2 = base.priceDecimal2Point( tokenA, tokenB, currentPrice * 1.02, base.PriceRoundingType.PRICE_ROUNDING_NEAREST ); console.log("point range", point1, point2); let leftPoint = Math.min(point1, point2); let rightPoint = Math.max(point1, point2); const pointDelta = await pool.getPointDelta(poolContract); console.log("point delta: ", pointDelta); leftPoint = base.pointDeltaRoundingDown(leftPoint, pointDelta); rightPoint = base.pointDeltaRoundingUp(rightPoint, pointDelta); const maxTestA = new BigNumber(0.0005).times(10 ** tokenA.decimal); const maxTestB = liquidityManager.calciZiLiquidityAmountDesired( leftPoint, rightPoint, state.currentPoint, maxTestA, true, tokenA, tokenB ); const mintParams = { tokenA: tokenA, tokenB: tokenB, fee, leftPoint, rightPoint, maxAmountA: maxTestA.toFixed(0), maxAmountB: maxTestB.toFixed(0), minAmountA: maxTestA.times(0.985).toFixed(0), minAmountB: maxTestB.times(0.985).toFixed(0), }; console.log(JSON.stringify(mintParams, null, 4)); console.log(base.amount2Decimal(new BigNumber(maxTestB), tokenB)); const gasPrice = "5000000000"; const { mintCalling, options } = liquidityManager.getMintCall( liquidityManagerContract, account.address, chain, mintParams ); let calling = mintCalling; if (calling instanceof Array) { calling = liquidityManagerContract.methods.multicall(mintCalling); } console.log({ ...options, from: account.address }); const gasLimit = await calling.estimateGas({ from: account.address }); console.log("gas limit: ", gasLimit); // sign transaction const tx = await wallet.sendTransaction({ from: options.from, value: Web3.utils.numberToHex(options.value), to: liquidityManagerAddress, data: calling.encodeABI(), gasLimit, }); console.log("tx: ", tx);