본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 30. 17:06

인디 개발자를 위한 펀딩 플랫폼 구축 — 프로젝트 실패 시 후원자에게 환불되는 시스템

요약

Solana 기반의 비수탁형 펀딩 플랫폼 'Keep'의 엔지니어링 구조를 분석합니다. 프로젝트 실패 시 프로토콜이 자동으로 후원자에게 USDC를 환불하는 온체인 메커니즘과 TWAP 기반의 성공/실패 판단 로직을 다룹니다.

핵심 포인트

  • Solana 기반의 비수탁형(non-custodial) 온체인 펀딩 시스템 구축
  • TWAP(시간 가중 평균 가격)을 활용한 프로젝트 성공 여부 자동 판별
  • 실패 시 LP 해제 및 토큰 소각을 통한 자동 환불 메커니즘 구현
  • 프로젝트 성공 시 Raydium 풀 부트스트랩 및 유동성 잠금 방식

Solana 기반의 환불 가능하고 비수탁형(non-custodial) 온체인(onchain) 펀딩 — 소규모 팀과 독립 빌더들을 위해 구축되었습니다.

소규모 팀이나 1인 개발자가 자금을 조달하는 방법은 보통 두 가지 좋지 않은 선택지로 귀결됩니다. 이사회 의석을 원하는 VC(Venture Capital)를 쫓거나, 프로젝트가 실패할 경우 후원자들이 모든 하락 위험(downside)을 떠안게 되는 토큰 세일(token sale)을 진행하는 것입니다. 저는 제3의 길을 원했고, 그래서 Keep을 구축했습니다. 이는 독립 빌더들이 자신의 사용자들로부터 자금을 조달할 수 있는 방법으로, 펀딩이 실패할 경우 프로토콜 자체에서 후원자들에게 자동으로 환불되는 방식입니다. 어떤 회사도 돈을 보유하지 않으며, 귀하에게 지급될지 여부를 결정하는 인간도 없습니다.

이 포스트는 엔지니어링 분석(engineering teardown)입니다. 환불이 실제로 어떻게 작동하는지, 왜 인센티브가 유지되는지, 그리고 구축하기 정말 어려웠던 부분들은 무엇인지 다룹니다. 아래의 모든 온체인(on-chain) 읽기 작업은 @keep-coffee/sdk를 통해 직접 검증할 수 있습니다.

설정: 고정 가격 펀딩, 그 후의 실제 시장

빌더는 고정된 USDC 목표치를 설정하여 펀딩을 시작합니다. 후원자들은 펀딩 기간 동안 고정된 가격으로 펀딩에 참여(back)합니다. 토큰 공급량은 사전에 다음과 같이 분할됩니다:

  • 60%는 후원자에게, 고정 가격으로 분배
  • 30%는 펀딩 완료 시 Raydium 풀에 시드(seeded) 공급
  • 10%는 창업자에게, 성공 경로에 따른 베스팅(vesting) 조건 적용 (180일)

목표 금액이 달성되면, 프로토콜은 모집된 USDC의 절반 + 30%의 토큰 할당량으로 Raydium CPMM 풀을 부트스트랩(bootstraps)하며, 나머지 절반의 USDC는 예비비(reserve)로 유지합니다. 그 순간부터 토큰은 다른 토큰들과 마찬가지로 공개 시장에서 거래됩니다. 이후 7일째와 30일째에 두 번의 판단이 뒤따르며, 각 판단은 **1시간 TWAP(시간 가중 평균 가격)**을 프로젝트별 성공 게이트(기본값 출시 가격의 0.85배)와 비교합니다.

이후의 모든 과정은 단 하나의 질문에 따라 갈립니다: 시장이 게이트를 유지했는가?

성공: 그저 공개 시장일 뿐입니다

만약 30일 TWAP(Time-Weighted Average Price)가 게이트를 통과하면, 자금 조달은 성공합니다: 준비금이 플랫폼 수수료와 프로젝트의 자금을 지불하고, LP의 100%는 영구적으로 잠깁니다. 성공적인 자금 조달에는 환불이 없습니다. 이는 일반 시장으로 진입했음을 의미하며, 일반 시장은 원금 보호가 되지 않습니다. 이 차이는 중요하므로 저희는 모든 곳에서 이를 명확히 유지합니다: 환불은 돈을 돌려주는 보증(money-back guarantee)이 아니라 _실패 시 안전장치(failure backstop)_입니다.

실패: 환불 자금이 스스로 조성됩니다

게이트가 실패하면(7일 또는 30일), 이 프로토콜은 대부분의 런치패드가 할 수 없는 일을 수행합니다. 그 이유는 런치패드들이 돈을 온체인에 보관한 적이 없기 때문입니다:

  1. LP 100% 해제(Unwind). 풀은 프로토콜로 되돌아갑니다 — 한쪽에는 USDC가, 다른 쪽에는 프로젝트 토큰이 있습니다. 반환된 프로젝트 토큰은 소각됩니다(burned).
  2. ClaimPool 조성. 회수된 USDC(시간 감쇠 할인율을 제외한 미사용 준비금 포함)는 보유자들을 위한 환불 풀이 됩니다.
  3. 소각 후 청구(Burn-to-claim). 지지자는 자신의 토큰을 소각하고 풀에서 비례 배분된 USDC를 받습니다. 프로토콜의 유일한 수수료는 시간 감쇠 **할인율(haircut)**입니다 — 7일 실패 시 5%, 30일 실패 시 15% — 이 금액은 플랫폼과 프로젝트에 지불되며, 커스터디언에게 절대 가지 않습니다. 게이트 근처에서 실패하는 자금 조달은 할인율을 제외하고 거의 전체 자금을 반환합니다. 더 깊이 실패할 경우 전반적인 USDC 회수액은 적지만 — 남아있던 보유자들이 이 모든 것을 분배받습니다 (아래 참조).

커스터디가 없습니다.

따라서 토큰을 보유하고 있던 후원자들(그리고 폭락한 토큰을 저렴하게 매수한 차익 거래자들)이 환불 풀(refund pool) 전체를 나누어 가집니다. 하락장에서 패닉 셀(panic-sell)을 한 후원자는 이미 시장 가격으로 자신의 USDC를 회수한 상태이므로, 환불 지분을 포기하게 되며 그 지분은 여전히 보유 중인 사람들에게 돌아갑니다.

이는 일반적인 실패 역학을 뒤집습니다. 일반적인 토큰의 경우, 조기에 던지는(dumping) 것이 합리적인 선택이며 보유자들은 물량을 떠안게(bag-holding) 됩니다. 하지만 여기서는 던지는 행위가 스스로를 해치게 됩니다. 거의 전액에 가까운 환불을 포기하는 대신 헐값에 매도하게 되며, 자신의 환불 지분을 남아있는 사람들에게 넘겨주게 되기 때문입니다. 이 메커니즘은 인내심 있는 사람들에게 보상을 주며, 누가 보상을 받을 자격이 있는지 누군가 결정할 필요 없이 자동으로 이루어집니다.

게이트(Gate)가 TWAP인 이유, 그리고 왜 0.85인가

두 가지 직관적이지 않은 선택이 있습니다:

스팟(Spot) 가격이 아닌 시간 가중 평균 가격(TWAP). 판정 기준은 순간적인 가격이 아니라 1시간 동안의 TWAP를 읽습니다. 단일 거래로 인한 급등 — 플래시 론(flash-loan) 펌핑이나 마지막 순간의 윅(wick) — 은 누적 가격 평균을 거의 0에 가깝게 움직이지 못하므로, 판정을 원자적(atomically)으로 조작할 수 없습니다. 지속적인 가격 조작을 시도하려면 한 시간 동안 차익 거래(arbitrage)에 맞서 실제 자본을 태워야 합니다. 조작 자체가 이미 경제적으로 취약하기 때문에(실패를 강제하려면 환불을 위해 태워야 할 바로 그 토큰을 팔아야 함), 이 윈도우는 요새처럼 막기보다는 **억제(deter)**하는 역할을 해야 합니다.

게이트는 1에서 헤어컷(haircut)을 뺀 값과 같습니다. 기본 게이트는 0.85×로, 이는 정확히 30일 차 환불 비율입니다. 이 가격에서 후원자는 토큰을 보유하는 것과 실패 환불을 받는 것 사이에서 _무차별적(indifferent)_이 됩니다. 이 가격보다 낮아지면 환불이 엄격하게 더 유리해지므로, 프로토콜은 그 지점에서 성공을 선언해서는 안 됩니다. 게이트를 헤어컷에 고정함으로써, 이를 조정된 추측이 아닌 온체인 불변량(on-chain invariant)으로 만듭니다.

진정으로 어려웠던 부분들

  • 4 KB 스택 프레임 (The 4 KB stack frame). Solana의 SBF 런타임(runtime)은 명령(instruction)당 스택 크기를 4 KB로 제한합니다. 런치패드(launchpad), 민트(mint), 두 개의 금고(vaults), 그리고 공급량 민팅(minting)을 하나의 명령으로 처리하려 했을 때 스택 프레임이 초과되었습니다 (이는 방금 역직렬화(deserialized)된 인자를 손상시키는 정의되지 않은 동작(undefined behavior)을 유발했습니다). 프로젝트 생성은 create_projectinit_vaults로 분리되었으며, 입금(deposit) 명령은 후원자의 토큰 계정을 인라인(inline)으로 초기화하는 것을 중단했습니다. 대신 호출자가 동일한 트랜잭션 내에서 멱등적(idempotently)으로 계정을 생성하도록 변경했습니다.
  • 종료를 절대 가두지 마십시오 (Never trap the exit). 긴급 동결(emergency-freeze) 및 7일/30일 종료(finalize) 기능은 경로 인식(path-aware) 방식으로 작동합니다. 동결은 성공 시의 지급(payouts)은 일시 중지하지만, 실패 시의 환불(refund)은 절대로 차단해서는 안 됩니다. 왜냐하면 finalize는 환불에 필요한 ClaimPool을 생성하는 유일한 명령이기 때문입니다. 홀드 기간(hold window) 동안 이를 동결해 버리면 후원자의 환불이 잠기게 됩니다. 따라서 프로토콜이 동결된 상태에서도 실패 분기(failure branch)와 claim_refund는 접근 가능한 상태로 유지됩니다.
  • 정확히 약 95%를 반환하는 실패 처리. LP 언와인드(unwind)는 각 단계에서 95%의 슬리피지 하한선(slippage floor)을 강제하여 프런트러닝(front-run)이 환불 풀을 축소할 수 없도록 하며, ClaimPool 견적(quote)은 USDC가 고립되는 대신 정수 나눗셈의 먼지(dust) 수준까지 소진되도록 설계되었습니다.

정직함 (Honesty, 대부분의 포스트가 생략하는 부분)

  • 비수탁형 (Non-custodial). 후원자들은 온체인 프로그램(on-chain program)에 직접 비용을 지불합니다. 프로토콜은 대차대조표상에서 사용자의 자금을 보유하거나 이동시키지 않습니다. 환불은 코드에 의해 실행되는 예비금(reserve) 및 해제된 LP(unwound LP)를 통해 이루어집니다.
  • 실패 경로에서만 환불 가능 (Refundable only on the failure paths). 펀딩 금액이 목표치에 도달하지 못하면 모든 후원자에게 전액 환불됩니다. 목표치를 달성했으나 이후 가격 검증(price check)을 통과하지 못할 경우, 계약(contract)에 의해 메커니즘으로부터 자동으로 환불되지만, 5%(7일 경과 시) / 15%(30일 경과 시)의 헤어컷(haircut, 수수료 차감)이 적용됩니다. 실제 수령 금액은 회수된 유동성(liquidity)과 얼마나 많은 홀더(holder)가 남아 있는지에 따라 달라집니다.

성공적인 펀딩은 공개 시장(open market)과 같습니다. 보호되거나 보장되지 않습니다. 그 이후에 해당 공개 시장에서 구매하는 것은 환불을 전혀 보장하지 않습니다.

  • 직접 검증하세요 (Verify it yourself). 이 포스트의 말만 믿지 마세요. 런치패드(launchpad)와 ClaimPool 상태를 체인에서 직접 읽어보고(SDK의 getRaise / getClaimPool 함수가 계정 바이트에서 이를 직접 디코딩합니다), 여기에 주장된 내용과 규칙이 일치하는지 확인하십시오.

사용해 보기 (Try it)

npm i @keep-coffee/sdk @solana/web3.js
import { Connection } from '@solana/web3.js';
import { KeepClient } from '@keep-coffee/sdk';

...

이 SDK는 MIT 라이선스이며 비수탁형(non-custodial)입니다. 모든 쓰기(write) 작업은 사용자가 직접 서명해야 하는 서명되지 않은 트랜잭션(unsigned transaction)을 반환합니다. 소스: github.com/keep-coffee/keep-sdk. 이 SDK는 AI 빌더(builders)와 에이전트(agents)를 위해 구축되었으며, 리포지토리(repo)에 LangChain 도구 예제가 포함되어 있습니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0