VitalShares
Settling on Robinhood Chain

Every kilometre
settles on-chain.

Connect Strava. Go outside. VitalShares verifies the effort against a GPS trace, a pace floor and a duplicate-route check, then pays you in USDG — usually before you have finished stretching. Trading fees on the token fund the pool, so payouts grow as the token does.

$0.05
per verified km
before multiplier
$10
per activity cap
hard ceiling
3
rewards per day
enforced in Postgres
Verification tracelive
distance 8.42 kmpace 5:12/kmreward $0.42

No manual entries

An activity with no GPS polyline is rejected outright, unless a footpod or power meter corroborates it.

No route replays

Routes are fingerprinted twice — the polyline itself, and a coarse start/end bucket that survives jitter.

No double payouts

One payout row per activity, enforced by a unique constraint. The transaction hash is stored before broadcast.

The pipeline

Six steps from finish line to wallet

Every one of them is idempotent. Replay any step and nothing is paid twice.

  1. 01

    Strava fires

    An activity:create webhook hits /api/webhooks/strava.

    Answered in one INSERT, under Strava’s 2-second deadline.

  2. 02

    Queued

    A row lands in verification_jobs with a 20s delay.

    The delay lets Strava finish attaching the GPS map.

  3. 03

    Verified

    Full activity detail is pulled and run through the rule set.

    GPS, pace, duplicate route, account age, daily cap.

  4. 04

    Slot claimed

    claim_reward_slot() takes one of three daily slots.

    A primary key, not a count — concurrent uploads collide, not double-pay.

  5. 05

    Signed

    Nonce and gas pinned, transaction signed, hash persisted.

    Stored before broadcast, so a retry re-sends the same bytes.

  6. 06

    Settled

    Receipt confirmed, ledger updated, email sent.

    Anything without a receipt stays in-flight — never re-sent.

Anti-gaming

What gets rejected, and why

One pure function, no database reads, fully testable. Tune the numbers, not the plumbing.

No GPS track

reject
no_gps

A manual entry is a number someone typed. Indoor efforts pass only with device evidence: a footpod reporting cadence, a trainer reporting power.

Faster than human

reject
pace_implausible

Sub-2:30/km for a run is quicker than the 10k world record. Strava's own reported average speed is cross-checked against the derived pace.

Same route again

reject
duplicate_route

Two fingerprints per activity, compared across a 24-hour window: the exact polyline, and start/end coordinates bucketed to ~110 m with the distance.

Throwaway account

reject
account_too_new

A Strava account under 24 hours old earns nothing. If the creation date cannot be read at all, the activity is rejected rather than trusted.

Past the daily cap

reject
daily_cap_reached

3 rewarded activities per UTC day. Not a count-and-hope — a primary key on (user, day, slot), so simultaneous uploads collide instead of both paying.

Stale backfill

reject
activity_too_old

Activities older than 72 hours are outside the reward window, which stops a new account importing a year of history on day one.

The maths

Work out what a session pays

This runs the production reward function in your browser. No approximation.

Payout model

Move the sliders. This is the live rule set.

Pace check5:15/km
slower →

Anything left of the line is faster than 2:30/km — quicker than a world-record race, so it is a vehicle, a GPS glitch, or a fake.

Settles to your wallet
$0.40
8.0 km × $0.05 × 1.00 multiplier
Per-activity cap
$10.00
Daily ceiling
3 activities
Max per day
$30.00
How rewards are funded

The pool grows as the token does

A share of every trading fee on the VitalShares token flows into the reward treasury. More volume means a bigger pool, and a bigger pool means the per-kilometre rate and the per-activity cap go up.

  1. 01

    Trading fees

    A share of every fee on the VitalShares token is routed to the reward treasury instead of being taken out.

  2. 02

    Treasury grows

    That share accumulates as USDG, on top of whatever the treasury is seeded with.

  3. 03

    Rewards rise

    Per-kilometre rates and the per-activity cap are raised as the float allows, rather than being fixed forever.

  4. 04

    More athletes

    Bigger payouts bring more people, more people mean more volume, and more volume means more fees.

Rewards are funded by fees, not by a fixed pot that drains. The treasury balance is readable on-chain at any time, and the current rate is always the one shown in the payout model above — it is raised deliberately, never promised in advance.

Ready when you are

Your next run is worth something.

Sign up, paste a wallet address, connect Strava. The first verified kilometre settles without you touching anything else.

Create an account