포지션 생성하기 (유동성 추가)

판게아의 풀에 포지션을 새로 생성하거나 이미 존재하는 포지션에 유동성을 추가로 예치하는 예제입니다.

import {ethers} from "ethers";
import {BigNumber} from "@ethersproject/bignumber";
import {
  ConcentratedLiquidityPool__factory,
  ConcentratedLiquidityPoolManager__factory,
  ERC20__factory
} from "./types";

/// concentrated Liquidity Pool Manager의 주소 (네트워크 별로 맞추어 지정)
const poolManagerAddress = "0xEd52BD01b0608a6B6d4f4E03aFfCe16c1FF19c23";

/// web3 Provider (metamask provider / jsonRPC provider 등)
const provider = ethers.getDefaultProvider();

// 신규 포지션 생성하기
async function createPosition(
    poolAddress:string,
    lowerTick:number,  // 가격 구간의 하방 선
    upperTick:number,  // 가격 구간의 상방 선
    amount0Desired:BigNumber, // 넣고자 하는 token0 양 (일부 덜 예치될 수 있습니다.)
    amount1Desired:BigNumber  // 넣고자 하는 token1 양 (일부 덜 예치될 수 있습니다.)
) {
  const pool = await ConcentratedLiquidityPool__factory.connect(poolAddress, provider);
  const token0 = await ERC20__factory.connect(await pool.token0(), provider);
  const token1 = await ERC20__factory.connect(await pool.token1(), provider);

  const poolManager = await ConcentratedLiquidityPoolManager__factory.connect(poolManagerAddress, provider);
  // first, approve
  await (await token0.approve(poolManager.address,amount0Desired)).wait();
  await (await token1.approve(poolManager.address, amount1Desired)).wait();

  // second, mint postion
  const tx = await poolManager.mint(
      poolAddress,
      0, // lowerOld를 지정하지 않는 경우, 자동으로 탐색 후 넣습니다.
      lowerTick,
      0, // upperOld를 지정하지 않는 경우, 자동으로 탐색 후 넣습니다.
      upperTick,
      amount0Desired,
      amount1Desired,
      0,
      0 // positionId = 0 이면, 새로 생성, 아니면 해당 positionId에 추가하기
  );
  await tx.wait();
}

Last updated