Auto-compounding LP: getting $HUBZZ off Bags
Every trade on $HUBZZ pays a small fee. Right now those fees flow through a contract that Bags built and controls. The plan is to redirect them, permanently, into a pool that no one (including us) can ever pull from. This post explains what's locked, what's changing, and the one thing that has to stay trusted.
The dependency.
$HUBZZ launched on Bags. The token is free of mint and freeze authority, but the fee plumbing still runs through Bags' contract.
When someone trades $HUBZZ on its pool, the swap fee is captured by a Bags contract called Fee Share v2. The contract has a config account that records who can claim those fees. We checked that config on-chain. Here is what it says, today.
Two things matter here. First: 100% of fees are routed to a single wallet (the "claimer"). Second: the claimer is locked into the contract by design. There is no instruction, anywhere, that lets us swap that wallet for a different one. That's not a bug we can fix on our side. It's the shape of the contract.
Trust shouldn't stay here.
One wallet, controlled by humans, sitting in the middle of every fee dollar is the exact shape we want gone.
A wallet is the middleman.
The claimer wallet can take the fees and do whatever it wants with them. We've been honest about that, and so far the answer has been "burns and operations." But "you have to trust us" is not the story this project tells.
A contract is the middleman.
Replace the wallet's job with code that can only do one thing: take the fees and immediately deposit them into a pool that no one can ever drain. Once that's running, the project's liquidity grows on its own, forever.
flowchart LR P1["Trades on
Bags pool"] --> F1["Bags Fee
Share v2"] --> W["Claimer wallet
(humans)"]:::burn --> X1["Burns, ops,
discretion"] classDef burn fill:#13110F,stroke:#E56A35;
flowchart LR P2["Trades on
our pool"] --> F2["Bags Fee
Share v2"] --> K["Narrow
keeper"]:::accent --> C["Crank
contract"]:::mint --> L["Permanently
locked pool"]:::mint classDef accent fill:#1B130E,stroke:#E56A35,color:#E56A35; classDef mint fill:#0B0C0E,stroke:#E56A35,color:#E56A35;
A pool that deepens itself.
We move from one Bags pool to a second pool that we create on Meteora's DAMM v2, owned by a contract instead of a wallet, with the liquidity permanently locked.
Claim the fees.
Pull the accumulated trading fees out of the Bags contract.
Balance them.
Convert what we got into the right ratio for the new pool's two sides.
Deposit them.
Add the balanced amounts into our own pool's liquidity position.
Lock them.
Mark the new liquidity as permanently locked. It can never leave.
flowchart TB K["Keeper signs
claim_user"]:::accent F["Bags Fee Share v2
— pending"]:::pool B["Balance to
pool ratio"]:::step D["Deposit into
locked position"]:::step L["permanent_lock
on new delta"]:::mint P["HUBZZ / wSOL pool
on Meteora DAMM v2"]:::pool K ==> F F ==> B B ==> D D ==> L L -.->|"floor grows"| P P -.->|"more trade fees"| F classDef accent fill:#1B130E,stroke:#E56A35,color:#E56A35; classDef step fill:#050608,stroke:#2A2C31; classDef mint fill:#0B0C0E,stroke:#E56A35,color:#E56A35; classDef pool fill:#15171B,stroke:#4A4D54;
"Permanently locked" is a real on-chain state on Meteora's DAMM v2. Liquidity moved into that bucket cannot be withdrawn under any condition. There is no unlock instruction. Fees still accrue to the position, which is why the loop deepens.
Honest about the one piece.
The downstream half (pool, position, lock, anyone-can-crank deposit) is fully on-chain and trustless. One step in front of it isn't, and we can't fix that.
The locked actions.
Three of the steps below are irreversible on purpose. That's the feature, not a risk to talk around.
Status, honestly.
Three of five phases complete. The contract is written, audited, and proven against real mainnet state on a fork. Mainnet deployment is the next gated step.
Track the migration as it happens at /lp — the live status page. Every number on that page is read directly from Solana mainnet.
Code, not a wallet.
Today, fees on $HUBZZ pass through a wallet we control. Tomorrow, they pass through a contract that can only deepen the pool. The wallet's job shrinks to one signature. The pool's depth grows on its own, forever.
Trading fees stop being income, and start being permanent floor.