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
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.
Allocation
| Recipient | Holder raw balance | Reward tokens | Reward raw units |
|---|
Use the distribution CSV with the same reward decimals when you send payouts, and review each batch before signing. Zero reward rows are omitted; the audit CSV keeps them.
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.
Token decimals are read from the mint. Create or fund deposits this amount; capture allocates this amount from the campaign’s available balance.
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…
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
- Add rewardsDeposits the token amount above into this campaign.
- Capture holdersReads current balances at one finalized slot for the amount above.
- 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
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.
- Round down each share
share = budget × holder balance ÷ eligible total (whole units, rounded down)The remainder of each division is kept for the next step. - Hand out what rounding left
leftover = budget − Σ shares; +1 unit each to the largest remaindersTies go to the lower wallet address. Every unit of the budget is assigned. - Add to what each holder already has
entitled = previous rounds + this share; delivery = entitled − deliveredEntitlements only grow, so a delivery always pays exactly what is new.
Example
- 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. - 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). - 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.