Pre-launch · calculator works today

Holder rewards

Pay a reward budget to everyone who holds your coin, split by how much each one holds, straight into their wallets. Holders never have to connect or claim.

  • VEYDUCT fee0.01 SOL per campaign
  • Splitby balance
  • Holdersnever claim
  • Withdrawalnone
Holder rewards, worked exampleRound 1 splits 1,000 DEMO across A 500,000, B 300,000 and C 300,000 DEMO. B sells 200,000 to D, then round 2 splits 500 DEMO by the new balances. Delivered after two rounds, rounded to 2 decimals: A 681.82, B 318.18, C 409.09, D 90.91. Reward vault1,500 DEMO snapshot 1snapshot 2 Round 11,000 Round 2500 Delivered to wallets A681.82B318.18C409.09D90.91 Round 2 used new balances after B sold 200,000 to D.
Example from the worked math in How it works · example numbers, not a real campaign

With your wallet · works today

Split a reward budget

Paste holder balances and a budget. Every token is allocated, down to the smallest unit, and you can export the result for your own payouts.

Works today · local only · nothing is signed

Budget

in tokens

Budget in whole tokens, for example 1000. Decimals of the token you will pay out: Pump coins use 6; check the mint for any other token. A wrong value scales every share by a power of ten.

Holder balances

0 / 1,000 rows

One wallet and whole raw balance per line, for one holder token. Up to 1,000 rows / 128 KB. Use wallet addresses, not token account addresses. The reward token may have different decimals. Mint, snapshot completeness and ownership are not verified.

Exclude treasury or team wallets

Excluded balances receive no allocation and are removed from the denominator. Zero balances are skipped.

Add a budget and balancesNothing is signed or sent.

With your wallet · campaigns

Close this section to return to the budget splitter.

Send rewards directly to holders

Fund a campaign with your token, capture current holder balances and publish a reward round. Each allocation goes straight to its holder’s wallet. Holders do not need to connect or claim.

Fill in a campaign and review it now; wallet approval opens when this tool goes live.

Pre-launch
in tokens

Token decimals are read from the mint. Create or fund deposits this amount; capture allocates this amount from the campaign’s available balance.

Funding is committed to rewards. Tokens you deposit can only go to holders; there is no creator withdrawal. In a manual campaign you approve every holder snapshot yourself; automatic rounds run only if you opt in below. Snapshots use current balances, not how long someone has held, and the holder list comes from a mainnet RPC read that the program can’t check. Works with classic SPL coins and Pump coins (metadata-only Token-2022).
Automatic reward rounds

Opt in when creating a new campaign. A dedicated service attestor publishes proportional rewards from current holder balances. Creator, known program and off-curve wallets are excluded; existing entitlements remain payable. Capture must reconcile the full token supply at one finalized slot.

This is a trusted service. The attestor is permanent and cannot be replaced or revoked in this contract. Cadence, expiry and reward limits are enforced by the service, not the contract. Only fund amounts you are willing to entrust to that attestor. Existing creator-attested campaigns cannot be converted.

Checking automatic publication availability…

days, 1–30

216,000 slots is approximately one day, but slot duration varies. Execution also depends on keeper scheduling, available funding and a consistent RPC snapshot. Consent expiry pauses this service; it does not remove the attestor’s on-chain authority.

The first registered policy is permanent. Limits, cadence and expiry cannot be changed or renewed on this campaign. A different policy requires a new campaign. Unallocated rewards cannot be withdrawn, including after expiry; fund only the amount you intend to allocate before then. The service supports three campaigns per attestor and retains expired records to recover pending transactions.

Creating a campaign includes a one-time VEYDUCT fee of 0.01 SOL, shown in the review before you sign. Adding rewards, publishing rounds and deliveries carry no VEYDUCT fee.

Manage an existing campaign

  1. Add rewardsDeposits the token amount above into this campaign.
  2. Capture holdersReads current balances at one finalized slot for the amount above.
  3. Publish roundAssigns the captured shares on chain.

Each delivery requires your approval and pays only the amount still owed. Existing payments are tracked on-chain, including across later reward rounds.

Practice run · simulated · nothing is sent

Practice run

The practice run loads with the page. It needs JavaScript; nothing is signed or sent.

Everything a holder reward campaign does, and does not do

Checked against the program’s source, the site’s snapshot service and this page’s own code.

Split
By balance at one snapshot, every raw unit assigned
Delivery
Straight to each holder’s own token account
VEYDUCT fee
0.01 SOL to create a campaign. Nothing else
Withdrawal
None. Funded tokens can only go to holders
Example

Each share follows the balance you supply for that holder.

Accounts the program creates

Every account has an address derived from fixed seeds (a PDA), so the page and the service find it from the campaign and nobody can swap in a look-alike. (A PDA is a An account address worked out from fixed words (seeds) and the program’s ID. Nobody holds a private key for it; only the program can sign for it..)

Campaign

Settings and totals: the creator (admin), the snapshot approver, the coin, the latest round and its snapshot slot, the total assigned and the total delivered.

Seeds
"push-config-v2", creator, number
Size
220 bytes
Created by
Create a campaign

Reward vault

A token account owned by the campaign address that holds every deposited reward until it is delivered.

Seeds
"push-vault-v2", campaign
Size
165 bytes, 170 for Token-2022
Created by
Create a campaign

Round record

One per published round: its number, snapshot slot, the new cumulative total and the One hash that fingerprints every holder’s amount in the round. A delivery carries a short proof that the holder’s line is part of it, so nobody can be paid an amount that was not published. of every holder’s cumulative amount.

Seeds
"push-epoch-v2", campaign, round
Size
136 bytes
Created by
Publish round

Delivery receipt

One per holder per campaign: how much that wallet has received in total, so no delivery can ever pay twice.

Seeds
"push-paid-v2", campaign, holder
Size
88 bytes
Created by
The first delivery to that holder

Each holder’s line in a round is a leaf sha256("VEYDUCT_PUSH_LEAF_V2" ‖ program ‖ campaign ‖ network domain ‖ snapshot digest ‖ token program ‖ wallet ‖ cumulative amount). Leaves pair up into the round’s root; a delivery carries the holder’s proof (at most 30 hashes) and the program recomputes the root before it moves anything.

Who can do what

  • ActionWho signsRules the program enforces
  • Create a campaignAny wallet; it becomes the campaign adminA first deposit above zero from its own token account. The The one wallet allowed to publish rounds: you in a manual campaign, or the VEYDUCT service attestor in an automatic one. Set when the campaign is created and never changed. is fixed for good: you (manual) or the service attestor (automatic).
  • Add rewardsAny wallet, from its own tokensDeposits into the vault. Nothing is assigned until a round is published.
  • Publish a roundThe snapshot approver onlyThe next round number; a snapshot newer than the last and at most the campaign’s maximum age old; a total at least the previous total; everything still owed covered by the vault.
  • DeliverAnyone (they pay the fees)Only to the holder’s own associated token account, only the cumulative amount minus what was already delivered, and never to the campaign admin.
  • Withdraw or reassignNobodyNo instruction returns deposits to the creator, changes the approver, rewrites a round or closes the campaign.

The program checks the arithmetic and the proofs, not the holder list. Who counts as a holder, and that the snapshot is complete, is what the approver vouches for. In an automatic campaign that is the VEYDUCT service attestor, permanently.

Split math, with a worked example

Amounts on chain are whole token units: 1 DEMO with 6 decimals is 1,000,000 units.

Each round splits its budget across eligible balances at one slot. The creator’s wallet, wallets that are program accounts (such as the Pump bonding curve or a pool) and the reward vault itself are left out. The calculator at the top of the tool uses the same method.

  1. Round down each shareshare = budget × holder balance ÷ eligible total (whole units, rounded down)The remainder of each division is kept for the next step.
  2. Hand out what rounding leftleftover = budget − Σ shares; +1 unit each to the largest remaindersTies go to the lower wallet address. Every unit of the budget is assigned.
  3. Add to what each holder already hasentitled = previous rounds + this share; delivery = entitled − deliveredEntitlements only grow, so a delivery always pays exactly what is new.

Example

  1. A holds 500,000, B 300,000, C 300,000 DEMO. Round 1 shares 1,000 DEMO.A: 1,000 × 5/11 = 454.545454 (rest 6/11) · B and C: 272.727272 (rest 8/11)Rounding left 2 units: they go to B and C, the larger remainders. A 454.545454, B 272.727273, C 272.727273.
  2. B sells 200,000 to D. Round 2 shares 500 DEMO.A 5/11, B 1/11, C 3/11, D 2/11 of 500A +227.272727, B +45.454546, C +136.363636, D +90.909091 (the 2 leftover units go to D, then B).
  3. Entitled after two roundsA 681.818181, B 318.181819, C 409.090909, D 90.909091: 1,500 DEMO in all. Delivering to A now pays 681.818181; delivering again pays nothing until another round.

Run the same steps in Try it (create, capture, publish, let B sell to D, capture and publish again, deliver): it uses this arithmetic, so you will see these numbers.

Costs

VEYDUCT fee to create a campaignPaid once, in the same transaction, to VEYDUCT’s fee wallet. Shown in the review.
0.01 SOL
Account rent for a new campaignCampaign (220 bytes) and reward vault, at mainnet rent of 5,080 lamports per byte plus 128 bytes per account.
≈ 0.0033 SOL (Token-2022) · 0.0033 SOL (classic)
Account rent per published roundA 136-byte round record, paid by the snapshot approver: you in a manual campaign, the service in an automatic one.
≈ 0.0013 SOL
Account rent per new holderA delivery receipt, the first time a holder is paid, by whoever sends the delivery.
≈ 0.0011 SOL
Holder token account, if missingA delivery re-creates a holder’s closed token account first, at the deliverer’s cost.
≈ 0.0015 SOL
Network feePer transaction, one signature.
0.000005 SOL
Percentage feesAdding rewards, publishing and deliveries carry no VEYDUCT fee, and the program takes no cut.
None

SOL deposited into an account so Solana keeps storing it. It is normally returned when the account is closed. stays in the program’s accounts: there is no instruction that closes a campaign, round or receipt, so it is not refunded.

Rounds and timing

  • Snapshots are current balances. One finalized Solana’s clock tick, about 0.4 seconds. 216,000 slots is roughly a day, though slot times vary., no hold-time weighting. Someone who sells before the snapshot gets nothing from that round; someone who buys before it counts in full.
  • Snapshots expire. This site creates campaigns with a maximum snapshot age of 216,000 slots (about a day; the program allows at most 432,000). Publish soon after capturing, or capture again.
  • Rounds are numbered. Round 2 can only follow round 1, and each snapshot must be newer than the last one published.
  • Automatic rounds run on the service’s schedule. At least 216,000 slots apart, within the tokens-per-round and total limits you sign, until your consent expires (1 to 30 days). Expiry pauses the service; earlier entitlements stay deliverable.

Edge cases and what can go wrong

Nothing owed

A delivery that would pay zero is refused, so re-sending a delivery can never pay twice.

Stale snapshot

A snapshot older than the campaign’s maximum age, or not newer than the last round, is refused when you publish.

Not enough in the vault

A round whose unpaid total would exceed the vault is refused. Add rewards first.

Tiny budgets

Small holders can get 0 units in a round. Every unit still goes to someone: the leftovers go to the largest remainders.

Unsupported coins

Solana’s newer token program. Pump coins use it with metadata only, which holder rewards support. Classic SPL coins use the original token program. coins with transfer fees, transfer hooks or other extensions, and coins with a freeze authority, are refused when the campaign is created.

Wrong account

Tokens only go to the holder’s own associated token account; a delivery naming any other account fails before anything moves.

FAQ

Can I take back tokens I deposited?

No. The program has no withdrawal. Deposited tokens can only be delivered to holders through published rounds, so fund only what you mean to give away.

Do holders need to do anything?

No. Deliveries go straight into each holder’s own token account. Anyone can send them, and the tokens can only land with the holder.

Why does my own wallet get nothing?

The creator (the campaign admin) is excluded from snapshots, and the program refuses deliveries to the admin. Program accounts such as the Pump curve are excluded too.

What if a holder sells after a round?

Their entitlement from that round stays theirs and can still be delivered. They simply count less, or not at all, in the next snapshot.

What does the automatic service control?

It captures and publishes rounds within the limits you sign: tokens per round, a total cap, the interval and an expiry. The program trusts its snapshots, and its approver role can never be replaced on that campaign.

Can the program be changed after launch?

The release only switches holder rewards on for a program with no upgrade authority (nobody can change its code), and the page checks the exact program bytes before every wallet action.

Does it work with Pump coins?

Yes. Pump coins are Token-2022 with metadata only, which is supported, on the curve or on PumpSwap. Classic SPL coins work too.

Tested in this release

Test results are published with each release

Every release build runs the holder rewards program’s exact pinned bytes, this page’s own client and the site’s reward service in an isolated Solana runtime (LiteSVM), with mainnet token programs and a real Pump coin captured read-only. This copy of the site has no build results attached; Release status lists the latest release.

  • Campaign setup with the exact 0.01 SOL VEYDUCT fee, adding rewards, a holder snapshot, publishing a round and delivering each holder’s share, on a Pump (Token-2022) coin and on a classic SPL coin.
  • A second round after a real balance change adds to earlier entitlements; the creator, the Pump curve and the reward vault are left out of snapshots; automatic rounds stop at their cadence and budget limits.
  • Replayed payouts, wallets outside the published round, unsupported token extensions and payouts to any account but the holder’s own refused, with the whole transaction undone.