Hooked Whitepaper

Part I

How it works

Product story in plain language.

Hooked is a token you trade on Uniswap against USDG. When you buy, the protocol can roll a multiplier and send you more token than you just bought — paid from a rewards pool. On the same buy you can also hit a jackpot in USDG. Trade the token, sometimes leave with more of it, sometimes leave with stablecoin prize money.

01 · Buy or sell

On a swap.

Buys and sells both pay a protocol fee. That fee is what funds everything:

  • Token rewards — on buys, a Main share goes into the rewards pool that pays multipliers (floor 0.9×, ceiling up to ×4).
  • Jackpot bank — a share of buys and sells is converted to USDG and sits in a separate prize pool. Only buys can win it.
  • Ops — a smaller USDG share covers running the product.

On a buy the sequence is: you spend USDG, receive Main at the pool price, the fee is taken and split. Buys at or above the minimum size open a ticket for the multiplier and jackpot; smaller buys still fund the pools. On a sell you pay the sell fee into jackpot and ops; there is no jackpot ticket and no rewards multiplier on the sell side.

02 · Multiplier game

Token rewards.

On a swap the fill is priced at the pool, then a multiplier rolls on what you put in. The floor is 0.9× — the trade went through, you just did not get lucky. Higher multiples are paid from a rewards pool of the token itself, filled by the buy-side token fee.

Those regular wins are tuned so that, ignoring the jackpot, expected return sits around 95% RTP.

0.9×

floor

Swap cleared, no luck.

95%

rtp

Regular rewards only.

up to ×4

ceiling

Paid from the token pool.

03 · Soft burn

Deflation.

RTP under 100% means more token enters the rewards pool than leaves as wins. In expectation a slice of flow stays on the contract and does not trade on the market. The protocol can also burn that surplus, permanently removing it from supply. Either way, higher volume tightens free float over time.

04 · Paid in usdg

Jackpot.

A separate bank in USDG. Buys and sells top it up. Only buys can win.

On a buy, fees split between token rewards and the USDG jackpot. Buys at or above the minimum size open a ticket (default $10); smaller buys still fund the pools but do not play. Later that ticket is settled permissionlessly: miss or hit. Bigger buys land in higher size buckets with better odds. Bucket thresholds and base chances are protocol parameters.

A hit pays a fixed share of the current bank (default half) in USDG. The rest stays for the next winners. Because the prize is USDG, winners cash out without selling Hooked into the chart.

After every hit, odds are recalculated on-chain. The payout is compared to a target sized from market cap, with a floor for small caps and a ceiling for large ones. If the payout is above target, odds step up. If it is below, odds are cut. This way, the RTP can reach 100%+ at any given moment. Hard min and max bounds keep chances inside a sane range.

~50%

of bank

Default payout on a hit. Rest stays in the bank.

live odds

after each hit

Scaled by payout vs target, then clamped.

100%+

rtp

Can exceed 100% at any given moment.

05 · Volume and attention

The loop.

Volume fills the USDG bank. Hits and moving odds keep attention on the product. That attention brings more volume, which refills the jackpot and pushes more token into the rewards pool, tightening supply further.

Jackpot prizes are paid in USDG, so the loop does not mint Hooked to pay winners and does not force prize dumps into the book. It turns over volume while deflation compounds on the token side.

At a larger market cap, staking for holders may share protocol revenue. That sits outside the swap and jackpot core.

Part II

Protocol reference

Fees, tickets, randomness, odds, payouts, and who can call what.

Architecture

Stack.

Hooked’s own on-chain surface is these contracts around a Uniswap v4 Main/USDG pool. Uniswap’s PoolManager, position manager, and the routers users trade through stay external — Hooked does not replace the AMM.

  • MainToken — the listed ERC-20. Transfer rules are tied to the hook and pool (allowances for fee legs and LP). Listing requires Main to sort as token1 vs USDG. During a buy it can track the terminus of Main flow for that buyId so settle can pay without a trusted off-chain recipient.
  • HookedV1 — the Uniswap v4 hook on that pool. Owner-gated init, LP only via the configured position path, exact-input swaps. On after-swap it takes fees, on buys converts the jackpot/ops Main slice to USDG, pays rewards Main to the collector, USDG to jackpot and ops, and emits buy attribution (buyId).
  • RewardsCollector — receives the buy-side Main rewards share, opens multiplier tickets (with a fixed future drand round), and pays the regular multiplier game (0.9×–×4) when JackpotPool settles. Surplus Main that is not paid out can sit on the contract or be burned.
  • JackpotPool — receives USDG jackpot shares, opens a ticket per buy, runs permissionless drand settle for both jackpot and rewards, pays winners in USDG, and rewrites bucket odds after hits using the mcap target.
  • DrandOracleQuicknet — verifies drand quicknet BLS signatures on-chain. JackpotPool only accepts a settle signature after this check (or a previously pinned signature for that round).

Ops is a wallet, not a contract: it simply receives the ops USDG share from the hook. Anyone may settle ready tickets and earn a small USDG tip; a public bot is optional, not a privileged role.

Swap routers sit between the user and the pool, so HookedV1 never sees a reliable end-buyer address at swap time. The payee is resolved on-chain at settle: MainToken buy terminus for that buyId, else the recorded buy origin when it is not a known ERC-4337 EntryPoint. Settle cannot invent tickets; every ticket requires a prior fee from the hook.

Immutable in the hook

Fee splits.

SideTotalSplit
Buy 10% of Main out 6.5% Main to rewards · 2% to USDG jackpot · 1.5% to USDG ops
Sell 3.5% of USDG out 2% to jackpot · 1.5% to ops

On buys, the jackpot and ops Main slices are converted to USDG inside the hook, then transferred. JackpotPool credits the bank. Qualifying buys also open a ticket. Sells only add USDG to the bank.

Buy size for odds is the exact USDG spent on the buy (quoteAmountIn), read from the rewards ticket. Buys below minBuyUsdg do not open a ticket.

Lifecycle

Jackpot flow.

  1. Fee in. The hook transfers USDG and calls receiveJackpotFee; RewardsCollector records the buy and fixes a future drand quicknet round for that buyId.
  2. Ticket. On a qualifying buy, JackpotPool stores notional size and marks the ticket open. No random roll happens here.
  3. Settle. After that round is published, anyone calls settleWithDrand (or a batch) with the round and BLS signature. The contract verifies the signature, resolves the payee on-chain, and settles jackpot and multiplier in the same transaction.
  4. Miss. The jackpot ticket closes. The bank is unchanged (multiplier may still pay a Main bonus).
  5. Hit. The contract pays payoutBps of the current bank (default 50%) in USDG to the payee, then regulates odds against the current target.

Anyone can seed the bank with USDG up front so the first prizes have a floor. The settler receives a small USDG tip per resolved ticket. Double-settling the same buy id reverts.

Entropy

Randomness.

The outcome is deliberately unknown at purchase time. Opening a ticket records size, metadata, and a future drand quicknet round (with a short safety buffer past “now”). The roll happens only after that round’s signature exists and someone settles.

Settle verifies the BLS signature for the ticket’s target round on-chain. Jackpot and multiplier each derive an independent roll from the signature and buyId (domain-separated hashes), not from prevrandao, recipient, or trade size. A jackpot hit occurs if the jackpot roll is strictly below the win probability for that ticket’s size bucket.

Because the target round is fixed in the future at open, the result cannot be known from the buy alone. Settlement is permissionless: any caller may submit the published signature; the payee is resolved on-chain. Tickets still cannot be invented without a prior fee from the hook.

Buckets, target, payout

Odds & payouts.

Buckets. Odds are a table of size bands. Each band has a minimum notional and a win probability in WAD. A ticket uses the highest band whose minimum it meets. Below the lowest band, win probability is zero. Thresholds and starting probabilities are protocol parameters.

Payout. On a hit the contract pays poolBalance × payoutBps / 10000 in USDG (default 50%). The remainder stays in the bank for later hits.

Target. After a hit, the protocol computes

target = min(ceiling, max(floor, mcap × mcapShare))

Market cap is Main total supply priced in USDG from the Uniswap v4 pool spot (Main as token1, USDG as token0). Floor covers low-cap launches; ceiling caps the target on large caps.

Regulator. Every band probability is rewritten after a hit:

new_p = clamp(old_p × (payout / target), p_min, p_max)

Payout above target raises odds. Payout below target lowers them. p_min / p_max stop the table from collapsing or exploding. Odds are therefore live state, calculated on-chain after each win, even though the surface is a bucket table.

Regular rewards (separate from the jackpot) draw multipliers from the Main rewards pool with a 0.9× floor and a high ceiling (up to ×4), targeting ~95% RTP on that layer alone. Both games settle in one permissionless drand call; only the jackpot leg uses size buckets and the post-hit regulator.

Access

Roles.

RoleResponsibility
HookOnly address allowed to push fees into RewardsCollector / JackpotPool when configured.
SettlerAnyone. Calls settleWithDrand with a verified drand signature; receives the USDG tip. No privileged recipient argument.
OwnerBinds the mcap pool, sets odds bounds and targets, replaces bands, sets drand oracle, rotates hook wiring.