Skip to content

V2 통합 ​

V2는 새 배포 주소와 TokenCreatedV2 이벤트를 사용합니다. @lucrari/shared의 생성된 factoryV2Abi, lockerV2Abi, launchTokenV2Abi를 사용하세요. 토큰별 creatorFeeBps·poolFee·모드·발행량·커브 경계·락커를 기록하고 소각 Transfer에 따라 공급량을 줄입니다.

V2의 claimFees는 (소각 토큰, 수집 WETH)를 반환하며 token0/token1 지급이 아닙니다. 보유자는 토큰의 claimRewards를, 재매입 대기는 락커의 pendingBuyback/processBuyback을 사용합니다. V1과 V2의 포지션 ID를 혼용하면 안 됩니다.

아래 참고 자료는 기존 V1 배포에 대한 내용입니다.


연동 ​

최소한의, 검증 가능한 연동 표면입니다. 모든 것은 컨트랙트에서 직접 읽습니다. 팩토리의 TokenCreated 이벤트를 인덱싱하고, 방출된 각 풀을 등록하고, 그 Swap 이벤트를 인덱싱하면 됩니다. 온체인 이벤트가 권위 있는 단일 기준입니다 — lucrari 인터페이스와 인덱서도 정확히 이것만 합니다.

네트워크 ​

네트워크GIWA Sepolia (테스트넷)
체인 ID91342
네이티브 자산ETH
공개 RPChttps://sepolia-rpc.giwa.io
익스플로러https://sepolia-explorer.giwa.io
풀 수수료10000 (1%)
런치 수수료0.001 ETH
발행량1,000,000,000 (1e9)

GIWA 메인넷(체인 ID 9134)은 등록되어 있지만 아직 라이브가 아닙니다. 공개 RPC는 넓은 범위의 eth_getLogs를 레이트 리밋하므로, 각 컨트랙트의 시작 블록부터 블록을 잘게 나누어 백필하세요.

컨트랙트 ​

GIWA Sepolia에 배포됨. 현재 활성 팩토리와 락커가 현재 런치를 처리합니다. 대체된(superseded) 주소는 현재 버전 이전에 배포된 토큰을 위해 남아 있으며 참고용으로만 저장소에 기재되어 있습니다 — 다시 연결하지 마세요.

컨트랙트주소시작 블록
LaunchpadFactory0x215E46690169764b89fa090C32a1Df333B2278C833812568
LpLocker0x01ABf2BC3FAA9AF0d9A96964EE99C943d7EE0c2733811334
V3 팩토리0xe6B2FCB942567016f5F6021c1aEF91A98C38C5bb—
포지션 매니저0xb0329f7097c464DF1E71248d1ecdB460c6eDAf82—
SwapRouter020xEA87adf193565eeef214b5Ab209F60506826a37C—
QuoterV20x1495bF5deaeb178Afc9a876A41160a5F6c640093—
WETH (쿼트)0x4200000000000000000000000000000000000006—
트레저리0x1648240579D1410dcDCD548809429B3c0898fff4—

온체인 이벤트 ​

TokenCreated는 팩토리에서 런치당 한 번 방출됩니다. 이벤트의 각 pool은 Uniswap V3 풀이며, 그 Swap 이벤트가 모든 가격, 거래량, 거래 내역을 만듭니다.

이벤트topic0
TokenCreated(address,address,address,address,uint256,bool,uint64,uint64,uint256,string,string,string,uint256)0x634412d53e8566833b6ee5677e3240da031370ef2a5812d91f4c6fb090c352a7
Swap(address,address,int256,int256,uint160,uint128,int24)0xc42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca67
ts
import { createPublicClient, http, parseAbiItem } from "viem";

const client = createPublicClient({
  chain: {
    id: 91342,
    name: "GIWA Sepolia",
    nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 },
    rpcUrls: { default: { http: ["https://sepolia-rpc.giwa.io"] } },
  },
  transport: http(),
});

const launches = await client.getLogs({
  address: "0x215E46690169764b89fa090C32a1Df333B2278C8",
  event: parseAbiItem(
    "event TokenCreated(address indexed token, address indexed creator, address feeRecipient, address pool, uint256 positionId, bool tokenIsToken0, uint64 launchTime, uint64 antiSnipeWindow, uint256 devBuyUsdc, string name, string symbol, string metadataURI, uint256 buyTaxBps)",
  ),
  fromBlock: 33812568n,
  toBlock: "latest",
});

거래 방향은 스왑 수량과 토큰 순서에서 유도하며, 토큰 순서는 런치 이벤트가 이미 알려줍니다.

ts
// amount0/amount1은 부호가 있습니다: 양수 = 풀이 해당 토큰을 받았다.
const pairSigned = tokenIsToken0 ? amount1 : amount0; // WETH 레그
const side = pairSigned > 0 ? "buy" : "sell"; // WETH 유입 = 누군가 런치 토큰을 매수했다

부호 규칙

WETH 레그가 양수이면 WETH가 풀으로 유입된 것이고, 이는 런치 토큰의 매수입니다. 음수이면 매도입니다. 주소를 직접 비교하지 말고 런치 이벤트의 tokenIsToken0으로 방향을 잡으세요.

런치 상태 읽기 ​

팩토리는 모든 런치를 tokenInfo에 기록하며, 여기에는 풀, 락업된 포지션 id, 가격 산정에 필요한 커브 방향이 포함됩니다.

ts
import { parseAbi } from "viem";

const factoryAbi = parseAbi([
  "function tokenInfo(address token) view returns (address token, address pool, uint256 positionId, address creator, address feeRecipient, bool tokenIsToken0, uint64 launchTime, uint64 antiSnipeWindow, uint256 buyTaxBps)",
  "function curveTickLower() view returns (int24)",
  "function curveTickUpper() view returns (int24)",
  "function creationFeeUsdc() view returns (uint256)",
  "function minBuyTaxBps() view returns (uint256)",
  "function maxBuyTaxBps() view returns (uint256)",
]);

const info = await client.readContract({
  address: factory,
  abi: factoryAbi,
  functionName: "tokenInfo",
  args: [token],
});
// info.tokenIsToken0  풀 방향 (가격 산정과 거래 방향에 필수)
// info.buyTaxBps      크리에이터가 선택한 세금, 100–300 (1–3%), 변경 불가
// info.feeRecipient   크리에이터의 수수료 스트림이 지급되는 곳

토큰 메타데이터(이미지, 설명, 소셜 링크)는 생성 시 TokenCreated의 metadataURI 인자에 JSON 문서로 전달되며, 이름과 심볼은 토큰 컨트랙트 자체에도 있습니다.

가격 산정과 졸업 ​

가격은 풀의 slot0에서 옵니다. 토큰과 WETH 모두 18 decimals이므로 스케일링이 필요 없습니다.

ts
import { parseAbiItem } from "viem";

const [sqrtPriceX96, tick] = await client.readContract({
  address: pool,
  abi: [
    parseAbiItem(
      "function slot0() view returns (uint160 sqrtPriceX96, int24 tick, uint16, uint16, uint16, uint8, bool)",
    ),
  ],
  functionName: "slot0",
});

const ratio = Number(sqrtPriceX96) / 2 ** 96;
const token1PerToken0 = ratio * ratio;
// 런치 토큰이 어느 쪽에 있든, 토큰당 WETH 가격:
const priceEth = info.tokenIsToken0 ? token1PerToken0 : 1 / token1PerToken0;

const priceUsd = priceEth * ethUsd; // 임의의 ETH 오라클
const fdvUsd = priceUsd * 1e9;      // 발행량 고정: FDV와 시가총액은 같은 가격을 공유
const marketCapUsd = priceUsd * circulatingSupply;

졸업 진행률은 풀 틱이 런치 커브를 얼마나 지나왔는지이며, tokenIsToken0으로 방향을 잡습니다.

ts
const [lower, upper] = [-203800, -177400]; // 팩토리의 curveTickLower/Upper
// 매수는 토큰이 token1이면 틱을 레인지 상단으로,
// token0이면 하단으로 밉니다 — 방향이 중요합니다.
const progress = info.tokenIsToken0
  ? (upper - tick) / (upper - lower)
  : (tick - lower) / (upper - lower);
const graduated = progress >= 1;

졸업 트랜잭션도, 마이그레이션 이벤트도 없습니다. 졸업은 레인지 오더가 전부 소진되었다는 의미일 뿐입니다.

수수료 클레임 ​

크리에이터 수수료 클레임은 락커를 통해 퍼미션리스로 정산됩니다.

ts
const lockerAbi = parseAbi([
  "function creatorOf(uint256 positionId) view returns (address)",
  "function creatorFeeBps() view returns (uint256)",
  "function claimFees(uint256 positionId) returns (uint256 amount0, uint256 amount1)",
  "function claimFeesBatch(uint256[] positionIds)",
]);

// 먼저 시뮬레이션하세요: 반환되는 수량은 이 클레임이 지급할 정확한 토큰/WETH 레그이며,
// 전송 시 수수료(fee-on-transfer) 효과를 차감한 뒤 creatorFeeBps/10000 비율로 크리에이터에게 분배된 값입니다.
const { result } = await client.simulateContract({
  address: locker,
  abi: lockerAbi,
  functionName: "claimFees",
  args: [info.positionId],
});

claimFees는 크리에이터의 수수료 지갑과 트레저리에 직접 지급합니다 — 호출자는 가스만 제공하므로, 키퍼가 자금을 돌릴 가능성 없이 클레임을 대행할 수 있습니다.

인덱서 API ​

레퍼런스 인덱서(Ponder, 소스는 저장소에 있음)는 인터페이스가 소비하는 REST 표면을 노출합니다. 직접 호스팅하거나, 자체 이벤트 파이프라인에 맞춰 쿼리를 미러링하세요.

엔드포인트반환
GET /trending?sort=volume|new|marketcap|txcount&graduated=&limit=가격/거래량 통계가 포함된 토큰 목록
GET /token/:address단일 토큰: 풀, 크리에이터, 수수료 수령인, 세금, 가격, 졸업
GET /token/:address/trades최근 스왑
GET /token/:address/candles?interval=300OHLC 캔들
GET /token/:address/holders상위 홀더, 풀 잔고, 발행량 비율
GET /token/:address/volume24h24시간 거래량과 거래 수
GET /user/:address지갑이 배포하고 보유한 토큰

lucrari는 어떠한 보증 없이 있는 그대로 제공됩니다. 투자 조언이 아닙니다.