캐치프레이즈: Lock'n'Use — 스테이블을 잠그면, 구독을 바로 쓴다.
- StakePass: 본 서비스(구독 집금·운용 플랫폼)
- YieldKey: 구독권 RWA(양도 불가 SBT NFT)
- Subscription DeFi: 예치 자산을 운용하는 파이낸셜 레이어
- Vault: 사용자 예치 자산을 수령/관리하는 온체인 금고(멀티-전략)
- Provider: 구독 서비스를 제공하는 사업자(OTT, AI, 음악/웹툰 등)
- KRWT/USDT: 스테이블 토큰(테스트넷 배포 토큰 포함). 문서 내 ‘KRWC’ 표기는 KRWT로 통일 제안
- Term: 구독 의무 이용 기간(3/6/12개월)
- LTV: (선지급 구독비/담보 예치금) 비율
- Penalty: 의무기간 미준수 해지 시 차감 수수료
- 문제: 대부분의 구독 서비스는 선불 과금이며, 사용자는 현금흐름 부담이 존재. 블록체인/DeFi 초보에게는 진입장벽이 큼.
- 해결: 사용자는 KRWT/USDT를 StakePass의 Vault에 예치(Stake)하여 담보를 제공하고, StakePass는 해당 담보를 근거로 구독료를 선지급(소액 대출 성격)하여 사용자가 즉시 서비스를 이용하도록 함. 이후 예치금은 Subscription DeFi로 운용되어 수익을 창출.
- 권리증명: Provider가 **YieldKey(SBT)**를 발행하여 이용권을 온체인 RWA로 증명(양도 불가, 검증 가능).
- 체인: Kaia testnet 우선(지갑: Kaia 생태계 지갑 + MetaMask 호환), LINE Mini App 연계 UX 제공
- 토큰: USDT, KRWT 테스트 토큰 자체 배포(ERC-20)
- 컨트랙트: Vault(수령/인출), Aggregator(전략/정책), YieldKey(SBT), ProviderRegistry, Oracle, Hook, Test Tokens
- 플랜: 3/6/12개월 Term만 지원, 자동 갱신(옵션)
- 서비스 카탈로그: OTT(Netflix/Disney+/Tving/Wavve/Watcha), AI(Claude/Gemini/ChatGPT), LINE(만가/뮤직), Entertainment(웹툰/뮤직) — 데모용 카테고리
- User: 담보 예치 및 구독 이용자
- Provider: 구독 서비스 발행/정산 주체
- ServicePlan: 서비스ID, 월 구독료, 통화(USDT/KRWT), 지원 Term, 최소 담보비율(LTV) 등
- SubscriptionOrder: 사용자의 특정 서비스/Term 구독 신청 레코드
- YieldKey(SBT): 서비스ID, Term, 만료일, 발행자(Provider), 소유자(User), 상태(유효/해지/만료)
- VaultPosition: User별 예치 잔고, 잠금 상태, 인출가능액
- 신청: User가 Service+Term 선택 → 담보 예치(Stake)
- 선지급: StakePass가 Provider에 구독료 선지급(월별 혹은 일괄 지급/설정값)
- 발행: Provider가 User에게 YieldKey(SBT) 발행
- 이용: User는 SBT로 접근 권한 인증(Web2/3)
- 운용: Vault가 예치금으로 이자 농사(Subscription DeFi 전략)
- 갱신/해지: Term 종료 시 갱신 또는 해지. 조기해지 시 Penalty 차감 후 반환
sequenceDiagram
participant U as User (Wallet)
participant FE as Frontend (Web/MiniApp)
participant API as StakePass API/Biz
participant VA as Vault/Aggregator Contract
participant PR as Provider (Off-chain + ProviderRegistry)
participant YK as YieldKey (SBT)
U->>FE: 서비스/Term 선택, 담보액 확인
FE->>API: /quote(serviceId, term)
API-->>FE: requiredDeposit, fee, expiry, LTV
U->>VA: deposit(amount) (KRWT/USDT)
VA-->>API: Deposit event(로그/웹훅)
API->>PR: 선지급 요청(settlement schedule)
PR-->>API: 수신 확인
API->>YK: mintYieldKey(user, serviceId, term, expiry)
YK-->>U: SBT 발행(지갑 수신)
U->>Provider App: SBT 검증 후 사용 시작
- Collateral/LTV:
LTV = 선지급총액 / 담보예치금 ≤ 0.8(예: 3개월 선지급 시 담보 ≥ 1.25x) - Coverage Margin:
coverage = fee*(months) * (1 + 10%) - Penalty(조기해지):
penalty = remaining_fee * p + unwind_cost(p=20~50% 정책) - 정산 방식: Provider에게 월별 정산(기본) 또는 일괄 선지급(옵션)
- 자동갱신: 만료 7일 전 알림, 담보/LTV 충족 시 자동 갱신
정책 수치는 MVP에서 환경변수/온체인 파라미터로 조정 가능하게 구현
각 기능은 사전조건(Pre), 입력(Input), 출력(Output), 시스템(System) 순으로 기재.
- Pre: 사업자 KYC/계약 완료
- Input: providerName, payoutWallet, serviceList([]), attestPubKey
- Output: providerId, onChain role/grant
- System:
- Admin가 ProviderRegistry에 등록(Owner 권한 부여)
- Payout 지갑 검증 트랜잭션(소액 서명/콜백)
- 서비스 카탈로그 업로드(요금/통화/Term/환불 정책)
- Pre: Provider 등록
- Input: serviceId, currency(USDT/KRWT), monthlyFee, terms[3,6,12], minCollateral, policy
- Output: planId
- System: ProviderRegistry.setPlan(...) → 이벤트 인덱싱 → API 캐시 반영
- Pre: 활성 플랜 존재
- Input: serviceId, term
- Output: requiredDeposit, feeSchedule, expiry, LTV
- System:
- monthlyFee*months 계산
- LTV/coverage 기준으로 requiredDeposit 산출
- 오라클(USD/KRW 환산) 및 슬리피지/수수료 고려
- Pre: User가 지갑 준비, 승인(approve)
- Input: amount, token(USDT/KRWT), serviceId, term
- Output: txHash, positionId
- System: Vault.deposit → Aggregator 전략로 분배(부분 보유/부분 예치)
- Pre: UC-04 완료 및 담보≥요구치
- Input: orderId, schedule(monthly|upfront)
- Output: payoutTxHash (on-chain/off-chain 기록)
- System:
- (기본) 월별 정산: epoch마다 vault→provider payout
- (옵션) 일괄 선지급: 즉시 지급
- Pre: UC-05 성공
- Input: user, serviceId, term, expiry, providerSig(EIP-712)
- Output: tokenId
- System: YieldKey.mint(to, metadata); Provider 서명/권한 확인; SBT 비양도 설정
- Pre: User 로그인 또는 지갑 서명
- Input: userId or wallet, tokenId
- Output: valid(bool), expiry, serviceId
- System:
- Web3: 컨트랙트 직접 조회
- Web2: SIWE(EIP-4361)/EIP-712 서명 → JWT 세션 발급 → 백엔드가 SBT 보유/만료 조회
- Pre: 만료 7일 전, 담보/LTV 충족
- Input: orderId
- Output: renewed(bool), newExpiry
- System: 배치서버가 조건 검증→ 정산 → 새로운 YieldKey 갱신(혹은 메타데이터 업데이트)
- Pre: User 요청, Term 미완료
- Input: orderId, reason
- Output: refundAmount, penalty
- System: Penalty 계산→ Provider/플랫폼 수수료 분배→ Vault에서 잔액 환급→ YieldKey 소각
- Pre: Term 완료 & 모든 정산 OK
- Input: positionId
- Output: withdrawTxHash
- System: 전략 자산 언스테이킹→ Vault 출금→ 포지션 종료
- Pre: 이상상황
- Input: action(pause, limitLTV, blockProvider ...)
- Output: policyApplied
- System: 컨트랙트 pause, 파라미터 조정, 정산정지 등
- Pre: 활성 ServicePlan 존재, 오라클 가용
- Input:
serviceId,term(3|6|12), (옵션)wallet - Output:
quoteId,requiredDeposit,ltv,expiry(ts),feeSchedule{month:amount},ttl(분) - System:
- ServicePlan 조회 → 월요금×term 계산
- LTV·커버리지 기준으로
requiredDeposit산출, 환산(USD/KRW) 반영 - Quote를 캐시/DB 저장(TTL), 서명가능 페이로드 생성(EIP-712)
- Pre: Admin 권한, Provider KYC 완료
- Input:
providerName,payoutWallet,attestPubKey,serviceList[] - Output:
providerId, 온체인 role - System: Registry에 등록 tx → 이벤트 인덱싱 → 오프체인 KMS에 attestPubKey 보관
- Pre: Provider 등록
- Input:
serviceId,currency,monthlyFee,terms[],minCollateral,policy - Output:
planId - System: on-chain setPlan → 이벤트 동기화 → 캐시 무효화
- Pre: 토큰
approve, 유효quoteId - Input:
amount,token,serviceId,term,quoteId - Output:
txHash,positionId - System:
- Quote 검증(TTL/LTV 일치)
- Vault.deposit → Aggregator 전략배분(유휴/예치 비율)
- Position 레코드 생성(락/만기/서비스ID)
- Pre: 담보≥요구치, position 유효
- Input:
orderId,schedule(monthly|upfront) - Output:
payoutTxHash,settlementId - System:
- 월별: 배치가 epoch마다 지급, 실패 시 재시도(backoff, idempotency key)
- 일괄: 즉시 지급 후 스케줄 종료
- Pre: 정산 성공
- Input:
user,serviceId,term,expiry,providerSig - Output:
tokenId,tokenURI,valid - System: Provider 서명 검증 → SBT mint(비양도) → 만료/해지 상태 전이 → 소각 시 access 차단
- Pre: 로그인 또는 지갑서명(SIWE/EIP-712)
- Input:
userIdorwallet,tokenId - Output:
JWT또는valid(bool) - System:
- Web2: 지갑연결→JWT 발급→백엔드가 컨트랙트 조회 캐시
- Web3: 컨트랙트 직접 조회(Revert-safe), 세션키 관리
- Pre: Term 미완료
- Input:
orderId,reason - Output:
refundAmount,penalty,txHash - System: Penalty 공식 적용→ 언스테이킹→ 환급→ SBT burn
- Pre: Term 완료, 미연체
- Input:
positionId - Output:
withdrawTxHash - System: 포지션 해제→ 전략 언스테이킹→ Vault 출금
- Pre: Vault 잔고 존재
- Input:
strategyId,alloc%,params{} - Output:
rebalanceTx,APR,PnL - System: 허용목록(allowlist) 프로토콜만 사용, 슬리피지/가스/리스크 한도 체크, 주기적 리밸런싱
- Pre: 대규모 정산·스왑 예정
- Input:
batchId,ops[] - Output:
privateBundleTxHash - System: MEV-protect RPC 또는 Private Tx, 4337 Bundler/Paymaster(가스 후원), 시세 급변 시 중단/롤백
- Pre: 가격/디페그 모니터링 필요
- Input:
feeds[],thresholds - Output:
riskEvent,pause/limit - System: 멀티소스 오라클, 하트비트/탈선 감지, 자동 pause/담보율 상향
- Pre: 만료 임박
- Input:
orderId - Output:
renewed,newExpiry또는 알림발송 결과 - System: 배치가 조건 확인→ 자동 갱신 트리거 또는 푸시/메일 알림
- Pre: Admin 권한
- Input: 기간/서비스/프로바이더 필터
- Output: TVL, 활성구독, 체납, 수익, 리스크 지표
- System: 온체인 이벤트 + 오프체인 메타 집계, 대시보드 제공
- Pre: 민감 이벤트 발생
- Input: 액션/주체/서명/정책ID
- Output: 불변 로그(append-only)
- System: WORM 스토리지/해시체인, 접근통제, 보존정책
- 모듈: Vault, Aggregator, YieldKey(SBT), ProviderRegistry, Oracle, Hook (업그레이더블 UUPS 권장)
- 주요 스토리지:
- Vault:
mapping(user=>position),totalDeposited,lockedUntil - Aggregator:
strategies[],allocations,ltvParams,settlementPolicy - YieldKey:
ownerOf(tokenId),serviceId,term,expiry,status - Registry:
providers,plans,roles
- Vault:
- 핵심 함수:
deposit/withdraw,rebalance/stake/unStake,mint/burn/verifySBT,setPlan/updatePlan,setOracle,pause - 이벤트:
Deposited,Settled,YieldKeyMinted,Cancelled,Withdrawn,Paused등 - 접근제어:
AccessControl(ADMIN/PROVIDER/OPERATOR),Pausable,ReentrancyGuard - 정책파라미터: LTV, coverage, penalty, settlement schedule, allowlist
- 보안: 체크리스트(재진입, 인플레이션, 승인·토큰 취급, 오라클 조작, 업그레이드 롤 소유권)
- 테스트: 단위/프로퍼티/시뮬(test) + 포크 테스트, 가스리포트
- MVP 경계: 실제 DeFi 연동은 mock/샌드박스 전략으로 시작, 이후 실제 프로토콜 어댑터 추가
- 플랫폼: Web + LINE Mini App(모바일 우선)
- 주요 화면:
- 온보딩/로그인(지갑연결·SIWE)
- 서비스 카탈로그(카테고리/요금/필요예치금 표시)
- 견적(Quote) → 예치(Deposit) 플로우
- 구독 현황(활성 YieldKey, 만료일, 갱신/해지)
- 알림센터(만료 안내)
- 설정/지갑/보안
- 지갑/연동: Kaia 지갑 + MetaMask, WalletConnect; SIWE/EIP-712 서명; JWT 세션
- 상태관리: React Query/Zustand, 캐시 정합성(Event 기반 리프레시)
- 에러/예외: 잔액/승인 부족, Quote 만료, 체인 mismatch, 트랜잭션 실패
- 접근성: 다국어(i18n), 키보드·스크린리더 고려
- 서비스: Auth, API, Biz, Batch, Finance, Scanner, Admin
- 주요 기능:
- Auth: Nonce, SIWE, JWT, wallet-user 매핑
- API: REST/gRPC 게이트웨이, OpenAPI 준수
- Biz: UC 플로우 오케스트레이션(정산/갱신/해지)
- Batch: 월정산/만기모니터/알림
- Finance: 전략엔진/MEV 보호/리밸런싱
- Scanner: 온체인 이벤트 인덱싱
- Admin: 정책/대시보드/감사로그
- 데이터 모델(요약): Users, Providers, Plans, Orders, Positions, YieldKeys(meta), Settlements, Quotes, RiskEvents, AuditLogs
- 통신: 내부 gRPC + 메시지 큐(Kafka/RabbitMQ)로 비동기 이벤트 처리
- 보안/운영: RBAC, Rate-limit, WAF, observability(OpenTelemetry), 백업/DR
- Phase 0 (아키/부트스트랩, 1주): 레포 구성, CI/CD, 코드규약, 시크릿·환경설정
- Phase 1 (컨트랙트 스켈레톤, 2주): Vault/Agg/YieldKey/Registry mock 배포, 이벤트 스키마 고정
- Phase 2 (백엔드 코어, 2주): Auth/API/Biz/Scanner 기본 플로우(
/quote,/subscribe) - Phase 3 (프론트 MVP, 2주): 카탈로그→견적→예치→발행 플로우, MiniApp 베타
- Phase 4 (정산/갱신/해지, 2주): Batch/Settlement/Renew/Cancel, Admin 최소기능
- Phase 5 (전략엔진 v0 & 리스크, 2주): mock 전략, 오라클·리스크 가드, MEV protect 시범
- QA/보안 검토 (1주): E2E/성능/침투·스마트컨트랙트 정적분석
- 릴리즈: Kaia testnet 데모 공개
Acceptance Criteria (핵심)
/quote→deposit→settlement→SBT mint시나리오 95% 이상 성공- 조기해지/만기인출 정상 처리, 재진입·중복정산 없음
- Web2/Web3 인증 후 Provider 데모앱에서 SBT 검증 통과
- 장애/리스크 조건에서 자동 pause 동작
리스크/완화
- 가격 급변/디페그 → Oracle 2중화·LTV 상향 자동화
- MEV/슬리피지 → Private Tx·쿨다운·한도
- 규제이슈 → 선지급/에스크로 법무 자문 및 지역 제한 플래그
- REST/gRPC, OpenAPI, 인증 스펙은 본 PRD v2 기준으로 재사용/보완.
- 추가 엔드포인트:
/quote,/renew,/cancel-early,/provider/*등은 다음 단계에서 OpenAPI에 반영.