Fee shares
The Free and Standard editions of Coldtill charge a sweep fee: 2% on Free, 1% on Standard, nothing on Pro. The fee is taken on chain, by the same contract that moves a payment from its deposit address to your cold wallet. It is not sent to a company account. Each chain has 100 fee-share NFTs, and every share is entitled to exactly 1% of all the fees collected on that chain, in every coin and token, for as long as the contracts exist.
This page explains where the fee goes, how holders get paid, which addresses to check, and the risks.
How a fee travels
- A customer pays to a deposit address. On Ethereum-style chains and Tron this is a CREATE2 address of your own fee factory. On Solana it is an address of the Coldtill deposit program.
- A sweep moves the balance out. The deposit wallet sends the fee to the factory (on Solana, the fee vault) and the rest to your cold wallet in the same transaction. The fee rate is fixed in the factory when it's deployed, and the contracts refuse anything above 2%.
- Anyone can call
withdrawFeeson the factory (on Solana,withdraw_sol_fees/withdraw_token_fees). This sends the accumulated fees to the fee shares contract. - The fee shares contract splits everything it has ever received 100 ways. Each share can take its 1% whenever its holder likes.
The fee shares address is built into each factory and can't be changed later. A separate FeeConfig contract
holds an emergency override: its owner can point fees somewhere else, for example if a bug were found in
the shares contract, and clear the override again. Once the contracts have had an outside audit, FeeConfig
will be locked. Locking requires the override to be cleared first, so after that the fee shares contract is the
permanent destination and nobody can redirect fees.
Getting paid
Fees build up inside the shares contract until someone releases them. Unclaimed fees stay with the NFT: if you sell a share, the buyer gets whatever it hasn't paid out yet.
| Chain | Pay the current owner (anyone can call) | Pay somewhere else (owner signs) |
|---|---|---|
| Ethereum, Base, Polygon, BNB Chain | release(token, ids) |
claim(token, ids, to) |
| Tron | release(token, ids) |
claim(token, ids, to) |
| Solana | release_sol / release_token |
claim_sol / claim_token |
Use token = 0x0000000000000000000000000000000000000000 for the native coin (ETH, POL, BNB or TRX), or the
token's contract address, for example USDC. releasable(token, id) shows what a share can take right now.
Contract wallets and escrows. release only pushes money to ordinary wallets (on Ethereum-style chains,
EIP-7702 smart wallets count as ordinary). If a share sits in a contract, such as a marketplace escrow, a
lending vault or a bridge, a stranger's release skips it. The fees wait until the share is back in a wallet,
or the contract claims them itself. On Solana the same rule applies to program addresses (OwnerNotWallet).
That's why you should claim before you list a share for sale in an escrow: whoever buys it gets what you
leave behind.
Example with Foundry's cast on Linux, releasing USDC on Base for shares 1 to 3 to whoever owns them:
cast send --rpc-url https://mainnet.base.org --interactive \
<fee shares address> "release(address,uint256[])" \
0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 "[1,2,3]"
On Tron, call the same functions from Tronscan's contract page. On Solana, any wallet or script can send the instructions. The program's IDL is published with the source.
Energy and gas. Each share released writes to storage, so large batches are expensive. On Tron, release 20 shares or fewer per transaction to stay within normal wallet fee limits.
Addresses
Each address is filled in here once it's deployed and verified on that chain's explorer. These are the planned deterministic addresses, so you can check them before deployment.
| Address | |
|---|---|
| Fee shares, Ethereum-style chains (same address on Ethereum, Base, Polygon and BNB Chain) | 0x4F812E3472d97bdc56683Fc5018d58c95e2F8178 |
| FeeConfig, Ethereum-style chains | 0xF743d7225E5ad4e645bFa25d6AB2b7750D3d2b9b |
| Fee shares, Tron | Published at deployment |
| FeeConfig, Tron | Published at deployment |
| Solana fee shares program | B6tSSnbUQ75Z1aGSu1buZuZF4gezbgzUzMUG7uWXLTpt |
| Solana distributor (receives the fees) | 6wf24krP6jU7MEek9ENWggv9vHzaxUCnjJ5EzeWkHRJv |
| Solana collection | Published at deployment |
| Solana deposit program | EuGW7oFaoXT2acbTyNUzhRjs4sY1W8iq7BPKkGWZ1bk8 |
| Solana fee vault | 2uJo9cLWjPqe9iPxNzr98XFcwuqE6aNi6NFm9hwMCQen |
To check an Ethereum-style address yourself, build the coldtill-fees tool from the repository. It derives the
address from the published bytecode:
cd app && go run ./cmd/coldtill-fees predict-shares 0x3aCE43fF471b342Cd64206F08A1C6Ce9b654E548
The dashboard's fee page shows the FeeConfig and fee shares addresses compiled into your build. A fee factory
won't deploy against an address with no contract code, so a build carrying the wrong network's addresses
fails safely.
Rules fixed in the contracts
- Exactly 100 shares per chain. No minting, no burning through the contract, no owner and no upgrade path on Ethereum-style chains or Tron.
- Shares can't be sent to the shares contract itself.
- Payouts are worked out from balances: everything received equals the current balance plus everything already paid out. Up to 99 base units per token can sit undistributed until more fees arrive.
- On Solana the 100 assets are a Metaplex Core collection. The collection's update authority is given to the System Program after minting, so nobody can add assets or move them out of the collection. The distributor's list of 100 assets is closed for good once registration is finalised.
Risks
- Not independently audited yet. The contracts went through an internal review with automated tools, fuzzing, mutation testing and three AI-assisted reviews. See the fee contracts audit report. Nothing is locked until an outside firm has reviewed them.
- Override and upgrade keys. Until
FeeConfigis locked, its owner can redirect future fees. The Solana programs stay upgradeable until the audit. These keys move to a multisig before locking. - Front-running.
withdrawFeesis permissionless, so someone can withdraw to the current destination just before an override change takes effect. - Unusual tokens. Fee-on-transfer, rebasing and double-address tokens, Tron TRC10 tokens, and Solana Token-2022 mints with transfer hooks or permanent delegates aren't supported. Coldtill only sweeps native coins, USDC and USDT, so in practice fees arrive only in those.
- Burned or lost shares. On Solana, burning a share forfeits its 1% forever. On every chain, a share sent to an address nobody controls is lost with its fees.
- Blocked holders. If a stablecoin issuer blocks a holder's address, that holder can
claimto another address. Other holders aren't affected.