liquidity.mjs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import base, { ChainId } from "iziswap-sdk/lib/base/index.js";
  2. import Web3 from "web3";
  3. import { BigNumber } from "bignumber.js";
  4. import quoter from "iziswap-sdk/lib/quoter/index.js";
  5. import swap from "iziswap-sdk/lib/swap/index.js";
  6. import token from "iziswap-sdk/lib/base/token/index.js";
  7. import liquidityManager from "iziswap-sdk/lib/liquidityManager/index.js";
  8. import pool from "iziswap-sdk/lib/pool/index.js";
  9. import { Wallet, Provider } from "zksync-web3";
  10. const chainId = base.ChainId.ZkSyncAlphaTest;
  11. const rpc = "https://zksync2-testnet.zksync.dev/";
  12. const walletAddress = "0x93626e5d46772652a8100a3ffc34d7bad8b29e00";
  13. const privateKey = "0xd768b0b3f8dedcb465ad680268453391f7da6ec4e1942a13fdfcdea8773aab3e";
  14. const quoterAddress = "0xE93D1d35a63f7C6b51ef46a27434375761a7Db28";
  15. const swapAddress = "0x3040EE148D09e5B92956a64CDC78b49f48C0cDdc";
  16. const toTokenAddress = "0xA5900cce51c45Ab9730039943B3863C822342034";
  17. const liquidityManagerAddress = "0x25727b360604E1e6B440c3B25aF368F54fc580B6";
  18. const tokenAAddress = "0x00";
  19. const tokenBAddress = "0xA5900cce51c45Ab9730039943B3863C822342034";
  20. const provider = new Provider(rpc);
  21. const wallet = new Wallet(privateKey).connect(provider);
  22. const chain = base.initialChainTable[chainId];
  23. console.log("rpc: ", rpc);
  24. const web3 = new Web3(new Web3.providers.HttpProvider(rpc));
  25. const account = web3.eth.accounts.privateKeyToAccount(privateKey);
  26. console.log("address: ", account.address);
  27. const liquidityManagerContract = liquidityManager.getLiquidityManagerContract(liquidityManagerAddress, web3);
  28. console.log("liquidity manager address: ", liquidityManagerAddress);
  29. const tokenA = base.getGasToken(chainId);
  30. console.log("tokenA: ", tokenA);
  31. const tokenB = await token.fetchToken(tokenBAddress, chain, web3);
  32. console.log("tokenB: ", tokenB);
  33. const fee = 2000; // 2000 means 0.2%
  34. const poolAddress = await liquidityManager.getPoolAddress(liquidityManagerContract, tokenA, tokenB, fee);
  35. console.log("pool address: ", poolAddress);
  36. const poolContract = pool.getPoolContract(poolAddress, web3);
  37. const state = await pool.getPoolState(poolContract);
  38. console.log("pool state: ", state);
  39. const currentPrice = base.point2PriceDecimal(tokenA, tokenB, state.currentPoint);
  40. console.log("current price: ", currentPrice);
  41. const point1 = base.priceDecimal2Point(
  42. tokenA,
  43. tokenB,
  44. currentPrice * 0.98,
  45. base.PriceRoundingType.PRICE_ROUNDING_NEAREST
  46. );
  47. const point2 = base.priceDecimal2Point(
  48. tokenA,
  49. tokenB,
  50. currentPrice * 1.02,
  51. base.PriceRoundingType.PRICE_ROUNDING_NEAREST
  52. );
  53. console.log("point range", point1, point2);
  54. let leftPoint = Math.min(point1, point2);
  55. let rightPoint = Math.max(point1, point2);
  56. const pointDelta = await pool.getPointDelta(poolContract);
  57. console.log("point delta: ", pointDelta);
  58. leftPoint = base.pointDeltaRoundingDown(leftPoint, pointDelta);
  59. rightPoint = base.pointDeltaRoundingUp(rightPoint, pointDelta);
  60. const maxTestA = new BigNumber(0.0005).times(10 ** tokenA.decimal);
  61. const maxTestB = liquidityManager.calciZiLiquidityAmountDesired(
  62. leftPoint,
  63. rightPoint,
  64. state.currentPoint,
  65. maxTestA,
  66. true,
  67. tokenA,
  68. tokenB
  69. );
  70. const mintParams = {
  71. tokenA: tokenA,
  72. tokenB: tokenB,
  73. fee,
  74. leftPoint,
  75. rightPoint,
  76. maxAmountA: maxTestA.toFixed(0),
  77. maxAmountB: maxTestB.toFixed(0),
  78. minAmountA: maxTestA.times(0.985).toFixed(0),
  79. minAmountB: maxTestB.times(0.985).toFixed(0),
  80. };
  81. console.log(JSON.stringify(mintParams, null, 4));
  82. console.log(base.amount2Decimal(new BigNumber(maxTestB), tokenB));
  83. const gasPrice = "5000000000";
  84. const { mintCalling, options } = liquidityManager.getMintCall(
  85. liquidityManagerContract,
  86. account.address,
  87. chain,
  88. mintParams
  89. );
  90. let calling = mintCalling;
  91. if (calling instanceof Array) {
  92. calling = liquidityManagerContract.methods.multicall(mintCalling);
  93. }
  94. console.log({ ...options, from: account.address });
  95. const gasLimit = await calling.estimateGas({ from: account.address });
  96. console.log("gas limit: ", gasLimit);
  97. // sign transaction
  98. const tx = await wallet.sendTransaction({
  99. from: options.from,
  100. value: Web3.utils.numberToHex(options.value),
  101. to: liquidityManagerAddress,
  102. data: calling.encodeABI(),
  103. gasLimit,
  104. });
  105. console.log("tx: ", tx);