Appearance
Database Schema Overview
Aset database — Supabase (PostgreSQL 15+) with RLS (Row-Level Security). v2.19 · 30 tables · 26 enums · 2 views
🔐 Authentication (3 tables)
ℹ️ Investor-Side Schema
Authentication tables (users, auth_nonces, wallets) are Investor-side schema. Admin backend schema starts from Admin Management section below.
👤 users
| Column | Type |
|---|---|
id | UUID PK |
email | TEXT NOT NULL UNIQUE |
role | user_role DEFAULT 'GUEST' |
investor_tier | investor_tier |
sumsub_applicant_id | TEXT UNIQUE |
kyc_level | kyc_level |
kyc_status | kyc_status DEFAULT 'NOT_STARTED' |
sbt_status | sbt_status DEFAULT 'NOT_MINTED' |
sbt_tx_hash | TEXT |
sbt_token_id | INTEGER |
sbt_error | TEXT |
country | TEXT |
risk_level | TEXT |
company_name | TEXT |
company_registration_number | TEXT |
company_country | TEXT |
created_at | TIMESTAMPTZ DEFAULT now() |
updated_at | TIMESTAMPTZ DEFAULT now() |
🔑 auth_nonces
| Column | Type |
|---|---|
id | UUID PK |
wallet_address | TEXT NOT NULL UNIQUE |
nonce | TEXT NOT NULL UNIQUE |
expires_at | TIMESTAMPTZ NOT NULL |
used_at | TIMESTAMPTZ |
created_at | TIMESTAMPTZ DEFAULT now() |
💳 wallets
| Column | Type |
|---|---|
id | UUID PK |
user_id | FK → users (CASCADE) |
address | TEXT NOT NULL |
chain_id | chain_id NOT NULL |
label | TEXT |
created_at | TIMESTAMPTZ DEFAULT now() |
UNIQUE(address, chain_id)
🛡️ Admin Management (3 tables)
👤 admin_users
| Column | Type |
|---|---|
id | UUID PK |
email | TEXT NOT NULL UNIQUE |
name | TEXT |
avatar_url | TEXT |
wallet_address | TEXT |
role | admin_role DEFAULT 'OPERATOR' |
invite_code | TEXT UNIQUE |
invited_by | FK → admin_users.id |
last_active_at | TIMESTAMPTZ |
deleted_at | TIMESTAMPTZ (soft delete) |
created_at | TIMESTAMPTZ DEFAULT now() |
updated_at | TIMESTAMPTZ DEFAULT now() |
password_hash | TEXT |
auth_method | TEXT DEFAULT 'GOOGLE_OAUTH' |
Auth
Google OAuth or password. First admin seeded via env/DB.
🔒 admin_user_permissions
| Column | Type |
|---|---|
admin_user_id | FK → admin_users (CASCADE) |
page_key | TEXT NOT NULL |
granted | BOOLEAN DEFAULT false |
granted_by | FK → admin_users.id |
granted_at | TIMESTAMPTZ DEFAULT now() |
PK(admin_user_id, page_key). Operators only; Admins have full access.
🖥️ admin_sessions
| Column | Type |
|---|---|
id | UUID PK |
admin_user_id | FK → admin_users (CASCADE) |
device_info | TEXT |
ip_address | INET |
is_current | BOOLEAN DEFAULT false |
last_seen_at | TIMESTAMPTZ DEFAULT now() |
created_at | TIMESTAMPTZ DEFAULT now() |
🏢 Fund Management (3 tables)
🏦 funds
| Column | Type |
|---|---|
id | UUID PK |
name | TEXT NOT NULL |
verified | BOOLEAN DEFAULT false |
description | TEXT |
established | SMALLINT |
total_originated | NUMERIC DEFAULT 0 |
website_url | TEXT |
logo_url | TEXT |
primary_contact_name | TEXT |
primary_contact_email | TEXT |
status | fund_status DEFAULT 'ACTIVE' |
notification_health | TEXT DEFAULT 'HEALTHY' |
created_at | TIMESTAMPTZ DEFAULT now() |
updated_at | TIMESTAMPTZ DEFAULT now() |
👥 fund_members
| Column | Type |
|---|---|
id | UUID PK |
fund_id | FK → funds (CASCADE) |
wallet_address | TEXT |
email | TEXT NOT NULL |
is_primary | BOOLEAN DEFAULT false |
name | TEXT |
status | TEXT DEFAULT 'ACTIVE' |
joined_at | TIMESTAMPTZ DEFAULT now() |
created_at | TIMESTAMPTZ DEFAULT now() |
UNIQUE(fund_id, wallet_address), UNIQUE(fund_id, email)
📨 fund_invites
| Column | Type |
|---|---|
id | UUID PK |
fund_id | FK → funds (CASCADE) |
email | TEXT NOT NULL |
invite_code | TEXT NOT NULL UNIQUE |
invited_by | FK → admin_users.id |
status | TEXT DEFAULT 'PENDING' |
accepted_at | TIMESTAMPTZ |
expires_at | TIMESTAMPTZ DEFAULT now() + 7 days |
created_at | TIMESTAMPTZ DEFAULT now() |
UNIQUE(fund_id, email)
🏊 Pools (8 tables)
🏊 pools
| Column | Type |
|---|---|
id | UUID PK |
fund_id | FK → funds.id |
name | TEXT NOT NULL |
description | TEXT |
pool_type | pool_type |
lifecycle_status | lifecycle_status DEFAULT 'DRAFT' |
is_paused | BOOLEAN DEFAULT false |
investment_blocked | BOOLEAN DEFAULT false |
category | TEXT NOT NULL → FK pool_categories(name) |
issuer | TEXT |
capacity | NUMERIC DEFAULT 0 |
min_investment | NUMERIC NOT NULL |
apy_rate | NUMERIC NOT NULL |
term | TEXT DEFAULT '' |
investor_tier | investor_tier |
asset_count | INTEGER DEFAULT 0 |
chain_id | chain_id NOT NULL |
accepted_currencies | currency[] DEFAULT '{USDC}' |
lp_issuance_model | lp_issuance_model DEFAULT 'PLATFORM_ISSUED' |
reserve_percentage | NUMERIC DEFAULT 10.00 |
lockup_days | INTEGER DEFAULT 0 |
lockup_label | TEXT DEFAULT '' |
maturity_days | INTEGER |
penalty_type | penalty_type DEFAULT 'NO_EARLY' |
penalty_fee_amount | NUMERIC |
penalty_rate | NUMERIC |
standard_redemption_days | INTEGER DEFAULT 7 |
redemption_notes | TEXT |
collateral_type | collateral_type DEFAULT 'FULLY_COLLATERALIZED' |
collateral_ratio | NUMERIC |
yield_frequency | TEXT DEFAULT 'MONTHLY' |
yield_trigger | TEXT DEFAULT 'AUTO' |
allow_rollover | BOOLEAN DEFAULT false |
min_reinvest_amount | NUMERIC DEFAULT 50 |
next_yield_due | TIMESTAMPTZ |
yield_overdue | BOOLEAN DEFAULT false |
start_date | DATE |
end_date | DATE |
display_after_close | BOOLEAN DEFAULT true |
published_at | TIMESTAMPTZ |
tvl | NUMERIC DEFAULT 0 |
nav_per_token | NUMERIC NOT NULL |
has_pending_nav_update | BOOLEAN DEFAULT false |
total_yield_distributed | NUMERIC DEFAULT 0 |
investor_count | INTEGER DEFAULT 0 |
last_nav_update | TIMESTAMPTZ |
avg_asset_size | NUMERIC |
avg_tenor | TEXT |
historical_default_rate | NUMERIC |
pool_address | TEXT |
escrow_address | TEXT |
receipt_address | TEXT |
lp_token_address | TEXT |
pool_wallet | TEXT |
signing_method | TEXT DEFAULT 'SINGLE_SIG' |
deploy_status | TEXT DEFAULT 'NOT_DEPLOYED' |
deploy_error | TEXT |
deploy_tx_hash | TEXT |
operating_currency | TEXT |
fx_rate | NUMERIC |
supported_chains | INTEGER[] DEFAULT '{8453}' |
primary_chain_id | INTEGER DEFAULT 8453 |
deleted_at | TIMESTAMPTZ (soft delete) |
created_at | TIMESTAMPTZ DEFAULT now() |
updated_at | TIMESTAMPTZ DEFAULT now() |
Constraints
nav_per_token_range: nav_per_token > 0 AND nav_per_token <= 1.0chk_start_before_end: end_date IS NULL OR start_date IS NULL OR start_date < end_date
Accepted Currencies
Stored as pools.accepted_currencies (a currency[] array), not a junction table. Default: '{USDC}'. Valid values: USDC, USDT, DAI.
🏷️ pool_categories
| Column | Type |
|---|---|
id | UUID PK |
name | TEXT NOT NULL UNIQUE |
created_at | TIMESTAMPTZ DEFAULT now() |
🔗 fund_pool_assignments
| Column | Type |
|---|---|
fund_id | FK → funds (CASCADE) |
pool_id | FK → pools (CASCADE) |
assigned_at | TIMESTAMPTZ DEFAULT now() |
PK(fund_id, pool_id)
🌐 pool_chain_deployments
| Column | Type |
|---|---|
id | UUID PK |
pool_id | FK → pools (CASCADE) |
chain_id | INTEGER NOT NULL |
pool_contract_address | TEXT |
lp_token_address | TEXT |
operator_wallet | TEXT |
reserve_balance | NUMERIC DEFAULT 0 |
total_deposited | NUMERIC DEFAULT 0 |
is_active | BOOLEAN DEFAULT true |
deployed_at | TIMESTAMPTZ DEFAULT now() |
created_at | TIMESTAMPTZ DEFAULT now() |
updated_at | TIMESTAMPTZ DEFAULT now() |
UNIQUE(pool_id, chain_id)
📈 pool_tvl_history
| Column | Type |
|---|---|
id | UUID PK |
pool_id | FK → pools (CASCADE) |
tvl | NUMERIC NOT NULL |
recorded_at | TIMESTAMPTZ DEFAULT now() |
IDX: pool_id, recorded_at DESC
🧩 pool_asset_compositions
| Column | Type |
|---|---|
id | UUID PK |
pool_id | FK → pools (CASCADE) |
label | TEXT NOT NULL |
percentage | NUMERIC NOT NULL |
Constraints
CHK: percentage >= 0 AND percentage <= 100
📄 pool_documents
| Column | Type |
|---|---|
id | UUID PK |
pool_id | FK → pools (CASCADE) |
name | TEXT NOT NULL |
type | document_type NOT NULL |
size | TEXT |
storage_url | TEXT |
docusign_view_url | TEXT |
created_at | TIMESTAMPTZ DEFAULT now() |
📦 underlying_assets
| Column | Type |
|---|---|
id | UUID PK |
pool_id | FK → pools (CASCADE) |
category | TEXT |
external_asset_id | TEXT |
borrower_name | TEXT |
principal_value | NUMERIC |
maturity_date | TIMESTAMPTZ |
status | asset_status DEFAULT 'ACTIVE' |
last_synced_at | TIMESTAMPTZ |
💰 Deposits (1 table)
💰 deposits
| Column | Type |
|---|---|
id | UUID PK |
receipt_code | TEXT NOT NULL UNIQUE |
user_id | FK → users.id |
wallet_id | FK → wallets.id |
pool_id | FK → pools.id |
amount | NUMERIC NOT NULL |
is_reinvestment | BOOLEAN DEFAULT false |
refund_eligible_at | TIMESTAMPTZ |
matched_at | TIMESTAMPTZ |
investor_address | TEXT |
currency | TEXT DEFAULT 'USDC' |
status | deposit_status DEFAULT 'PENDING' |
received_at | TIMESTAMPTZ |
receipt_issued_at | TIMESTAMPTZ |
receipt_tx_hash | TEXT |
fm_notified_at | TIMESTAMPTZ |
lp_minted_at | TIMESTAMPTZ |
lp_mint_tx_hash | TEXT |
receipt_burned_at | TIMESTAMPTZ |
receipt_burn_tx_hash | TEXT |
escrow_status | TEXT DEFAULT 'HELD' |
receipt_token_id | TEXT |
tx_hash | TEXT |
chain_id | INTEGER DEFAULT 8453 |
failure_type | TEXT |
error_message | TEXT |
created_at | TIMESTAMPTZ DEFAULT now() |
updated_at | TIMESTAMPTZ |
IDX: pool_id, user_id, wallet_id, status, investor_address, refund_eligible_at (partial)
💼 Portfolio (1 table)
💼 portfolio_positions
| Column | Type |
|---|---|
id | UUID PK |
user_id | FK → users.id |
pool_id | FK → pools.id |
tokens | NUMERIC NOT NULL |
effective_value | NUMERIC NOT NULL |
accrued_yield | NUMERIC DEFAULT 0 |
invested_at | TIMESTAMPTZ NOT NULL |
created_at | TIMESTAMPTZ DEFAULT now() |
updated_at | TIMESTAMPTZ DEFAULT now() |
UNIQUE(user_id, pool_id)
🔄 Redemptions (1 table)
🔄 redemption_requests
| Column | Type |
|---|---|
id | UUID PK |
user_id | FK → users.id |
pool_id | FK → pools.id |
position_id | FK → portfolio_positions.id |
amount | NUMERIC NOT NULL |
payout_amount | NUMERIC |
penalty_amount | NUMERIC DEFAULT 0 |
nav_at_request | NUMERIC |
investor_address | TEXT |
lp_tokens_amount | NUMERIC |
status | redemption_status DEFAULT 'REQUESTED' |
transfer_source | transfer_source DEFAULT 'PLATFORM' |
tx_hash | TEXT |
payout_tx_hash | TEXT |
on_chain_request_id | TEXT |
requested_at | TIMESTAMPTZ DEFAULT now() |
fm_notified_at | TIMESTAMPTZ |
fm_accepted_at | TIMESTAMPTZ |
contract_validated_at | TIMESTAMPTZ |
auto_released_at | TIMESTAMPTZ |
admin_id | FK → admin_users.id |
admin_decided_at | TIMESTAMPTZ |
rejection_reason | TEXT |
funding_status | TEXT DEFAULT 'FUNDED' |
funding_shortfall | NUMERIC |
funding_deadline | TIMESTAMPTZ |
lp_burned_at | TIMESTAMPTZ |
completed_at | TIMESTAMPTZ |
failure_type | TEXT |
error_message | TEXT |
created_at | TIMESTAMPTZ DEFAULT now() |
updated_at | TIMESTAMPTZ |
IDX: pool_id, user_id, position_id, status, investor_address
📊 Yield (3 tables)
📊 yield_distributions
| Column | Type |
|---|---|
id | UUID PK |
pool_id | FK → pools.id |
total_amount | NUMERIC NOT NULL |
distributed_by | FK → admin_users.id |
distributed_at | TIMESTAMPTZ DEFAULT now() |
distribution_type | TEXT DEFAULT 'MANUAL' |
apy_rate | NUMERIC |
period_start | TIMESTAMPTZ |
period_end | TIMESTAMPTZ |
status | yield_status DEFAULT 'PENDING' |
period | TEXT |
investor_count | INTEGER DEFAULT 0 |
tx_hash | TEXT |
fm_notified_at | TIMESTAMPTZ |
tx_submitted_at | TIMESTAMPTZ |
claimed_at | TIMESTAMPTZ |
failure_type | TEXT |
error_message | TEXT |
created_at | TIMESTAMPTZ DEFAULT now() |
updated_at | TIMESTAMPTZ |
IDX: pool_id, status
📊 yield_distribution_investors
| Column | Type |
|---|---|
id | UUID PK |
distribution_id | FK → yield_distributions (CASCADE) |
user_id | UUID |
investor_address | TEXT |
investor_name | TEXT |
share_percentage | NUMERIC |
amount | NUMERIC NOT NULL |
tx_hash | TEXT |
status | yield_status DEFAULT 'PENDING' |
claimed_at | TIMESTAMPTZ |
claim_tx_hash | TEXT |
claim_type | TEXT |
reinvest_lp_amount | NUMERIC |
created_at | TIMESTAMPTZ DEFAULT now() |
IDX: distribution_id, user_id
💎 yield_claims
| Column | Type |
|---|---|
id | UUID PK |
user_id | FK → users.id |
pool_id | FK → pools.id |
position_id | FK → portfolio_positions.id |
amount | NUMERIC NOT NULL |
status | TEXT DEFAULT 'PENDING' |
tx_hash | TEXT |
failure_type | TEXT |
error_message | TEXT |
created_at | TIMESTAMPTZ DEFAULT now() |
completed_at | TIMESTAMPTZ |
updated_at | TIMESTAMPTZ DEFAULT now() |
IDX: user_id, pool_id
📊 NAV History (1 table)
📊 nav_history
| Column | Type |
|---|---|
id | UUID PK |
pool_id | FK → pools.id |
old_nav | NUMERIC NOT NULL |
new_nav | NUMERIC NOT NULL |
source | TEXT DEFAULT 'admin_override' |
proposed_by | FK → admin_users.id |
proposed_at | TIMESTAMPTZ DEFAULT now() |
effective_at | TIMESTAMPTZ NOT NULL |
status | nav_update_status DEFAULT 'PENDING' |
reason | TEXT |
Constraints
nav_positive: new_nav > 0nav_max: new_nav <= 1.0
IDX: pool_id, status
🪪 KYC / Identity (1 table)
🪪 kyc_logs
| Column | Type |
|---|---|
id | UUID PK |
user_id | FK → users (CASCADE) |
provider_id | TEXT |
status_result | TEXT NOT NULL |
risk_score | NUMERIC |
reviewed_at | TIMESTAMPTZ DEFAULT now() |
reject_type | reject_type |
reject_reason | TEXT |
IDX: user_id
🔔 Notifications (2 tables)
🔔 notification_logs
| Column | Type |
|---|---|
id | UUID PK |
recipient_type | recipient_type NOT NULL |
recipient_id | TEXT NOT NULL |
recipient_name | TEXT |
event_type | TEXT NOT NULL |
channel | notification_channel DEFAULT 'EMAIL' |
status | notification_status DEFAULT 'DELIVERED' |
failure_type | notification_failure_type |
error_message | TEXT |
retry_count | INTEGER DEFAULT 0 |
notification_content | TEXT |
related_entity_type | TEXT |
related_entity_id | UUID |
delivered_at | TIMESTAMPTZ |
created_at | TIMESTAMPTZ DEFAULT now() |
IDX: status (partial on FAILED), recipient_type + recipient_id, related_entity_type + related_entity_id
⚙️ notification_preferences
| Column | Type |
|---|---|
user_type | TEXT NOT NULL |
user_id | UUID NOT NULL |
category | TEXT NOT NULL |
email_enabled | BOOLEAN DEFAULT true |
PK(user_type, user_id, category)
⚡ Platform Config & Activity (3 tables)
⚙️ platform_config
| Column | Type |
|---|---|
key | TEXT PK |
value | TEXT NOT NULL |
updated_by | FK → admin_users.id |
updated_at | TIMESTAMPTZ DEFAULT now() |
📋 activity_events
| Column | Type |
|---|---|
id | UUID PK |
event_type | TEXT NOT NULL |
description | TEXT NOT NULL |
status_badge | TEXT NOT NULL |
actor_id | UUID |
metadata | JSONB |
related_entity_type | TEXT |
related_entity_id | UUID |
created_at | TIMESTAMPTZ DEFAULT now() |
IDX: created_at DESC, related_entity_type + related_entity_id
🪙 stablecoin_registry
| Column | Type |
|---|---|
id | UUID PK |
chain_id | INTEGER NOT NULL |
symbol | TEXT NOT NULL |
contract_address | TEXT NOT NULL |
decimals | INTEGER DEFAULT 6 |
is_active | BOOLEAN DEFAULT true |
UNIQUE(chain_id, symbol)
Enums Reference
v2.19 schema — 26 enum types.
| Enum | Values | Notes |
|---|---|---|
admin_role | OPERATOR, ADMIN, SUPER_ADMIN, FUND_MANAGER | |
asset_status | ACTIVE, SETTLED, OVERDUE | |
chain_id | 8217, 8453, 11155111, 84532 | Kaia, Base, Sepolia, Base Sepolia |
collateral_type | FULLY_COLLATERALIZED, PARTIALLY_COLLATERALIZED, UNSECURED | |
currency | USDC, USDT, DAI | |
deposit_status | PENDING, PROCESSING, COMPLETED, REFUNDED, FAILED | |
document_type | PPM, SUBSCRIPTION, AUDIT, RISK_DISCLOSURE | |
fund_status | ACTIVE, INACTIVE | |
investor_tier | ACCREDITED, QP | |
kyc_level | INDIVIDUAL, INSTITUTION | |
kyc_status | NOT_STARTED, IN_REVIEW, APPROVED, REJECTED | |
lifecycle_status | DRAFT, UPCOMING, ACTIVE, CLOSED, MATURED | |
lp_issuance_model | PLATFORM_ISSUED, FUND_ISSUED | |
nav_update_status | PENDING, APPLIED | |
notification_channel | ||
notification_failure_type | BOUNCED, SPAM_FILTERED, SERVER_ERROR, TIMEOUT, INVALID_RECIPIENT, RATE_LIMITED | |
notification_status | SENDING, DELIVERED, FAILED | |
penalty_type | YIELD_BASED, PRINCIPAL_BASED, NO_EARLY, FLAT_FEE | |
pool_type | AS_POOL, FUND_POOL | |
recipient_type | ADMIN, FM, INVESTOR | |
redemption_status | REQUESTED, FM_ACCEPTED, PROCESSING, COMPLETED, FAILED | |
reject_type | RETRY, FINAL | |
sbt_status | NOT_MINTED, MINTED, FAILED | |
transfer_source | PLATFORM, FUND | |
user_role | GUEST, INVESTOR | |
yield_status | PENDING, PROCESSING, DISTRIBUTED, FAILED |
Views
dashboard_alert_counts
sql
SELECT
COUNT(*) FROM notification_logs WHERE status = 'FAILED' AS failed_notifications,
COUNT(*) FROM users WHERE sbt_status = 'FAILED' AS sbt_mint_failed,
COUNT(*) FROM deposits WHERE status = 'FAILED' AS failed_deposits,
COUNT(*) FROM redemption_requests WHERE status = 'FAILED' AS failed_redemptions,
COUNT(*) FROM yield_distributions WHERE status = 'FAILED' AS failed_yield,
COUNT(*) FROM users WHERE kyc_status IN ('NOT_STARTED', 'IN_REVIEW') AS kyc_pending,
COUNT(*) FROM redemption_requests WHERE status = 'REQUESTED' AS pending_redemptions,
COUNT(*) FROM yield_distributions WHERE status = 'PENDING' AS pending_yield;platform_stats
sql
SELECT
COALESCE(SUM(tvl), 0) AS total_tvl,
COALESCE(SUM(total_yield_distributed), 0) AS total_yield,
COALESCE(SUM(investor_count), 0) AS total_investors
FROM pools
WHERE lifecycle_status = 'ACTIVE';Data Types Reference
| Type | Description |
|---|---|
PK | Primary Key — Unique ID, no duplicates |
FK | Foreign Key — Links to another table's PK |
UUID | Unique ID — Random 128-bit, globally unique |
ENUM | Fixed Options — Only predefined values |
TEXT | Variable-length string |
NUMERIC | Precise Number — Exact, used for money |
BOOLEAN | True / False flag |
TIMESTAMPTZ | Date + Time with timezone |
INTEGER | Whole Number — No decimals |
SMALLINT | Small Whole Number — 2 bytes |
JSONB | JSON Binary — Structured data, queryable |
INET | IP Address — IPv4 or IPv6 |
DATE | Date Only — No time component |
Relationship Map
users<-1:N->walletsusers<-1:N->kyc_logsusers<-1:N->depositsusers<-1:N->portfolio_positionsusers<-1:N->redemption_requestsusers<-1:N->yield_claimsadmin_users<-1:N->admin_user_permissionsadmin_users<-1:N->admin_sessionsadmin_users<-1:N->fund_invites(invited_by)funds<-1:N->fund_membersfunds<-1:N->fund_invitesfunds<-M:N->pools(viafund_pool_assignments)pools<-FK->funds(fund_id)pools<-FK->pool_categories(category → name)pools<-1:N->pool_chain_deploymentspools<-1:N->pool_tvl_historypools<-1:N->pool_asset_compositionspools<-1:N->pool_documentspools<-1:N->underlying_assetspools<-1:N->nav_historypools<-1:N->depositspools<-1:N->portfolio_positionspools<-1:N->redemption_requestspools<-1:N->yield_distributions<-1:N->yield_distribution_investorspools<-1:N->yield_claimsportfolio_positions<-1:N->redemption_requests(position_id)portfolio_positions<-1:N->yield_claims(position_id)yield_distributions<-N:1->admin_users(distributed_by)redemption_requests<-N:1->admin_users(admin_id)admin_users<-1:N->activity_events(actor_id)auth_nonces— standalone (SIWE authentication)notification_logs— standalone (polymorphic recipient)notification_preferences— standalone (polymorphic user)platform_config<-N:1->admin_users(updated_by)stablecoin_registry— standalone
Current Version
v2.19 — 30 tables · 26 enums · 2 views