Concepts, value, and typical clone scenarios — less code.
Concepts, value, and typical clone scenarios — less code.
Preparing Ring content
Preparing Ring content
Preparing Ring content
Ring awards credit balance units (credit.creditUnitLabel, e.g. points on ring-platform.org) when users complete real contribution. Credits are platform utility (spendable for store, membership, generative media) — not speculative crypto. Earn rules are deterministic, capped, and auditable.
Write path: ring-config.json → credit.rewards
{
"credit": {
"creditUnitLabel": "points",
"creditBalanceUnitToMainCurrency": 1,
"rewards": {
"minRole": "subscriber",
"multipliers": { "subscriber": 1, "member": 1.5, "confidential": 2 },
"dailyEarnCap": { "subscriber": 50, "member": 100, "confidential": 150 },
"events": {
"adminVerify": { "amount": "50", "enabled": true, "idempotencyMode": "once_per_user" },
"commentCreated": { "amount": "2", "idempotencyMode": "once_per_object" }
}
}
}
}Read fallback order (migration): credit.rewards.events → credit.creditAddEvents → credits.rewards.events.
| Mode | Key | Use |
|---|---|---|
once_per_user | credit_add_event:{trigger}:{userId} | Profile fields, KYC, completion bonus |
once_per_object | …:{objectType}:{objectId} | Comments, reviews, approved news |
Unique index on credit_add_events.idempotency_key prevents races.
Final award = floor(base × multiplier) (minimum 1 if base ≥ 1). Daily cap is UTC calendar day; if the award would exceed remaining budget, the entire award is skipped (skip_reason: daily_cap) — never partial-minted.
Visitors earn nothing (minRole: subscriber).
enqueueRewardCreditAddEvent in lib/wallet/reward-credit-service.ts:
existingcreditBalanceService.addCredits(..., 'reward_credit_add', getFiatCreditAccountingRate())appendEvent('reward_credit_add')Ledger failures → status failed (not skipped).
| Trigger | When |
|---|---|
Profile fields / profileCompleted | After updateProfile empty→filled / completeness |
adminVerify | Admin KYC verification |
newsStoryApproved | Main-page approval for user-authored articles |
commentCreated / reviewCreated / requestCreated | After create (once per object id) |
profileCompleted is a completion bonus in addition to field awards.
/admin/rewards — charts (daily mint, by trigger, by role, top earners)/api/admin/rewards/*No chance mechanics, no client-trusted amounts, published rules, affiliate token rail stays separate. See LegioX lens ua_non_speculative_reputation_wealth_designer.
Ring awards credit balance units (credit.creditUnitLabel, e.g. points on ring-platform.org) when users complete real contribution. Credits are platform utility (spendable for store, membership, generative media) — not speculative crypto. Earn rules are deterministic, capped, and auditable.
Write path: ring-config.json → credit.rewards
{
"credit": {
"creditUnitLabel": "points",
"creditBalanceUnitToMainCurrency": 1,
"rewards": {
"minRole": "subscriber",
"multipliers": { "subscriber": 1, "member": 1.5, "confidential": 2 },
"dailyEarnCap": { "subscriber": 50, "member": 100, "confidential": 150 },
"events": {
"adminVerify": { "amount": "50", "enabled": true, "idempotencyMode": "once_per_user" },
"commentCreated": { "amount": "2", "idempotencyMode": "once_per_object" }
}
}
}
}Read fallback order (migration): credit.rewards.events → credit.creditAddEvents → credits.rewards.events.
| Mode | Key | Use |
|---|---|---|
once_per_user | credit_add_event:{trigger}:{userId} | Profile fields, KYC, completion bonus |
once_per_object | …:{objectType}:{objectId} | Comments, reviews, approved news |
Unique index on credit_add_events.idempotency_key prevents races.
Final award = floor(base × multiplier) (minimum 1 if base ≥ 1). Daily cap is UTC calendar day; if the award would exceed remaining budget, the entire award is skipped (skip_reason: daily_cap) — never partial-minted.
Visitors earn nothing (minRole: subscriber).
enqueueRewardCreditAddEvent in lib/wallet/reward-credit-service.ts:
existingcreditBalanceService.addCredits(..., 'reward_credit_add', getFiatCreditAccountingRate())appendEvent('reward_credit_add')Ledger failures → status failed (not skipped).
| Trigger | When |
|---|---|
Profile fields / profileCompleted | After updateProfile empty→filled / completeness |
adminVerify | Admin KYC verification |
newsStoryApproved | Main-page approval for user-authored articles |
commentCreated / reviewCreated / requestCreated | After create (once per object id) |
profileCompleted is a completion bonus in addition to field awards.
/admin/rewards — charts (daily mint, by trigger, by role, top earners)/api/admin/rewards/*No chance mechanics, no client-trusted amounts, published rules, affiliate token rail stays separate. See LegioX lens ua_non_speculative_reputation_wealth_designer.
Ring awards credit balance units (credit.creditUnitLabel, e.g. points on ring-platform.org) when users complete real contribution. Credits are platform utility (spendable for store, membership, generative media) — not speculative crypto. Earn rules are deterministic, capped, and auditable.
Write path: ring-config.json → credit.rewards
{
"credit": {
"creditUnitLabel": "points",
"creditBalanceUnitToMainCurrency": 1,
"rewards": {
"minRole": "subscriber",
"multipliers": { "subscriber": 1, "member": 1.5, "confidential": 2 },
"dailyEarnCap": { "subscriber": 50, "member": 100, "confidential": 150 },
"events": {
"adminVerify": { "amount": "50", "enabled": true, "idempotencyMode": "once_per_user" },
"commentCreated": { "amount": "2", "idempotencyMode": "once_per_object" }
}
}
}
}Read fallback order (migration): credit.rewards.events → credit.creditAddEvents → credits.rewards.events.
| Mode | Key | Use |
|---|---|---|
once_per_user | credit_add_event:{trigger}:{userId} | Profile fields, KYC, completion bonus |
once_per_object | …:{objectType}:{objectId} | Comments, reviews, approved news |
Unique index on credit_add_events.idempotency_key prevents races.
Final award = floor(base × multiplier) (minimum 1 if base ≥ 1). Daily cap is UTC calendar day; if the award would exceed remaining budget, the entire award is skipped (skip_reason: daily_cap) — never partial-minted.
Visitors earn nothing (minRole: subscriber).
enqueueRewardCreditAddEvent in lib/wallet/reward-credit-service.ts:
existingcreditBalanceService.addCredits(..., 'reward_credit_add', getFiatCreditAccountingRate())appendEvent('reward_credit_add')Ledger failures → status failed (not skipped).
| Trigger | When |
|---|---|
Profile fields / profileCompleted | After updateProfile empty→filled / completeness |
adminVerify | Admin KYC verification |
newsStoryApproved | Main-page approval for user-authored articles |
commentCreated / reviewCreated / requestCreated | After create (once per object id) |
profileCompleted is a completion bonus in addition to field awards.
/admin/rewards — charts (daily mint, by trigger, by role, top earners)/api/admin/rewards/*No chance mechanics, no client-trusted amounts, published rules, affiliate token rail stays separate. See LegioX lens ua_non_speculative_reputation_wealth_designer.