Launches
The kit
The kit is a token hook with four fixed, bounded modules. Only the launchpad installs it, and each launch picks the modules its token has.
Modules
| Bit | Module | What it does | Parameters |
|---|---|---|---|
| 1 | Holder rewards | A share of each trade, paid to holders in SOL: sent to their wallets automatically, or claimed any time. | the reward vault; the fee itself is set in the pool hook |
| 2 | Max wallet | No holder above the cap until graduation. Never blocks a sell into the launch pool. | max_wallet_amount, fixed at init |
| 4 | Creator lock | The creator’s wallet can’t sell or send until then, whoever signs. | creator_unlock_at |
| 8 | Early lock | Tokens bought from the pool in the window can’t be sold or sent until the unlock. | early_window_end, early_unlock_at |
The mint’s flags are BEFORE_TRANSFER, plus BEFORE_BURN | WRITES_HOOK_DATA when holder rewards or the early-buyer lock is on. A launch with none of these modules gets no hook at all; a burn alone runs in the pool hook.
Who can install it
KitConfig, at ["kit", mint], is created only by init, signed by PDA(["kit-caller", mint], LAUNCH_ID), a PDA that signs nothing else and holds nothing. A kit launch’s mint has hook_program = KIT_ID and no hook authority from its first instruction, so which program runs is fixed. The kit’s own code can change while it has an upgrade authority. Anyone can create a mint that names the kit as its hook, but without a KitConfig, which only a launch can create, every callback fails: such a mint can never move.
Owners
- Excluded
- The pool and the launch: not settled, not capped, not counted in eligible, and they cannot claim. Every other owner is a holder.
- Refused
- The launch, the kit config, the default key and the five program ids, as destinations (DestinationNotAllowed).
- Rewards on
- No program can hold the token: a transfer to a holder must go to an address on the ed25519 curve, so every pool trade happens on the launch pool and pays its rules. Wallet-to-wallet swaps pay no launch fees; max wallet and the locks still apply.
- Rewards off
- Anyone can open another pool. Burn, the creator fee and the buy and sell rates apply only on the launch pool; max wallet caps another pool’s vault like any wallet until graduation.
before_transfer, in order
1. Where the token may go: not a refused destination; with holder rewards, an excluded owner or one on the curve (DestinationNotAllowed). 2. Sync: what reached the reward vault since the last callback is divided among the eligible supply. 3. Creator lock: before the unlock, the creator’s wallet sends nothing (CreatorLocked). 4. Early lock: before the unlock, a holder can’t go below the tokens it bought in the window (EarlyLocked). 5. Settle the source, then the destination, at their balances before the transfer. 6. Max wallet: until graduation, no holder above the cap (MaxWalletExceeded). 7. Early-buyer bookkeeping: a buy from the pool in the window adds to the buyer’s locked tokens. 8. The eligible count: excluded to holder adds the amount, holder to excluded takes it away. 9. Answer the 64 bytes of each holder side that changed. No cuts, no burn: what leaves is what arrives.
before_burn runs the sync, the early-buyer check, the settle and the eligible count on the source alone. The creator wallet lock does not apply to burns. Sells go to the launch pool’s vault, which is excluded, so max wallet never blocks a sell into it.
Instructions
- init
- From create_launch, signed by the kit-caller PDA. Checks the hard bounds again and creates KitConfig and, with holder rewards, the reward vault.
- graduate
- From the launch at graduation. Lifts max wallet; refuses a second time.
- claim_sol
- Signed by the holder of a native kit: pays what it is owed in SOL to its wallet (claims). claim does the same in bridged SOL on a kit that is not native.
- claim_sol_for
- Signed by anyone, who pays the fee: claim_sol for a holder, paid to the holding’s owner only.
- share_sol(amount)
- Signed by anyone: SOL every holder receives pro rata, released over an hour. At least 0.001 SOL. share does the same in bridged SOL.
Runtime
Callbacks make no CPIs and emit no events: the token program is on the stack while one runs. Swap, then token, then kit is a height of 3; a router on top makes 4, under the limit of 5. Known signers are constants, not derived on chain.
A verified kit token
What the site shows as a kit token is fixed by the chain: the mint’s hook is the kit, its KitConfig exists at ["kit", mint], and the launch it belongs to is the launchpad’s. A token whose hook is anything else is “Custom hook, unverified”.