Skip to content

제품 타임라인

개발 단계와 상태다. 2026년 6월에 갱신했다(v3.0 모델 반영).

플랫폼 코어

완료

  • 핵심 스마트 컨트랙트(4개. v3-11이 PlatformEscrow를 흡수해 6개에서 줄었다)
  • SIWE 인증 + JWT
  • SumSub KYC 연동 + SBT 민팅
  • 풀 생성과 관리(어드민)
  • 투자(atomic 입금 + LP 민팅. 별도 에스크로 없음, v3-03 / v3-11)
  • 투자자 포트폴리오 화면
  • 상환 요청 플로우(어드민 단일 승인 + PENDING_RESERVE, v3-04. pool_type은 v3-01에서 제거)
  • 펀드 관리(funds, fund_members)
  • 알림 시스템(V1, 이메일 + 인앱. v3-103에서 notification_events/notifications/notification_deliveries 기반으로 재구축했고 SES 반송·불만 이벤트를 실시간으로 받는다)
  • RBAC(Admin / Operator / Fund Manager)
  • NAV 오라클을 PlatformPool에 통합 🟠 PD1(결정됨)

진행 중

  • NAV 갱신 플로우(어드민 패널)
  • 24시간 타임락 강제
  • 포트폴리오 NAV 표시(투자자 UI)
  • 상각 UX(어조와 투명성)
  • 어드민 패널 V2 정리
  • 수익 분배 플로우(claim 기반, MANUAL_CLAIM만)
  • 풀 lifecycle 자동 전이(스케줄러)

만기 후 상환: 구현됐고 수동 배포와 마이그레이션 둘을 기다린다

코드에는 있지만 라이브가 아니다. 마이그레이션 01890190이 dev에 적용되지 않았고 API도 수동 deploy:dev:api다. 프론트엔드와 백엔드 쪽은 컨트랙트 변경이 필요 없고, 아래의 컨트랙트 항목 하나는 이미 구현돼 온체인에 있으며 새 팩토리에서 풀이 만들어지기만 기다린다.

  • 위저드가 FIXED_MATURITY + 회차를 만들 수 있게 하고, 계획 컬럼 redemption_term_epochs · epoch_date_basis · epoch_roll_day 추가(0189) 🔨 v3-132
  • 배포가 시계 예산 안에서 모든 주기의 펀딩일을 쓰고, redemption_epochs.funding_date가 실제로 기록된 것을 남긴다(0190). 인덱서 수정 포함 🔨 v3-133
  • 펀딩일 리마인더를 epoch_cycle_mode가 아니라 쓰이지 않은 주기를 조건으로 발동. ⚠️ 코드 이음매 하나가 아직 발동을 막고 있다 🔨 v3-135
  • 주기별 확정(epoch_id)과 펀딩일 순서 가드를 엔드포인트에 추가(컨트랙트가 아니다) 🔨 v3-139
  • role 부여가 서명자를 따라가고, 부트스트랩 PAUSER를 회수하기 전에 인계한다 🔴 v3-138
  • ✅ 수익 발생이 요청이 아니라 정산에서 끝난다(컨트랙트). 마지막 MVP 항목이자 이 상품에서 엔진이 엉뚱한 사람에게 지급하던 유일한 지점이었다. 2026-08-20 반영, 2026-08-21 온체인. 신규 풀만 해당되고 아직 새 팩토리로 만든 풀이 없다 🔧 v3-131

계획됨

  • 만기를 투자자별로 앵커(컨트랙트. MVP 범위 밖) 🔧 v3-131
  • over_funding_detected 문구 수정. 메일이 펀드매니저에게 남은 금액이 다음 주기로 이월된다고 말하는데 그렇지 않다 🔴 v3-137
  • DocuSign 텀시트 연동 🟠 PD2
  • 오라클 폴백(PD4. 결정: 폴백 없음) 🟠 PD4
  • KAIA 메인넷 이중 배포
  • 멀티시그 어드민 제어(v3-37에서 형태 결정: Admin 3-of-5, Pauser는 별도 2-of-3)

두 항목은 완료돼서가 아니라 다른 이유로 이 목록에서 빠졌다. "이메일 알림 시스템"은 위 완료 항목과 중복이었다. "Reserve fund mechanics"(BD4)는 대기 중이 아니라 해소됐다. R8이 reserve는 상환 유동성이고 손실을 절대 흡수하지 않는다고 정리했으므로 더 만들 메커니즘이 없다. updateNAVreserveConsumed는 항상 0이고 컨트랙트가 그 외의 값을 거부한다. first-loss는 Junior 트랜치이거나 운용사의 equity 버퍼다.

미정

  • 세컨더리 마켓 · LP 전송 🟡 BD5
  • 애널리틱스 대시보드
  • 모바일 앱

참고: 다중 스테이블코인(USDC/USDT/DAI, USD 기반)은 풀별로 지원된다(풀당 하나를 권장한다). 04-pool-models 참조. KYC/KYB 게이팅은 운영 중이다(풀별, v3-10).


Joob 풀 연동 (R21)

Joob(Grab JV)의 eNote Finance 펀드 연동이다. 하이브리드 모델로, Joob API(펀드 재무)와 온체인(투자자 포지션용 RPS 토큰)을 함께 쓴다.

참고: Notion — Joob Pool Integration To Do | API 스펙 문서

ℹ️ 이 절의 일부는 3월 스펙 기준이다. 현재 정본은 Grab Joob API — Aset Integration과 2차 요청이다. 2026-06-16 리뷰에서 정리된 것: ① total_rni는 총액으로 확정됐다. 코드 yield-distributions.post.create.ts가 총액을 입력받아 net_yield_fee_config(admin/perf fee)로 net을 계산한다(NULL이면 net=gross). 연동 문서 7번은 낡았다. 확인이 남은 한 줄은 rni가 이미 Joob 쪽 LOF/WHT를 뺀 값인지다(Aset 수수료 계층과는 별개다). ② DPD는 구간별(30/60/90) 구현이 최종이다. Joob에 대해 그렇고(아래에서 정정됨. ⚠️ 마스터 라우트는 2026-08-19에 대체됐다. 30/60만 제공하고 구간 90은 /risk/nonperforming으로 대체됐다. Guest API 표면 참조) 분모(active_loan_count/미상환)만 2차 요청 대상이다. (Aset 쪽 반입과 데이터 모델은 Joob이 아닌 규제 체계를 위해 관할이 정의하는 동적 구간으로 일반화하는 중이다. v3-59)

완료 (1단계, 스펙)

  • Joob API 스펙 작성과 통화 완료(엔드포인트 3개: Fund Summary, Fund History, DPD Risk)
  • RPS 토큰 컨트랙트 확인: 0x3f9c...1403(Kaia)
  • DB 스키마: poolsoperating_currency, fx_rate 컬럼 추가(schema.sql L322-323)
  • 어드민 API 타입: operatingCurrency, fxRate 매핑 정의(admin-web/shared/api/pools.ts)
  • total_rni가 총액임을 확인(mgmt/perf fee 미적용, net interest = interest - LOF - WHT)
  • 투자자 데이터: Joob이 제공하지 않아 온체인 balanceOf와 Transfer 이벤트 인덱싱으로 대체
  • DPD: 구간별(30/60/90) 구현(Joob /risk/dpd/{bucket}을 구간마다 호출). 3월의 "구간 불필요" 계획에서 바뀌었다. ⚠️ 2026-08-19 기준 펀드 라우트에만 해당된다. 마스터 라우트는 구간 90을 뺐고(dpd-exclude-90) 집계를 월별로 키잉한다. Guest API 표면 참조. active_loan_count와 미상환 분모는 미포함이라 2차 요청 대상

⚠️ 아래 단계 날짜는 3월 계획 기준이고 이미 지났다

2~4단계는 2026년 4~5월로 잡혀 있었다. 제목을 현재 상태로 읽지 말 것. 2026-08-06 점검에서 코드로 확인할 수 있었던 줄은 아래에 ✅나 ⛔로 표시했고, 나머지는 여기서 재검증하지 않았다. 실제 현황은 이 페이지가 아니라 위에 링크한 Notion 정본에 있다.

2단계: DB와 백엔드 (예정 4/1)

  • pools.post.create.tsoperating_currency, fx_rate를 받는다
  • pools.patch.update.ts에 두 필드가 배선됐다
  • Joob 풀 수동 생성과 lp_token_address = RPS 컨트랙트: 재검증 안 함
  • ShardLab/Hashed 입금과 portfolio_positions 수동 생성: 재검증 안 함
  • 투자 가능 상태 로직: 비투자자는 CLOSED, 투자자는 ACTIVE(lifecycle_status와 노출): 재검증 안 함
  • 계약에 맞춘 풀 값 확정(락업, 패널티, 최소 투자금): 상업 조건이고 코드가 아님

3단계: UI (예정 4/15)

  • 어드민 pool-form.tsxoperating_currency, fx_rate 입력 필드
  • 풀 상세 pool.$id.tsx에 Fund Statistics 카드(FX 배너 폐기됨. v3-24, USD 전용이고 투자자 대상 FX 고지 없음)
  • 포트폴리오 portfolio.tsx에 수익률 % 표시와 CLOSED 풀 버튼 숨김
  • 풀 카드의 운영 통화 태그(폐기됨. operating_currency는 백엔드 전용, v3-24)
  • 어드민: Joob 풀 전용 관리(수수료 추적, DPD 리스크 모니터)
  • Net Yield 계산 로직: 연 1% admin fee(분기 지급) + 20% perf fee(15% hurdle 초과분, 만기에)

4단계: API 연동 (예정 5월 초)

  • ✅ 예약된 fund-data 동기화가 있다(fund-data.scheduler.sync) → external_pool_data_snapshots
  • ✅ TVL 스냅샷 크론이 있다(pools.scheduler.tvl-snapshot) → pool_tvl_history
  • ✅ 온체인 LP Transfer 인덱싱이 있다(onchain-indexer.scheduler) → portfolio_positions
  • 투자자 포지션: 온체인 balanceOf와 Fund Summary 하이브리드: 재검증 안 함

다음 사이클

  • 풀 스마트 컨트랙트 설계와 배포
  • API 동기화에서 온체인으로 전환
  • IRR 계산(현금흐름 기반, Aset 자체 계산)
  • 회수율(NPL 0%라 아직 필요 없음)
  • eNote v2 갱신 이후의 대출별 상세 데이터(4월 이후)