Open model

Public scoring and contracts
Every account is scored by the same published function. Nothing is weighted by hand. Plug in any profile and you get exactly what the indexer computes.
Sway score
60/100
$9.1K
reach value
6,000 points
Reach weight 35%60
Engagement weight 35%59
Consistency weight 10%48
Authenticity weight 20%70

score.ts

Runs in the indexer and here
export function score({ followers, er, ppw, age, verified }) { const reach = Math.min(1, Math.log10(followers + 1) / Math.log10(5e7)); const eng = 1 - Math.exp(-er * 40); // (likes + 2·reposts + 3·replies) / followers const cons = Math.min(1, ppw / 21); const auth = 0.6 * Math.min(1, age / 6) + 0.4 * (verified ? 1 : 0); const raw = 0.35*reach + 0.35*eng + 0.10*cons + 0.20*auth; return { score: Math.round(raw * 100), value: 0.42 * followers * raw ** 1.6 * (0.6 + eng) }; }

Key contract

SwayKeys.sol
CurveK × (supply + 2)², K = 0.0000175
First key0.00016 ETH ($0.54)
10th / 100th key$8.62 / $622.68
Minimum trade0.01 key
Anti-snipemax 10 keys, first 5 min
Creator’s first keycan’t be sold

Where the 10% fee goes

Creator 6%
Protocol 2%
Holders 1%
Ref 1%
The 1% holder share is new compared with friend.tech: it streams to everyone holding that creator’s keys, pro rata, claimable onchain. The protocol fee goes half to $SWAY stakers and half to the treasury, and staking levels cut it by up to 75%.

Repository

sway/ ├─ contracts/ SwayKeys, SwayStaking, GenesisPass, FanEscrow, Launchpad ├─ scoring/ score.ts, the function above ├─ indexer/ chain mirror, 1 min refresh ├─ battles/ X API reader, engagement scoring └─ web/ this app