preSwapX2YWithOnlineData.mjs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. import { BaseChain, ChainId, initialChainTable } from "iziswap-sdk/lib/base/index.js";
  2. import Web3 from "web3";
  3. import {
  4. getLiquidities,
  5. getLimitOrders,
  6. getPointDelta,
  7. getPoolContract,
  8. getPoolState,
  9. } from "iziswap-sdk/lib/pool/index.js";
  10. import { getPoolAddress, getLiquidityManagerContract } from "iziswap-sdk/lib/liquidityManager/index.js";
  11. import { Orders } from "iziswap-sdk/lib/swapQuery/library/Orders.js";
  12. import { LogPowMath } from "iziswap-sdk/lib/swapQuery/library/LogPowMath.js";
  13. import { iZiSwapPool } from "iziswap-sdk/lib/swapQuery/iZiSwapPool.js";
  14. import { decimal2Amount, fetchToken } from "iziswap-sdk/lib/base/token/token.js";
  15. import { SwapQuery } from "iziswap-sdk/lib/swapQuery/library/State.js";
  16. import { SwapX2YModule } from "iziswap-sdk/lib/swapQuery/swapX2YModule.js";
  17. import JSBI from "jsbi";
  18. import { getQuoterContract, quoterSwapSingleWithExactInput } from "iziswap-sdk/lib/quoter/funcs.js";
  19. import { QuoterSwapSingleWithExactInputParams } from "iziswap-sdk/lib/quoter/index.js";
  20. async function main() {
  21. const chain = initialChainTable[ChainId.ZkSyncAlphaTest];
  22. // test net
  23. const rpc = "https://zksync2-testnet.zksync.dev/";
  24. console.log("rpc: ", rpc);
  25. const web3 = new Web3(new Web3.providers.HttpProvider(rpc));
  26. const liquidityManagerAddress = "0x25727b360604E1e6B440c3B25aF368F54fc580B6";
  27. const liquidityManagerContract = getLiquidityManagerContract(liquidityManagerAddress, web3);
  28. console.log("liquidity manager address: ", liquidityManagerAddress);
  29. const iZiAddress = "0xA5900cce51c45Ab9730039943B3863C822342034".toLowerCase();
  30. const iZi = await fetchToken(iZiAddress, chain, web3);
  31. const BNB = await fetchToken(BNBAddress, chain, web3);
  32. const fee = 2000; // 2000 means 0.2%
  33. const poolAddress = await getPoolAddress(liquidityManagerContract, iZi, chain.token, fee);
  34. const tokenXAddress = iZiAddress < BNBAddress ? iZiAddress : BNBAddress;
  35. const tokenYAddress = iZiAddress < BNBAddress ? BNBAddress : iZiAddress;
  36. const poolContract = getPoolContract(poolAddress, web3);
  37. const state = await getPoolState(poolContract);
  38. console.log("state: ", state);
  39. const pointDelta = await getPointDelta(poolContract);
  40. console.log("pointDelta: ", pointDelta);
  41. const leftPoint = state.currentPoint - 5000;
  42. const rightPoint = state.currentPoint + 5000;
  43. const batchsize = 2000;
  44. const liquidityData = await getLiquidities(
  45. poolContract,
  46. leftPoint,
  47. rightPoint,
  48. state.currentPoint,
  49. pointDelta,
  50. state.liquidity,
  51. batchsize
  52. );
  53. console.log(
  54. "liquidityData.liquidities: ",
  55. liquidityData.liquidities.map((e) => e.toString())
  56. );
  57. console.log("liquidityData.point: ", liquidityData.point);
  58. const limitOrderData = await getLimitOrders(poolContract, leftPoint, rightPoint, pointDelta, batchsize);
  59. console.log(
  60. "limitOrderData.sellingX: ",
  61. limitOrderData.sellingX.map((e) => e.toString())
  62. );
  63. console.log("limitOrderData.sellingXPoint: ", limitOrderData.sellingXPoint);
  64. console.log(
  65. "limitOrderData.sellingY: ",
  66. limitOrderData.sellingY.map((e) => e.toString())
  67. );
  68. console.log("limitOrderData.sellingYPoint: ", limitOrderData.sellingYPoint);
  69. const orders = {
  70. liquidity: liquidityData.liquidities,
  71. liquidityDeltaPoint: liquidityData.point,
  72. sellingX: limitOrderData.sellingX,
  73. sellingXPoint: limitOrderData.sellingXPoint,
  74. sellingY: limitOrderData.sellingY,
  75. sellingYPoint: limitOrderData.sellingYPoint,
  76. };
  77. const sqrtRate_96 = LogPowMath.getSqrtPrice(1);
  78. const swapQueryState = {
  79. currentPoint: state.currentPoint,
  80. liquidity: JSBI.BigInt(state.liquidity),
  81. sqrtPrice_96: LogPowMath.getSqrtPrice(state.currentPoint),
  82. liquidityX: JSBI.BigInt(state.liquidityX),
  83. };
  84. const pool = new iZiSwapPool(swapQueryState, orders, sqrtRate_96, pointDelta, fee);
  85. const lowPt = state.currentPoint - 1500;
  86. const inputAmountStr = decimal2Amount(5, iZi).toFixed(0);
  87. const { amountX, amountY } = SwapX2YModule.swapX2Y(pool, JSBI.BigInt(inputAmountStr), lowPt);
  88. console.log("cost: ", amountX.toString());
  89. console.log("acquire: ", amountY.toString());
  90. // compare with quoter
  91. const quoterAddress = "0x4bCACcF9A0FC3246449AC8A42A8918F2349Ed543";
  92. const quoterContract = getQuoterContract(quoterAddress, web3);
  93. const params = {
  94. inputToken: iZi,
  95. outputToken: BNB,
  96. fee: fee,
  97. inputAmount: inputAmountStr,
  98. boundaryPt: lowPt,
  99. };
  100. const { outputAmount, finalPoint } = await quoterSwapSingleWithExactInput(quoterContract, params);
  101. console.log("outputAmount: ", outputAmount);
  102. console.log("finalPoint: ", finalPoint);
  103. }
  104. main()
  105. .then(() => process.exit(0))
  106. .catch((error) => {
  107. console.error(error);
  108. process.exit(1);
  109. });