핵심 개념
작업 진행 중
이 페이지는 v3.0 핵심 개념을 반영한다. AS_POOL/FUND_POOL 바이너리 모델은 24개 차원 설정 모델로 대체됐다. 전체 차원 목록은 풀 모델 참조.
Aset이 어떻게 동작하는지를 규정하는 기반 모델과 메커니즘이다.
설정으로 정의되는 풀 (v3.0)
풀은 더 이상 타입(AS_POOL/FUND_POOL)으로 나뉘지 않는다. 각 풀은 약 24개의 독립 차원으로 정의된다. fund_wallet, reserve_bps, maturity_model, kyc_level_required, 트랜치 상품용 tranche_group_id/tranche_priority(v3-14) 등이다. Pool 컨트랙트도 같고 플로우도 같으며, 설정만 달라진다. NAV는 항상 Aset 오라클 Lambda가 계산한다(v3-15).
동작 방식
입금 흐름은 투자자 → Pool 컨트랙트 → 리저브 몫은 reserve_wallet, 나머지는 fund_wallet이다. LP는 투자자에게 민팅된다.
LP 발행은 항상 플랫폼이 한다
Aset이 항상 PlatformLPToken으로 LP 토큰을 민팅한다. 풀당 LP 컨트랙트 1개이고, 이것이 투자자 포지션의 단일 기준이다. FUND_ISSUED 모드는 폐기됐고, 파트너는 더 이상 자기 LP를 민팅하지 않는다.
트랜치 상품(v3-14)은 tranche_group_id를 공유하는 별도 풀 2~3개를 배포한다. 각각은 자기 LP 토큰을 가진 표준 SINGLE 풀이다. 풀 하나에 LP 둘을 두는 패턴은 쓰지 않는다.
NAV 토큰 가격
LP 토큰 가격은 $1.00에서 아래로만 움직인다(상한 $1.00, 프리미엄 가격 없음). 하한은 $0.00이 아니라 **1e-6**이다. 0은 표현할 수 없으므로 전손은 1e-6으로 가격이 매겨지고, 그 사실은 숫자가 아니라 lifecycle이 IMPAIRED로 넘어가는 것으로 전달된다(Writedown & NAV). 토큰 가격 자체가 손실 지표이고, 별도의 PF 승수는 없다. 신규 투자자는 현재 NAV로 들어온다(공정한 진입). 투자는 항상 열려 있고 자동으로 막히지 않는다. tokens_minted = deposit / nav_per_token.
동작 방식
NAV가 $0.92일 때 $10,000을 예치하면 10,000 / 0.92 = 10,869 토큰을 받는다. $0.92로 상각된 시점에 이 토큰의 가치는 $10,000이지만, 원래 투자자보다 더 많은 토큰을 갖게 된다. $1.00으로 회복되면 토큰 가치는 $10,869이 된다.
전체 산식은 Writedown & NAV 참조.
NAV 데이터 소스와 오라클 (v3.0)
모든 풀이 Aset 오라클 Lambda로 NAV를 계산한다(v3-15). 원천 입력은 파트너 API(Joob eNote, LINE BK 리스크 대시보드 등)나 어드민 폼에서 오고, 계산식은 Aset이 적용한다. 상각 스케줄(v3-13)과 트랜치 워터폴(v3-14)도 여기 포함된다. Aset 처리를 건너뛰는 "파트너 보고 NAV" 경로는 없다.
어느 경우든 updateNAV()를 온체인에서 호출하는 주체는 Aset이다(오라클 role). NAV 하락은 24시간 타임락을 거치고, 상승은 즉시 적용된다.
동작 방식
Aset이 운영하는 오라클 서비스가 PlatformPool.updateNAV(new_nav)를 호출한다. nav_history에 PENDING 상태의 행이 생긴다. 하락이면 24시간 타임락이 지난 뒤 APPLIED가 된다. 타임락 구간 동안 어드민이 취소하면 CANCELLED가 된다.
Reserve Fund: first-loss가 아니라 상환 유동성
현재 소스의 외부 리저브 풀은 입금의 reserve_bps 몫을 reserve_wallet으로 보내고 나머지를 fund_wallet으로 보낸다. 풀 내부 리저브 잔고와 getter는 제거됐다. 리저브 비율은 보유 비율이 아니라 외부 지갑으로 보내는 비율이다. 외부 잔액이 풀의 지급 재원으로 자동 보충되지는 않는다.
손실을 흡수하지는 않는다(R8). reserve는 투자자 입금액에서 떼어낸 것이라 이미 claim NAV 가격 안에 들어 있고, 손실에서 다시 상계하면 투자자 본인 돈으로 두 번 크레딧을 주는 셈이 된다. 손실 흡수 순서는 담보 → 버퍼 → Junior → Mezzanine → Senior → NAV이고, 여기에 reserve 단계는 없다. reserve는 트랜치 그룹과도 별개다(v3-14).
동작 방식
예: $10,000 입금에 reserve_bps = 1000이면 $1,000은 reserve_wallet, $9,000은 fund_wallet으로 간다. 리저브는 손실 흡수 계층이 아니며, 외부 지갑의 자금을 상환에 쓰려면 풀에 별도 투입해야 한다.
⚠️ 런칭 시점에는 reserve_bps를 의도적으로 0으로 두므로, 단독 풀에서는 손실과 NAV 사이의 완충이 버퍼 하나뿐이다. R6가 버퍼를 고지 문구가 아니라 실제 파라미터로 바꾼 이유가 이것이다.
수익 모델
claim 기반만 쓴다. 파트너가 Pool.depositYield(gross)로 수익 USDC를 Pool에 넣는다. Aset Lambda가 오프체인에서 수수료를 계산한 뒤 Pool.settleYield(stablecoin, net, treasuryFee, poolMgmtFee)를 호출한다. 이 한 건의 트랜잭션이 net을 LP 홀더에게 크레딧하고 수수료 두 갈래를 함께 지급한다. 수익은 LP 보유량 pro-rata로 투자자별 태깅된다. 투자자는 claimYield()로 USDC를 받거나 reinvest(stablecoin, amount)로 재투자한다.
설정값: yield_frequency, allow_rollover, min_reinvest_amount. (yield_trigger는 v3-20에서 제거됐고 claim/manual만 남았다.) ⚠️ MVP에서는 재투자를 어느 화면에도 노출하지 않는다(2026-08-27, 아직 반영 안 됨, v3-151). 위의 투자자 CTA와 allow_rollover 토글이 둘 다 빠진다. 온체인 reinvest()와 POST /yield/reinvest는 남고, 경로를 닫는 것은 allow_rollover의 기본값 false다. → 05 → Reinvest V1 Policy
부분 재투자는 허용된다. claim 가능한 잔액 안에서 어떤 금액이든 되고, min_reinvest_amount 제약만 받는다. 초과 요청만 revert된다(05 → Reinvest V1 Policy). 설계상 같은 풀 전용이다. reinvest()는 그 풀에 쌓인 수익을 소비해 그 풀의 LP를 민팅하며, 풀 간 재투자는 없다(수익을 다른 데 넣으려면 claimYield()로 지갑에 받은 뒤 그 풀에 deposit()해야 한다). v3-64 참조.
Receipt NFT 없음 (v3.0)
v3.0에서 입금은 atomic이다. USDC 이동, LP 민팅, fund_wallet 분리가 한 트랜잭션 안에서 일어난다. LP 토큰 자체가 입금 증빙이다. PlatformReceiptNFT 컨트랙트는 제거됐다.
과거 Fund Pool의 레거시 receipt 레코드는 DB에 남아 있지만, 새로 민팅되는 receipt는 없다.
KYC / Soulbound 토큰
KYC/KYB는 SumSub로 연동한다. 승인되면 전송 불가 ERC-721(PlatformKYCSoulbound)이 온체인에 민팅된다. 투자하려면 반드시 있어야 한다.
풀별 게이팅은 kyc_level_required(개인은 KYC, 법인은 KYB)와 jurisdiction_whitelist(ISO 국가 코드)로 한다. 화이트리스트가 비어 있으면 모든 관할을 허용한다는 뜻이다.
KYC & 신원 참조.
리스크 투명성
1~5 같은 숫자 리스크 등급은 쓰지 않는다. 정밀해 보이지만 근거가 없고 법적 책임이 따라온다. 대신 투명한 데이터 항목을 제공한다. 리스크 신호는 collateral_description, collateral_ratio, category, reserve_bps, nav_per_token, apy_rate, apy_disclosure, lockup_days, penalty_type, tranche_role(v3-14), 풀 운영 기간이다. 리스크 판단은 투자자가 직접 한다.
risk_tier enum과 collateral_type enum은 폐기됐다. collateral_type은 자유 입력 collateral_description과 선택값 collateral_ratio로 대체됐다.
비수탁 아키텍처
투자자 자금은 전부 Pool 스마트 컨트랙트를 통해 흐른다. Aset은 operator 역할을 가지고 pause(), updateNAV() 같은 함수를 호출할 수 있지만 투자자 자금을 보관하지 않는다. VASP 라이선스가 필요 없다(MiCA의 15만 유로 자본금 요건 회피).
자금이 있는 위치:
- 입금 → Pool 컨트랙트(reserve와 fund_wallet으로 atomic 분리)
- Reserve → Pool 컨트랙트(기본 10%)
- 펀드 자본(파트너 잔여분,
amount − reserve) →fund_wallet(파트너가 통제하며 Aset 트레저리가 아니다. v3-26에 따라 모든 풀이 fund에 연결된다) - 수익(claim 전) → Pool 컨트랙트
- 수익(claim 후) → 투자자 지갑
- 상환 → Pool 컨트랙트 → 투자자
Wind-Down 회수 한계
파트너가 응답하지 않게 되면 온체인에서 회수할 수 있는 것은 Pool 컨트랙트가 이미 들고 있는 몫뿐이다. 보통 reserve(약 10%)와, 그전에 파트너에게서 회수해 둔 자본(totalEpochTopUp) 정도인데 후자는 응답 없는 파트너가 넣었을 가능성이 낮다. fund_wallet에 있는 파트너 잔여분은 파트너가 통제하므로 회수하려면 오프체인 법적 절차가 필요하다. 풀 모델 → 긴급 Wind-Down 참조.
KYC 거부 기준
SumSub가 거부 사유 코드에 따라 자동 판정하고, 그 결과가 RETRY 또는 FINAL로 매핑된다. RETRY는 사진 흐림, 빛 반사, 신분증 잘림, 만료 서류, 이름 불일치 같은 경우이고 재시도 횟수 제한이 없다. FINAL은 제재 대상 국가(OFAC/EU), 사기 탐지, 미성년, 중복 신청자이며 어드민이 뒤집을 수 없다.
v3.0에서 제거된 것
pool_typeenum(AS_POOL/FUND_POOL): 차원으로 대체escrow_modelenum: 항상 SMART_CONTRACTyield_distribution_modelenum: 항상 MANUAL_CLAIMlp_issuance_modelenum: 항상 PLATFORM_ISSUEDPlatformReceiptNFT컨트랙트: LP가 입금 증빙- D+7 환불 메커니즘: 입금이 atomic이라 불필요
collateral_typeenum:collateral_description+collateral_ratio로 대체