Skip to content

Core Concepts โ€‹

Foundational models and mechanisms that define how Aset works. Items with ๐ŸŸก BD or ๐ŸŸ  PD badges have open decisions โ€” see Decisions.

๐ŸŠ Pool Type (AS_POOL vs FUND_POOL)

Two pool architectures. AS_POOL โ€” Aset manages deposits via Pool Smart Contract, auto-mints LP (PLATFORM_ISSUED), no receipt token. FUND_POOL โ€” Investor deposits into Pool Contract, receives receipt token; FM reviews and calls mintLP() (FUND_ISSUED), receipt burned.

How it works

AS_POOL: USDC โ†’ Pool Smart Contract โ†’ auto LP mint (PLATFORM_ISSUED, no receipt) โ†’ deposit split: (amount ร— (1 - reserve_%)) โ†’ Pool Wallet, remainder stays in contract as reserve. FUND_POOL: USDC โ†’ Pool Smart Contract โ†’ receipt token minted โ†’ FM notified โ†’ FM calls mintLP() โ†’ receipt burned โ†’ deposit split to Fund Wallet + reserve. D+7 safety: if LP not minted within 7 days, auto-refund triggers.

๐Ÿ”€ LP Issuance Model

Two modes: FUND_ISSUED โ€” the fund mints its own LP token; Platform verifies receipt via RPC. PLATFORM_ISSUED โ€” Platform deploys and mints the LP token on the fund's behalf. AS Pools default to PLATFORM_ISSUED; Fund Pools default to FUND_ISSUED.

How it works

FUND_ISSUED: deposit received โ†’ FM notified (fm_notified_at) โ†’ FM mints LP โ†’ Aset verifies โ†’ lp_minted_at โ†’ receipt burned. PLATFORM_ISSUED: deposit received โ†’ platform auto-mints LP (lp_minted_at) โ†’ receipt burned โ†’ COMPLETED. No FM action needed.

๐Ÿ’ฐ NAV Token Pricing ยท ๐ŸŸก BD3

LP token price floats between $0.00โ€“$1.00 (no floor). Token price IS the loss indicator โ€” no separate PF multiplier. New investors pay the current NAV (fair entry). Investment always stays open โ€” never auto-blocked. tokens_minted = deposit / nav_per_token.

How it works

Deposit $10,000 when NAV = $0.92 โ†’ you receive 10,000 / 0.92 = 10,869 tokens. At writedown to $0.92 your tokens are worth $10,000 but you get more tokens than original investors. On recovery to $1.00 your tokens are worth $10,869.

๐Ÿ”ฎ Oracle-Driven NAV Updates ยท ๐ŸŸ  Oracle Contract

Fund operator calculates NAV off-chain โ†’ reports to oracle endpoint โ†’ oracle validates and posts updateNAV() on PlatformPool โ†’ NAV decreases enter 24h timelock, increases apply immediately. No safety bounds (PD6 removed).

How it works

Operator submits NAV off-chain โ†’ oracle validates and calls updateNAV() on PlatformPool โ†’ if decrease: enters 24h pending queue โ†’ after timelock: nav_per_token updated on-chain. NAV increases skip the queue and apply immediately.

๐Ÿ›ก๏ธ Reserve Fund ยท ๐ŸŸก BD4

Proposed: 10% of pool deposits allocated as first-loss reserve. Covers losses before NAV drops below $1.00. Open questions: per-pool vs platform-wide %, how reserve is funded (upfront vs accrued), what triggers payout vs writedown.

How it works

Fund operator sets a reserve % at pool creation โ†’ reserve absorbs loss first โ†’ NAV only drops once reserve is exhausted. Proposed: 10% of pool deposits allocated to reserve at creation time (not accrued over time). Reserve payout vs writedown trigger is an open question (BD4).

๐Ÿ“ˆ Yield Model ยท โœ… Decided

Claim-based only (MANUAL_CLAIM). DISTRIBUTING deprecated โ€” not DeFi standard, high gas cost. Fund/FM deposits yield USDC into Pool Smart Contract. Yield tagged per investor (pro-rata by LP holdings). Investor calls claimYield() โ†’ USDC to wallet, or reinvest(fullYield) โ†’ new LP minted (lockup exempt).

Settings: yield_frequency (MONTHLY/QUARTERLY/CUSTOM), yield_trigger (AUTO/MANUAL), allow_rollover, min_reinvest_amount (pool config, default $50 or min_investmentร—50% whichever lower). V1: full reinvest only (no partial). Same-pool only. Cross-pool reinvest is V2.

โ†’ Full Reinvest V1 policy in Investment Lifecycle

How it works

Fund deposits yield USDC โ†’ Pool Smart Contract โ†’ tagged per investor (pro-rata by LP) โ†’ investor calls claimYield() โ†’ USDC to wallet. Or reinvest(fullYield) โ†’ yield re-deposited into same pool โ†’ new LP minted. V1: full amount only (no partial). Reinvest requires yield โ‰ฅ min_reinvest_amount. Overdue tracking: if now > next_yield_due โ†’ yield_overdue = true โ†’ alert admin + investors. Aset never touches yield โ€” contract is custodian.

๐Ÿ” Escrow Model ยท Deprecated

Always SMART_CONTRACT. MULTI_SIG and NO_ESCROW no longer apply under the non-custodial architecture โ€” all funds flow through Pool Smart Contract. Multi-sig is still relevant for contract governance (e.g., who can call pausePool()) but that's a separate concern deferred to Security Architecture doc.

๐Ÿ’ธ Yield Distribution Model ยท Deprecated

Always MANUAL_CLAIM. DISTRIBUTING dropped โ€” not industry standard, high gas cost (N transactions per distribution), fails on rejecting wallets. All major RWA platforms (Ondo, Centrifuge, Maple) use claim-based yield. Claim-based enables one-click reinvest() natively.

๐ŸŽซ Receipt Token (ERC-721)

Proof-of-deposit NFT minted when investor deposits to escrow. Tracks status: MINTED โ†’ LP_PENDING โ†’ LP_VERIFIED or โ†’ REFUNDED. Not the LP token โ€” just a receipt. Burned when investment fully settles.

๐Ÿชช KYC / Soulbound Token

SumSub integration for KYC/KYB. On approval, a non-transferable ERC-721 (Soulbound Token) is minted on-chain. kyc_status = APPROVED required before any investment. โ“ Open: what happens if KYC is revoked โ€” can investor still redeem?

๐Ÿ“Š Risk Transparency

No numeric risk rating (1โ€“5) โ€” false precision + legal liability. Instead: transparent data points. Risk signals: collateral_type (FULLY / PARTIALLY / UNSECURED), collateral_ratio, category, reserve_percentage, nav_per_token, apy_rate, lockup_days, penalty_type, pool_type, lp_issuance_model, pool age. Investors assess risk themselves.

How it works

Risk data points: collateral_type (FULLY_COLLATERALIZED / PARTIALLY_COLLATERALIZED / UNSECURED), collateral_ratio, category, reserve_percentage, nav_per_token, apy_rate, lockup_days, penalty_type, pool_type, lp_issuance_model, pool age. Why: numeric ratings = false precision + legal liability. risk_tier enum deprecated. Investor-facing "Risk Profile" card shows all data points on Pool Detail page. No aggregated score.

๐Ÿฆ Non-Custodial Architecture

All investor funds flow through Pool Smart Contracts. Aset has an operator role (can call functions like pausePool()) but never holds investor funds. No VASP license required (โ‚ฌ150K MiCA capital threshold avoided). Where funds live: Deposit โ†’ Pool Contract, Reserve โ†’ Pool Contract, Fund capital โ†’ Pool/Fund Wallet, Yield (pre-claim) โ†’ Pool Contract, Yield (post-claim) โ†’ Investor wallet, Redemption โ†’ Pool Contract โ†’ Investor.

How it works

Aset is a facilitator, never a custodian. Industry standard for RWA platforms (Ondo, Centrifuge, Maple). Smart contract governance (multi-sig for privileged functions) is a separate concern deferred to Security Architecture doc.

๐Ÿšซ KYC Rejection Criteria

Sumsub auto-decides based on rejection reason code โ†’ mapped to RETRY or FINAL. RETRY: blurry photo, glare, cropped ID, expired doc, name mismatch, wrong doc type โ€” no limit on retries. FINAL: sanctioned country (OFAC/EU), fraud detected, underage, duplicate applicant โ€” admin cannot override.

How it works

Sumsub webhook fires with rejection reason โ†’ system maps reason code to reject_type (RETRY or FINAL) โ†’ RETRY: investor prompted to re-upload, unlimited attempts. FINAL: account permanently blocked from investing, admin can view but not override (compliance requirement).