# Creator share and stewardship

After the first 100 seconds, 40% of each coin's claimed trading fees go to its steward, who is the creator to start with. The steward keeps earning only while they pass three checks every hour: they hold 1% of supply, they have checked in by posting an update on the coin's Koine page in the last 72 hours, and holders haven't flagged them as gone. What they earn waits until they claim it, and they can claim only within 24 hours of their latest update. If they fail for 14 days in a row, holders can vote in a new steward.

All of these rules run on Koine's server, not on chain. See [trust.md](https://docs.koine.markets/launchpad/trust#what-runs-off-chain).

## Who is the steward?

The Koine wallet that paid the coin's launch fee, which is the creator's, until it hands the role to another wallet or holders vote in a new one. On the site you act as the steward by signing in to that account.

Source: `app/server/steward.ts` (`stewardOf`), `app/server/http.ts` (`/api/launches`).

## What does the steward earn?

40% of the fees the keeper claims from the pool each hour after the spike claim, for every hour they pass the checks. The claimed fees are 80% of the trading fee (Meteora keeps 20%), so this is 32% of the trading fee. At the 1% floor, that's 0.0032 SOL per 1 SOL traded.

The share isn't sent automatically. It's owed to the steward and waits. The steward presses **Claim** on the coin page, and Koine pays everything owed to that wallet in SOL, from the buyback wallet, but only if their latest update is less than 24 hours old. Otherwise the claim is refused with "Post an update to claim. Your last one was 4 days ago." Posting an update and claiming again works. A claim needs at least 0.001 SOL owed.

With the Squads multisig on, a claim waits until the hour's shares have moved out of the multisig to the buyback wallet (usually within the hour).

Each hour's share is owed to the wallet that was steward that hour. On a handover or a vote, whatever the old steward is owed is paid to them automatically at that moment, since they earned it while covered.

Koine's own 40% is still paid to the treasury automatically after every hourly claim.

The steward earns nothing from the first 100 seconds of fees. Those go 75% to buyback and burn and 25% to Koine's treasury. See [fees.md](https://docs.koine.markets/launchpad/fees).

Source: `app/server/config.ts` (`FEES.creatorPct`, `FEES.minPayoutSol`, `STEWARD.claimFreshSeconds`), `app/server/keeper.ts` (`claimFees`, `claimShare`, `payOut`), `app/server/steward.ts` (`claimCheck`), `app/server/http.ts` (`POST /api/steward/claim`), `app/server/store.ts` (`creator_shares`).

## What are the three checks?

At every hourly fee claim, the keeper checks:

| Check | Passes when |
|---|---|
| **Bond** | The steward holds at least 1% of supply: 1,000,000,000 × 100 ÷ 10,000 = 10,000,000 tokens. Their wallet balance and their unclaimed presale tokens both count. |
| **Check-in** | The hour is covered by a check-in: any update the steward posted on the coin's page in the last 72 hours that they haven't deleted. No replies are needed. |
| **Flags** | Counted "gone" flags from holders add up to less than 25% of circulating supply. |

If any check fails, that hour's 40% goes to buyback and burn instead. It is forfeited for good, not held for later.

Each update covers the 72 hours after it was posted. Trading opening counts as the first check-in, and so does winning a vote, so the first 72 hours are covered without a post. A handover doesn't move the cover (see below). After that, an hour fails the check-in whenever the steward's latest update is 72 hours old or more. Deleting an update takes away its cover from then on; hours it already covered stay earned.

Source: `app/server/steward.ts` (`status`, `checkin`, `evaluate`, `heldBy`, `graceStart`), `app/server/store.ts` (`latestPost`), `app/server/community.ts`, `app/server/config.ts` (`STEWARD.bondBps`, `STEWARD.checkinSeconds`, `STEWARD.flagPct`).

## Where does the steward post?

On the coin's own page on Koine (its Community tab). Every update is a check-in. See [community.md](https://docs.koine.markets/launchpad/community). Holders never need X.

## How do holder flags work?

Any holder can flag the steward as gone from the coin page. The steward can't flag themselves. A holder can remove their flag at any time.

- A flag records the holder's balance at flagging time (wallet plus unclaimed presale tokens).
- It counts only after it has stood 3 days.
- It then weighs the smaller of that recorded balance and the holder's balance now, counted the same way.
- It expires 14 days after it was set. Flagging again restarts both clocks.
- Counted flags at 25% or more of circulating supply fail the flag check.

"Circulating supply" is the token's current supply (burned tokens already removed) minus the tokens in the pool. Presale tokens still in the vault are part of it, so every balance used against it (flag weight, the vote snapshot and vote weight) counts each depositor's unclaimed presale tokens too, and the vault itself counts for no one. A depositor doesn't need to claim first.

Buying in to flag means holding for 3 days first, and splitting tokens across wallets adds nothing.

Source: `app/server/steward.ts` (`flag`, `flagWeight`, `holders`, `unclaimed`, `circulating`), `app/server/store.ts` (`setFlag`), `app/server/config.ts` (`STEWARD.flagAgeSeconds`, `STEWARD.flagTtlSeconds`, `STEWARD.flagPct`).

## When is a coin "abandoned"?

When the steward fails at least one check at every hourly evaluation for 14 days, for example by not posting an update for 72 hours and then 14 days more. The clock starts at the first failed check and resets as soon as they pass all three again. A handover doesn't reset it.

Once abandoned:

- the steward's share keeps going to buyback;
- the steward can't hand over the role;
- holders can start a takeover vote;
- the steward gets the coin back by passing all three checks again, unless a vote is open.

Source: `app/server/steward.ts` (`evaluate`, `handover`), `app/server/config.ts` (`STEWARD.abandonSeconds`).

## Can the steward hand over the role?

Yes, to any wallet (normally another Koine wallet), unless the coin is abandoned. It gives the share away for good, so the site asks for your sign-in again first: a new email code, your passkey or your wallet. The new steward takes over the coin's record as it stands:

- **Check-ins:** the old steward's posts stop counting for the new one; only the new steward's own updates count from now on.
- **Cover:** unchanged. The new steward is covered until the old one's cover ran out, and must post an update by then. A steward who posted just before handing over gives the new one a full 72 hours.
- **Owed share:** whatever the old steward is owed is paid to them automatically at the handover.
- **Abandonment clock:** keeps running. If the coin was failing, it still is, and it's marked abandoned 14 days after the first failed check unless the new steward passes all three checks first.
- **Holder flags:** kept, with their original dates. Holders who trust the new steward can remove theirs. A flag set by the new steward's own wallet is removed, since a steward can't flag themselves.

They need the bond from the next hourly check.

Why: Koine can't tell a real new steward from the steward's own second wallet. If a handover cleared the record, a failing steward could hand over to themselves before 14 days, or every few days to clear flags before they count, and never be marked abandoned. Flags carry over for the same reason: they're about whether anyone is looking after the coin, and holders can take them back.

Source: `app/server/steward.ts` (`handover`, `graceStart`), `app/server/keeper.ts` (`payOut`), `app/server/http.ts` (`/api/steward/handover`).

## How does the takeover vote work?

1. On an abandoned coin, any signed-in account can nominate a wallet. The nominee must hold the bond (10,000,000 tokens, wallet plus unclaimed presale tokens).
2. The first nomination opens a vote for 7 days and takes a snapshot of every wallet's balance: tokens in the wallet plus presale tokens still unclaimed in the vault. Up to 20 nominees can join it.
3. Any account whose Koine wallet has a balance in the snapshot can vote. Voting again replaces the earlier vote.
4. When the vote closes, the keeper counts each vote at the smaller of the voter's snapshot balance and their balance at close. So tokens bought after the vote opened add nothing.
5. The vote passes only if:
   - votes cast reach a quorum of 10% of circulating supply;
   - the leading nominee has more than half of the votes cast;
   - the leader still holds the bond at close.
6. If it passes, the winner becomes steward, starts clean (the win counts as their first check-in, so they're covered for 72 hours; flags cleared) and the coin is no longer abandoned. The old steward is paid whatever they're still owed. If not, the coin stays abandoned and the share keeps going to buyback. A new nomination can open another vote.

A vote can only choose a new steward, who then has to pass the same three checks to earn the share. Any wallet that holds the bond can be nominated, including a voter's own.

Source: `app/server/steward.ts` (`nominate`, `vote`, `tally`, `closeVote`, `holders`), `app/server/store.ts` (`castVote`), `app/server/config.ts` (`STEWARD.voteSeconds`, `STEWARD.quorumPct`, `STEWARD.maxCandidates`), `app/server/keeper.ts` (`votes`, `payOut`).

## How are these actions confirmed?

Flagging, handing over, nominating, voting and claiming are not transactions. On the site they're actions of your signed-in account, as its Koine wallet: the server reads who you are from your session, and a flag or vote weighs that wallet's holding. A handover also needs a fresh sign-in, checked by the trading service and bound to that coin and new steward, usable once (see [Accounts and sign-in](https://docs.koine.markets/terminal/wallet-accounts#what-asks-for-your-sign-in-again)). A claim always pays the steward wallet itself.

When `CLUSTER` isn't `mainnet`, test scripts may sign each action's fixed text with a bare wallet instead. On mainnet the server doesn't accept these:

```
Koine <action>
Coin: <mint>
Wallet: <wallet>
<Label>: <target>
Time: <unix seconds>
```

`<action>` is `flag`, `handover`, `nominate`, `vote` or `claim`. The label is `Flag`, `To`, `Nominee` or `For`; a claim has no target line. The server rejects a signature more than 10 minutes (600 s) old. Because every field is in the text, a signature for one coin, wallet, action or target can't be used for another.

Source: `app/server/http.ts` (`stewardActor`, `/api/steward/*`), `app/server/steward.ts` (`Proof`, `verify`), `trade/server/reconfirm.ts`, `app/shared/messages.ts` (`stewardMessage`), `app/server/config.ts` (`STEWARD.signedWithinSeconds`), `app/web/src/Steward.tsx` (`act`).

## What has been tested?

The check-in and claim rules have 10 unit tests (`app/server/steward-checkin.test.ts`): an update covers exactly 72 hours, trading open covers the first 72, deleted posts and other wallets' posts don't count, a claim is refused when the latest update is 24 hours old or more and allowed when fresh, a claim pays exactly what's owed and a double claim pays once, only the steward's own signature claims, a claim waits for the multisig, the platform's share still pays out without a claim, and a handover pays the old steward and keeps the cover.

Not tested: steward actions through a real Privy sign-in, and a handover's fresh sign-in in the browser. The server side of the handover's confirmation has unit tests (`trade/server/privyauth.test.ts`).

Source: `app/README.md` ("Not verified yet"), `app/server/steward-checkin.test.ts`, `trade/server/privyauth.test.ts`.

## Can these rules change?

Yes. The split and every steward setting are server settings, read from `app/server/config.ts` and environment variables (`STEWARD_BOND_BPS`, `STEWARD_CHECKIN_SECONDS`, `STEWARD_CLAIM_FRESH_SECONDS`, `STEWARD_FLAG_AGE_SECONDS`, `STEWARD_FLAG_TTL_SECONDS`, `STEWARD_ABANDON_SECONDS`, `STEWARD_VOTE_SECONDS`, `FEE_CLAIM_SECONDS`, `FEE_CREATOR_PCT`, `FEE_BUYBACK_PCT`, `FEE_PLATFORM_PCT`, `FEE_SPIKE_PLATFORM_PCT`). A change applies to every coin from the next check, including coins already trading. Unlike the fee schedule, the lock and the unlock, they are not fixed on chain.

Source: `app/server/config.ts` (`FEES`, `STEWARD`).
