What jackfield is
jackfield is a workshop for reward hooks on Solana coins. A hook is a small, fixed rule that decides where a coin's trading fees go: how often holders get paid, which wallets count, and how big each share is. You build it on a jack panel, by plugging cords into jacks, the way studios route audio.
A jackfield coin launches on Meteora's Dynamic Bonding Curve. Every trade pays a 2.5% fee. Meteora keeps 0.5%, the other 2% runs into your hook, and the hook splits it between holders and the reserve every round. Holders receive SOL in their wallet. Nobody claims anything, nobody stakes anything.
Words used in this guide
| Word | Meaning |
|---|---|
| hook | The rule: round length, minimum hold, weighting, holders share. Six numbers, nothing else. |
| patch | A hook as it looks on the panel, before launch. You can change a patch, never a launched hook. |
| round | One payout cycle. Fees that arrived since the last round are split and sent. |
| pot | The holders' part of a round. If nobody qualifies, it waits for the next round. |
| reserve | The non-holder part of the 2%, plus rounding dust. It pays for the round worker and the panel. |
| fingerprint | jf1_ + the first 16 hex of a SHA-256 over the hook. Written into the coin's metadata at launch. |
Quick start
- Pick a recipe or plug cordsOpen the workbench. Start from Reward loyal holders or drag the plugs yourself: CLOCK sets the round length, GATE the minimum hold, LOYALTY the weighting. The fader sets the holders share.
- Test itPress Test this hook. Change balances and holding times of up to eight sample wallets and watch each share move. Follow the sample funds shows every lamport.
- LaunchOpen Launch, add a name, ticker and image, check the attached hook and its fingerprint, then sign with your wallet. The hook is locked from that moment.
Prefer words? Press Describe a hook and write what you want, for example "pay holders every hour by token balance, 90% to holders". See Describe a hook.
Where a fee goes
Every buy and every sell pays the same 2.5%. The split is fixed by the protocol, not by the hook:
| Part | Share of the trade | Notes |
|---|---|---|
| Meteora keeps | 0.5% | Pool fee of the bonding curve. |
| Into the hook | 2% | Claimed by the round worker each round. |
| → holders | 2% × holders % | 1.6% of the trade with the default 80/20. |
| → reserve | 2% × (100 − holders) % | 0.4% of the trade with the default. |
| Creator | 0% | No creator fee share, on any coin. |
Liquidity is locked when the coin graduates from the curve. Rewards build up per coin: no trading means no new rewards.
CLOCK · when rounds run
The amber cord. Plug it into 10, 20, 30, 40, 50 or 60: that is the round length in minutes. Rounds are aligned to the UTC clock, so a 10-minute coin pays at :00, :10, :20 and so on.
Short or long rounds
Short rounds feel alive: wallets see SOL arrive every few minutes. Long rounds make bigger, cleaner payouts and lose less to transaction costs. Amounts too small to send carry over to the next round.
GATE · who counts
The red cord sets the minimum hold: ANY, 10 min, 30 min, 1 h, 2 h or 4 h. A wallet earns nothing in a round until it has held that long. With ANY, a wallet counts from its first block.
Selling resets the clock
Any sale or transfer out, partial or full, resets that wallet's holding time and loyalty to 1x. Its unpaid share returns to the pot for the others. Rewards already sent stay paid. Buying more keeps the holding time.
Shares follow token balance, so splitting tokens across wallets never raises what you earn. A wallet that receives tokens starts its holding time at zero.
LOYALTY · weight
The blue cord. BAL means shares follow token balance only. 2X, 3X and 5X turn loyalty on: a wallet's weight is its balance times a multiplier that grows with time held, reaching the ceiling after the time on the MAX AFTER knob (1 to 8 hours).
The curve is a square root, so early hours count most:
multiplier = 1 + (maxX − 1) × √(min(held, ramp) / ramp) weight = balance × multiplier share = pot × weight / Σ weight
| Held | 5x after 4 h | 3x after 2 h | BAL |
|---|---|---|---|
| 0 min | 1x | 1x | 1x |
| 30 min | 2.41x | 2x | 1x |
| 1 h | 3x | 2.41x | 1x |
| 2 h | 3.83x | 3x | 1x |
| 4 h | 5x | 3x | 1x |
SPLIT · how much
The green fader sets the holders share of the hook's 2%, from 0 to 100 in steps of 5. The rest goes to the reserve. At 100% the reserve only receives rounding dust; at 0% the hook is a plain fee and holders get nothing, which the panel allows but the recipes never use.
Describe a hook
Write the rule in plain words, up to 600 characters. The reader maps every phrase it knows to a jack, lists what it did not understand, and lists what has no jack at all, with the nearest setting. Your patch changes only when you press Use this hook.
| Phrase | Sets |
|---|---|
| hourly · every 20 min | CLOCK |
| hold at least 1 hour · no minimum | GATE |
| by balance · 3x · after 2 hours · loyal | LOYALTY and MAX AFTER |
| 90% to holders · 30% to reserve · half | SPLIT |
| burn · buyback · dev wallet · team · lottery · USDC | No jack. Listed with the reason. |
Press Read it.
Test on sample wallets
The Test step runs the same simulate() the round worker runs, with sample fees and up to eight sample wallets. Each row shows whether the wallet qualifies, its weight and why.
- A wallet that does not qualify gets no share.
- If nobody qualifies, the holders part stays in the pot for the next round.
- Shares are computed in lamports with integer math. Rounding dust goes to the reserve, never to a wallet.
- A preview is not a transfer. Figures are gross: before network fees and payout minimums.
Recipes and files
A recipe is a named hook. The recipes page holds the official ones and the ones you saved in this browser. Use in workbench loads it into the panel; nothing launches.
| Recipe | Clock | Gate | Weight | Holders |
|---|---|---|---|---|
| Reward loyal holders | 10 min | any | 5x after 4 h | 80% |
| Pay holders hourly | 60 min | any | balance | 80% |
| Split fees | 10 min | any | balance | 50% |
| No paper hands | 20 min | 1 h | 3x after 3 h | 85% |
| Night shift | 60 min | 30 min | 2x after 8 h | 90% |
| Patience pays | 30 min | 10 min | 5x after 8 h | 80% |
The Recipe menu exports a patch as a small JSON file and imports one back. A recipe file holds settings only, never keys or coin data:
{
"jackfield": "0.1.0",
"name": "No paper hands",
"hook": { "v": 1, "every": 20, "minHold": 60, "maxX": 3, "ramp": 180, "holders": 85 }
}Copy share link puts the same thing into a URL (/?h=…), so a patch can travel in a message.
Launch a coin
Launch carries your patch into coin setup: name (32), ticker (10), image (PNG, JPG, GIF or WebP up to 4 MB), optional description, X and site, and an optional first buy. Costs are shown before you sign:
| Item | SOL |
|---|---|
| Rent | 0.01450 |
| Metadata fee | 0.01000 |
| Network fee est. | 0.00009 |
| First buy | your amount, includes the 2.5% trade fee |
How rounds run
A round worker watches every jackfield coin. On each tick of the coin's CLOCK it claims the fees from the pool, rebuilds holdings from the chain, applies GATE and LOYALTY, splits the pot with simulate() and sends SOL to every wallet that earned more than the payout minimum. Smaller amounts carry over.
| Field | Value |
|---|---|
| Sent by | the jackfield round worker |
| How often | on the hook's CLOCK |
| Where to check | the Payouts page, each row with its transaction |
| If paused | the coin keeps trading, fees keep building, payouts resume with the pot intact |
Fingerprint
A hook is serialized with fixed key order and hashed with SHA-256. The fingerprint is jf1_ plus the first 16 hex characters. It is written into the coin's metadata, which cannot change, so anyone can check that a coin is paying by the hook it launched with.
import { fingerprint } from "https://jackfield.vercel.app/lib/jackfield.js"; const fp = await fingerprint({ every: 10, minHold: 0, maxX: 5, ramp: 240, holders: 80 }); fp.id; // "jf1_14ff4d6f13ca442f"
Dry runs and Explore
Explore lists live coins on Meteora's bonding curve and runs your current patch over each coin's real 24 h volume: holder pot per day and per round. Payouts goes further: it takes the last ~300 real trades of a coin, rebuilds who held what, and replays your hook round by round. Every row links the last real trade of that round.
jackfield.js
All the math on this site lives in one ES module with no dependencies. The workbench, recipes, explore and payouts pages import it from the same address you can.
import * as jf from "https://jackfield.vercel.app/lib/jackfield.js"; const hook = jf.RECIPES[0].hook; console.log(jf.describe(hook)); console.log(jf.simulate(hook, 1, [{ balance: 1000, minutes: 0 }, { balance: 1000, minutes: 240 }]));
<script type="module"> import { parse, describe } from "https://jackfield.vercel.app/lib/jackfield.js"; document.body.textContent = describe(parse("hourly, 90% to holders").hook); </script>
curl -O https://jackfield.vercel.app/lib/jackfield.js
node --input-type=module -e 'import("./jackfield.js").then(j => console.log(j.describe(j.DEFAULT)))'Node 20+ needs the file saved with an .mjs extension or a "type": "module" package.
API reference
| Export | Does |
|---|---|
| FEES | { trade: 2.5, meteora: 0.5, hook: 2, creator: 0 } |
| LIMITS | Allowed jacks: every, minHold, maxX, and [min, max, step] for ramp and holders. |
| DEFAULT, RECIPES | The default hook and the six official recipes. |
| normalize(h) | Snaps any object to the nearest valid hook. |
| describe(h) | One plain sentence. |
| multiplier(h, min) | Loyalty multiplier after min minutes held. |
| simulate(h, fees, wallets) | Splits one round. Returns toHolders, reserve, carry, dust and a row per wallet with eligible, mult, lamports, sol, why. |
| parse(text, base?) | Words → { hook, read, unread, unsupported }. |
| fingerprint(h) | Async. { id: "jf1_…", hex }. |
| canonical(h) | The exact JSON that gets hashed. |
| encode(h, name) / decode(text) | Recipe files. |
| dryRun(h, trades) | Replays trades [{ t, wallet, kind, sol, tokens, tx }] round by round, newest first. |
| meteoraCoins(page) | Live Meteora DBC coins from GeckoTerminal, by 24 h volume. |
| poolTrades(pool) | Last ~300 trades of a pool, shaped for dryRun. |
| coinByMint(mint) | One coin from DexScreener. |
| perDay(h, vol24Usd) | Holder pot per day and per round from a day of volume. |
Dry-run a live coin in six lines
import * as jf from "https://jackfield.vercel.app/lib/jackfield.js"; const [coin] = await jf.meteoraCoins(); const trades = await jf.poolTrades(coin.pool); const rounds = jf.dryRun(jf.DEFAULT, trades); console.log(coin.symbol, rounds[0].toHolders, "SOL to", rounds[0].wallets, "wallets");
Runs the snippet above in your browser against the busiest Meteora coin right now.
Press Run dry run.
Limits and threat model
| Risk | What stops it |
|---|---|
| Changing the rules later | The hook is locked at launch and its fingerprint is in immutable metadata. |
| Wallet splitting | Shares follow balance, so ten wallets earn what one wallet would. |
| Wash trading for rewards | Every trade pays 2.5%, and at most 1.6% returns to holders as a group. Wash trading loses money. |
| Snipe, sell, rebuy | Any sale resets holding time and loyalty. A sale and rebuy between two rounds still counts as a sale. |
| Dust payouts | Amounts under the payout minimum carry over instead of being sent. |
| Worker stops | Fees stay in the pool. Payouts resume with the full pot when the worker runs again. |
What hooks cannot do: burn supply, buy back, pay a dev or team wallet, pay in anything but SOL, pick random winners. The reader in Describe a hook says so when you ask.
$JACKFIELD
$JACKFIELD is the coin that runs this panel. It launches with the same hook anyone can patch here, no special jacks: rounds every 10 minutes, 80% of the 2% to holders, loyalty up to 5x after 4 hours.
| Field | Value |
|---|---|
| Ticker | $JACKFIELD |
| Chain | Solana |
| Contract | soon |
| Hook | Reward loyal holders · jf1_14ff4d6f13ca442f |
FAQ
Do holders need to claim or stake?
No. Holding the coin in a wallet is enough. SOL arrives every round the wallet qualifies.
Why is my reward zero in the test?
Either the wallet holds no tokens, or it has not passed the GATE yet. The Why column says which.
Can I change a hook after launch?
No. Patch a new one and launch a new coin. That is the point of the fingerprint.
Where do the Explore numbers come from?
GeckoTerminal for Meteora pools and trades, DexScreener for $JACKFIELD once it trades. Nothing is estimated beyond the hook math shown on each card.
Is the reserve a creator fee?
No. Creators get 0%. The reserve funds the round worker and the panel, and catches rounding dust.