두 포지션 런칭

2026-09-12 개정 이후 본딩 커브는 없습니다. 전체 공급량이 생성 트랜잭션 자체에서부터 잠긴 Uniswap v4 유동성으로 들어갑니다. 2026-09-28부터 코드에 구현되어 있습니다: LiquidityLock.launchMarket이 마켓의 생성 트랜잭션 안에서 이 모든 것을 수행하며, 테스트는 Lens가 읽는 오프닝 가격을 토큰당 3,401,582,525 wei로 고정해 검증합니다.

커브가 사라진 이유

이전 커브는 가상 리저브 위의 상수곱이었습니다:

x = VIRTUAL_ETH   + netReserve     (3.75 ETH + 들어온 양)
y = TOKEN_RESERVE - tokensSold     (1.1 B − 나간 양)

이것이 바로 집중 유동성 포지션입니다: v3/v4의 가상 리저브가 곧 그 오프셋입니다. 이 대응은 근사가 아니라, 같은 방정식을 다르게 쓴 것입니다.

커브를 없애서 얻는 것: 마이그레이션이 없고(프로토콜에서 가장 위험한 순간), 떼어 갈 졸업 수수료가 없으며, 수수료 경로가 둘이 아닌 하나이고, 마켓이 첫 블록부터 애그리게이터로 라우팅될 수 있습니다.

두 밴드

graph LR A["FDV 3.409 ETH

틱 195000

오프닝"] -->|밴드 1 · 700M 토큰 · 7.535 ETH| B["FDV 34.091 ETH

틱 171960

10x"] B -->|밴드 2 · 300M 토큰 · 상한 없음| C["틱 −887220

가격 상한"]
밴드 1 밴드 2
토큰 700,000,000 300,000,000
틱 [171960, 195000] [−887220, 171960]
깊이 통과에 7.535 ETH 2×에서 14.5 ETH · 20×에서 45.7 ETH · 200×에서 144.6 ETH

tickSpacing은 60이며, LP 수수료는 없습니다.

이것은 기본 런칭 설정입니다. 2026-10-05부터 공급량, 밴드 1의 토큰 수(나머지는 밴드 2), 런칭 틱, 두 밴드의 하단 틱, 틱 간격, LP 수수료는 팩토리의 setLaunchConfig로 바꾸는 StockFun 오너의 단일 설정이며, 이후 생성되는 마켓에 적용됩니다. 이 설정은 어떤 풀도 담을 수 없는 형태를 거부합니다: 빈 밴드, 간격에 맞지 않거나 순서가 어긋난 틱, 범위를 벗어난 틱 간격이나 LP 수수료, 틱 하나가 감당할 수 없는 유동성을 가진 밴드. 각 풀은 생성될 때의 형태, LP 수수료, 틱 간격을 유지합니다: 락이 그 틱을 기록하고, Lens가 각 마켓의 LP 수수료와 틱 간격을 제공합니다.

까다로운 부분: 오프닝 가격

런칭 시 두 포지션은 모두 토큰만 보유합니다. 덕분에 프로토콜은 ETH를 전혀 대지 않습니다: 풀이 보유하게 될 모든 ETH는 매수자에게서 나옵니다.

포지션이 토큰만 보유하려면, 현재 가격이 범위의 상단과 같거나 그보다 위에 있어야 합니다. 따라서:

sqrtStartX96 = TickMath.getSqrtPriceAtTick(BAND1_UPPER);  // not sqrt(raw FDV)

런칭 FDV의 정확한 틱은 194,977.95이며, 그 위에서 가장 가까운 사용 가능한 틱은 195,000입니다. 원시 FDV에서 sqrtStart를 도출하면 가격이 밴드 1 안에 놓이게 되고, LiquidityLock의 NotSingleSided 검사가 예치를 거부할 것입니다.

양자화로 인해 실효 FDV는 3.409가 아닌 3.4016 ETH가 되며, −0.22 %의 편차가 생깁니다.

실제 모습

기본 설정에서, 런칭 시점부터 2 ETH씩 연속으로 매수할 때:

지출 FDV 보유 공급량
2 ETH ~$27,600 36.1 %
4 ETH ~$50,400 53.3 %
10 ETH ~$164,000 74.8 %
50 ETH ~$2.78 M 93.9 %

첫 매수는 공급량의 36.1 %를 가져갑니다 — 이전 커브에서는 36.99 %였습니다. 런칭은 1포인트 이내의 차이로 이전과 똑같이 작동하며, 이것이 파라미터를 고를 때의 기준이었습니다.

밴드의 구조적 상한

공급량의 100 %가 한 밴드에 있다고 할 때, 그 밴드가 흡수할 수 있는 ETH는 정확히 두 FDV의 기하평균입니다:

$$ E{\max} = \sqrt{\text{FDV}{\text{start}} \times \text{FDV}_{\text{end}}}

$$

파라미터를 제약하는 것이 바로 이것입니다: 런칭 가격, 밴드 상단, 그리고 깊이를 모두 자유롭게 고를 수는 없습니다 — 토큰 수량이 이 시스템을 닫습니다.

종료 모드

토큰과 마찬가지로 락은 업그레이드할 수 없습니다: 그 코드가 유동성을 풀 안에 붙잡아 둡니다. 2026-10-02부터 락에는 프로젝트가 문을 닫는 경우를 위한 출구가 하나 있습니다: 종료 모드입니다.

  1. 공지. StockFun의 오너가 end()를 호출하면, 락은 30일 뒤의 날짜를 공개적으로 기록합니다. 그때부터 새 마켓은 런칭할 수 없고 $STOCKFUN 포지션도 생성할 수 없으므로, 사전 공지 기간을 온전히 누리지 못하는 마켓은 없습니다. 거래와 수수료 수취는 계속됩니다
  2. 사전 공지 기간. 30일 동안 모든 풀은 계속 거래됩니다. 오너는 언제든 cancelEnd()로 취소할 수 있으며, 그러면 런칭이 재개됩니다
  3. 회수. 30일이 지나면 오너는 한 풀의 모든 포지션(마켓의 두 밴드, $STOCKFUN의 단일 포지션)을 빼내고, 수취되지 않은 기부금을 포함해 그 ETH와 토큰을 어떤 주소로든 보낼 수 있습니다(recoverLiquidity). 회수된 풀은 더 이상 아무것도 수취하지 않으며 잠긴 것으로 간주되지 않습니다. 이후에 취소해도 그 풀은 빈 상태로 남습니다

30일은 홀더를 위한 사전 공지 기간입니다. 이는 설정이 아니라 락의 상수 END_DELAY이며, 프로토콜에서 유일하게 고정된 대기 기간입니다.

종료 모드 밖에서는 어떤 것도 포지션에 닿지 않습니다. 2026-10-05부터 락은 수령인이 거부한 수수료 수취분의 몫을, 누군가 이를 지급할 때까지(payOwed) 그 수령인을 위해 보관합니다; 그리고 StockFun의 오너는 실수로 락에 보내진 것을 꺼낼 수 있습니다(rescue, rescueClaims, rescueNft): 어떤 토큰이든, 락이 보관하는 몫을 넘는 ETH, v4 클레임, NFT. 락에는 범용 호출이 없습니다: 그런 호출이 있으면 PoolManager를 통해 30일을 거치지 않고 종료 모드의 회수에 이를 수 있습니다.