Documentation

BotFreeze detects trading bots from their order-book behaviour and freezes them at the token contract, so a frozen wallet can no longer send or receive your collection anywhere, not just on one marketplace.

What it does

Bots spam collection offers below fair value, camp the cheapest listing, and cancel and relist every time someone undercuts them. Blocking them on a marketplace doesn't work, because the marketplace isn't the asset. They simply trade elsewhere.

If your collection is ERC721-C, it already ships with the fix: Limit Break's transfer validator includes an account-freezing mode. A frozen account cannot send or receive tokens of that collection, enforced by the contract on every transfer. BotFreeze works out which wallets deserve it, and drives that switch for you through a permission narrow enough that you never hand over control of your collection.

Detection scores order-book behaviour only. Buying, selling, sweeping a mint and flipping are never scored. Purchases are invisible to it.

Requirements

Free to use, free to set up. You don't need an AlloPass for any of it. It is there if you want to back the project, and it gets you the other tools we build.
AlloPass

opensea.io/collection/allopass

1180 APE floor350 holders555 items
  • An ERC721-C collection using Limit Break's CreatorTokenTransferValidator. Not sure? Open a ticket and we'll check it in a minute.
  • Ethereum, ApeChain or Robinhood Chain. The validator, Safe and Zodiac contracts deploy to identical addresses on all three.
  • The wallet that currently owns the collection, in a browser wallet, plus gas on that chain.
  • The collection indexed on OpenSea, since detection reads its order flow.

Setup guide

The setup wizard walks through this in your browser. Around 15 minutes and six or seven signatures. The order matters: nothing is handed over before the thing receiving it has been proven to work.

1

Connect the owner wallet

Connect the wallet that owns the collection contract, and check you're on the right network. If your collection is on ApeChain, your wallet needs to be too.

2

Deploy a Safe

A Safe multisig will hold your collection's ownership instead of a single private key. Add any co-signer addresses, one per line; your connected wallet is included automatically.

One Safe per collection. A Safe carries one freezer wallet and one Zodiac role, and it becomes the collection's owner, so sharing a Safe ties two collections together even when they started from different wallets. Setting up a second collection deploys a second Safe; the wizard will not quietly reuse the first, and it marks any Safe that already protects something so choosing it is deliberate.

It deploys with a signature threshold of 1 so the wizard can execute each step. Leave it there for now; raise it afterwards. Already have a Safe? Paste its address instead.

3

Prove the Safe can execute

Sends a harmless zero-value transaction through the Safe.

Don't skip this. The next step makes the Safe your collection's owner. That is reversible, because the Safe can hand ownership back whenever you want, but only if the Safe can actually execute transactions. If it can't, nothing can ever hand ownership on again and your collection's admin is stuck there permanently. This proves it works while that's still a harmless thing to discover.
4

Transfer collection ownership to the Safe

Pick your collection from the list found on-chain, or paste its address. You can reverse this at any time: as the owner, your Safe can transfer ownership back to your wallet or anywhere else.

Collections do not all name this the same way. Most call it transferOwnership, thirdweb contracts call it setOwner, and the wizard reads your contract to work out which one it has before sending anything. It then reads the owner back from the chain rather than trusting the receipt, so a two-step ownership contract that has only nominated the Safe is reported as such instead of passing as done.

5

Enable account freezing

Sets the V5 transfer validator on your collection and turns on account freezing (shown as GO2). Without this, the contract has no freeze capability and nothing else works.

The ruleset used is Blacklist with an empty list, which restricts nobody. That detail matters: account freezing is enforced by the ruleset, not by the validator itself, and Limit Break's Vanilla ruleset allows every transfer without ever reading the frozen list. Under Vanilla a wallet can be frozen, reported as frozen by every getter, and still trade freely. Blacklist checks the frozen list first, so with nothing blacklisted the trading rules are identical and freezing actually applies.

If your collection already sits on another transfer validator, whatever that one enforces is read first and rebuilt on V5: the whitelist, the blacklist and the authorizers, with the matching ruleset. A collection has only one validator slot, so without this the old rules would simply stop being consulted the moment the slot changed, and nothing would say so. Freezing does not depend on the ruleset, so a whitelisted collection keeps its whitelist and gains freezing.

The order is deliberate. V5 is configured completely before your collection is pointed at it, so at no moment is the collection sitting on a validator that has not been set up yet.

6

Generate and fund the freezer wallet

A wallet is generated server-side to sign freeze transactions. You only ever see its address. The private key is encrypted at rest and never sent to a browser. Send it a small amount of gas with Load up gas.

7

Configure Zodiac Roles

Deploys the Roles module, enables it on your Safe, scopes the validator as its only target, and permits exactly two functions: freezeAccountsForCollection and unfreezeAccountsForCollection.

Several transactions in a row, so let them all confirm. This step is what limits the automation to a freeze button and nothing else.

After setup

Detection starts on its own, using a live marketplace stream plus a periodic full scan. Your dashboard shows:

  • Open findings: flagged wallets, their score, and the named signals behind each one. Filter by whether this collection caught them or the swarm brought them in. A wallet holding your tokens sits here and is not frozen while it holds.
  • Frozen accounts: split by who decided, so freezes by detection, freezes carried in by the swarm, and freezes you made by hand are three separate lists. Each row carries the signals it rested on and its freeze transaction. Tick several and unfreeze them in one go.
  • Unfrozen: wallets that were frozen and have since been released, and who released them: you, an admin, or the system itself when it found one holding tokens. A freeze that was undone stays visible instead of disappearing.
  • Search: paste an address or a username and both tables filter to it. This is where a report from a frozen collector starts.
  • Case file: click any wallet for what it actually did, which signals fired with their measurements, and its recent order history from OpenSea.
  • Manual freeze: for wallets you identify yourself. Balances are checked first, and freezing one that still holds your tokens asks you to confirm.
  • Freezer wallet: its gas balance, with a top-up button and a low-balance warning.
  • Export: open findings and frozen wallets as CSV.
You sign in once with your Safe-owner wallet and that session covers everything you do for the next few hours. The signature authorises no transaction and moves nothing; it only proves the wallet is yours. Reading the dashboard asks for nothing at all. Exporting the freezer key is the one exception and always asks separately.

Your controls

Two switches sit at the top of your dashboard. Both are yours, and neither needs us.

  • Auto-freeze. On by default: a wallet that qualifies is frozen the moment it holds nothing. Turn it off and nothing is ever frozen without you. Detection keeps running, findings keep arriving, and each one waits for you to press Freeze. Turning it back on picks up everything that qualified while it was off.
  • Swarm. On by default: a wallet that detection froze on another collection we protect arrives here as a finding, and the wallets your collection catches are shared the same way. Freezes made by hand are never shared, because one owner's decision about their own collection is not evidence about anyone else's. Leave the swarm and it stops in both directions, and anything it had already brought in is dropped on the next pass.
A third setting is off unless you ask for it: freezing wallets that still hold your tokens. See how freezing works for why that one is deliberately awkward.

How detection works

Wallets are scored on behaviour, not identity. No blocklists, no reputation database. A wallet that stops behaving like a bot stops scoring like one, and a fresh wallet gets no clean slate because there was never a slate.

The two shapes of bot

The loud ones are easy: bursts of offers, one token relisted five times, cancel-and-relist loops. The interesting ones pace themselves under any rate limit, one offer every fourteen minutes, forever, and volume detection never sees them.

But evading a rate limit means running a schedule, and a schedule has a rhythm. People trade in ragged bursts and then sleep; schedulers don't. So regularity and endurance are scored alongside volume, over a rolling window of retained history rather than a single scan. One order every fourteen minutes never fills one page of activity, but across a day it is unmistakable.

Signals

A score needs at least one primary signal, meaning bot mechanics with no ordinary explanation, before it can cross the threshold. Corroborating signals describe patterns a hard-shopping collector also produces; they can support a primary signal but never convict alone.

  • collection-offer-spamPrimary

    Repeated collection-wide offers in a short window. One order covers every token, so repetition is spraying the book.

  • trait-offer-spamPrimary

    The same pattern against a trait rather than the whole collection.

  • same-token-offer-spamPrimary

    One token bid on over and over, the outbid loop. A person raises a bid once or twice, not repeatedly for half an hour.

  • item-offer-spamPrimary

    Item offers at machine scale in a short window. Bidding on a few different pieces is shopping; hundreds an hour is not.

  • same-token-relistPrimary

    One token relisted repeatedly, to hold the cheapest slot by undercutting.

  • listing-spamPrimary

    Rapid listings across many tokens, the floor-tracking pattern.

  • cancel-spamPrimary

    A burst of cancellations spread across distinct minutes. A bulk “cancel all” click does not qualify.

  • metronomePrimary

    Orders on a near-constant interval. A human placing offers every fourteen minutes to the minute, for hours, does not exist.

  • repeat-burstsCorroborating

    Separate clusters of orders far apart, like a scheduled job waking up.

  • sustained-volumeCorroborating

    Order counts over an hour, six hours, and a day.

  • round-the-clockCorroborating

    Active across most hours of the day. People sleep; schedulers don't.

  • list-cancel-churnCorroborating

    Cancellations matching placements at volume, an order book churned rather than traded.

  • offer-listing-churnCorroborating

    High-frequency offers and listings running together.

Exact thresholds are tunable per collection and deliberately not published. Naming them would tell an operator precisely how slowly to run, which is what makes plain rate limits easy to beat.

Guards against false positives

  • Offers are scored by instrument. A collection or trait offer covers every matching token at once, so repetition is spray. An item offer names one token, so it's judged on repetition against the same token or on machine scale, never on a short burst across several. Bidding on a few different pieces is shopping.
  • A bulk “cancel all” is one click that emits many events at the same instant. Simultaneous cancellations collapse into a single unit of activity, and cancel signals require the cancels to be spread over distinct minutes.
  • Every score is explainable: named signals with plain-English detail, visible before anything happens.

How freezing works

A frozen account cannot send or receive tokens of your collection. It is enforced by the token contract on every transfer, so it follows the wallet to every marketplace, aggregator and private transfer. It is not a marketplace ban.

Nothing is frozen while it still holds. A flagged wallet that owns tokens goes on a watchlist, not the frozen list. Its balance is checked each cycle, and it is frozen the moment that balance reaches zero. The bot gets one exit and no way back in, and no NFT is ever trapped in a frozen wallet.

There is one case where waiting does not work, and it is not a rare one. A trading bot that always keeps stock never reaches a zero balance, so the guard that protects collectors shields it forever. Such wallets sit in your findings like any other, with what they hold shown beside them. You can still freeze one from its row: the dashboard checks the balance first and asks you to confirm, because its tokens stay locked until you unfreeze it, which is the cost of the choice and why it is yours.

The rule is enforced in both directions. Every cycle also checks the wallets that are already frozen, and any that turns out to hold tokens is unfrozen and returned to the watchlist, where it is frozen again once it sells out. That matters after a misconfiguration: a wallet frozen while the ruleset was not enforcing anything could have kept buying, and turning enforcement on would otherwise strand everything it had bought.

Freezing is also idempotent: the current frozen set is read before every action, and accounts already in the requested state are skipped without sending a transaction. Unfreezing parks a wallet rather than returning it to the auto-freeze queue, so a deliberate unfreeze is never undone by the next tick.

If we get it wrong

Detection is a judgement about behaviour, and judgements can be wrong. A collector who bulk-lists an inventory, cuts a price four times in ten minutes, or raises a bid after being outbid can look like a machine from the outside. When that happens, this is what you have.

  • Read the case first. Click the wallet. You get every signal with the numbers it was measured on, and the wallet's own recent orders from OpenSea: how many collections it traded, how many different tokens and traits, whether it kept returning to the same one, whether a relisted token moved in price. A collector shopping across projects and a bot working one order book do not look alike once the numbers are in front of you.
  • Unfreeze is immediate. One row or a whole selection, in a single transaction. The confirmation lists exactly which wallets it will release before it sends anything.
  • A released wallet is never re-frozen automatically. Releasing it is a decision, and the system does not overrule it on the next pass. It stays on the dashboard, and only you can freeze it again.
  • Nothing is stranded, and it is checked both ways. A wallet holding your tokens is not frozen. If one ends up frozen while holding anyway, every pass finds it and releases it.
  • Tell us. A wrong freeze is a bug in the scoring, not bad luck. Open a ticket with the address: several rules have been rewritten off the back of exactly one wallet that should never have been flagged.
Freezing blocks transfers, not order posting. A frozen wallet can still list and bid, so a collector will keep seeing their own orders appear; they simply cannot settle until you unfreeze them.

Security model

You are pointing automation at your collection's admin rights, so the system is built assuming you don't trust it.

The automation canIt cannot
freezeAccountsForCollectiontransfer collection ownership
unfreezeAccountsForCollectionchange the transfer policy or ruleset
that is the whole listmove funds from the Safe
mint, burn, or touch metadata
  • Your keys stay yours. Every step is signed in your own browser wallet. Nothing is transmitted, held or requested.
  • You own the Safe. Its signers are your wallets. We are not among them and cannot add ourselves.
  • The freezer key is encrypted with AES-256-GCM, keyed by a secret held in the environment rather than the database. A database dump alone cannot spend it; the environment variable alone cannot either.
  • Not a promise, an on-chain constraint. The Roles module rejects any transaction outside its scope. A full compromise of our server yields a freeze button and nothing more.
  • Revoke in one action. Disable the module from your Safe and the automation stops immediately, with no cooperation from us.
  • Take the key. The dashboard exports the freezer wallet's private key to any Safe owner who signs for it. Nothing is held hostage.

Hardening: raise your Safe to 2-of-2

Setup runs at threshold 1 so the wizard can execute with a single signature. Once freezing is confirmed working, raise it. With two signers, taking your collection requires compromising both wallets.

It costs you nothing operationally. Bot freezing keeps running unchanged, because the freezer acts through the Zodiac module and Safe modules execute without collecting owner signatures. That is exactly why the freeze permission was granted through a module rather than to an owner.

What does need both signatures afterwards: changing your validator policy, writing to your collection contract, and adding or removing signers, which are the actions you'd want two people on. Do those from app.safe.global, since collecting a second signature isn't built into this app yet.

Add your second signer from the Safe page while still at threshold 1, then raise the threshold from the Safe interface.

Changing collection settings on OpenSea

OpenSea decides who may edit a collection by reading the contract's owner. After setup that owner is your Safe, so your personal wallet no longer has edit rights on its own. This catches most people out the first time they try to change a banner.

Do this once and routine edits stop involving the Safe: connect the Safe, then add your everyday wallet as a collaborator. Collaborators can edit the banner, logo, description, category and links. Two things stay owner only, so they always need the Safe: creating new items, and changing creator earnings.

Connecting the Safe to OpenSea

A Safe is a contract rather than a keypair, so it signs through EIP-1271 instead of producing an ordinary wallet signature. OpenSea supports this. It is the same mechanism a Safe already uses to approve listings.

  1. On OpenSea choose Connect wallet, find WalletConnect, and click the copy icon to copy the pairing code. Copy the text rather than scanning the QR code.
  2. Open your Safe at app.safe.global on the same network as the collection, and click the WalletConnect button in the header. A dropdown opens with a Paste button that reads the code from your clipboard, so allow clipboard access if the browser asks.
  3. Approve the connection. The dapp's icon then appears in the Safe header, which is how you know the session is live.
  4. OpenSea will ask for a signature to sign in. Confirm it in the Safe. At threshold 1 it completes straight away.
  5. Go to OpenSea Studio, pick your collection, Collection details, Add collaborator, enter your everyday wallet address or ENS name, then Publish changes.

If the sign-in gives you trouble

Two things account for most failures. Check the Safe is on the same network as the collection before pairing, because a chain mismatch breaks the session quietly. And check whether the signature request is sitting in your Safe's queue waiting for confirmation, since the browser tab does not always surface it.

If OpenSea refuses the Safe login altogether, you can transfer collection ownership back to your own wallet, add the collaborator while signed in normally, then transfer ownership to the Safe again. Bear in mind that freezing stops working while the Safe is not the owner, because the validator requires the caller to be the collection's owner, so keep that window short.

Setting it on-chain instead

If your contract exposes a setContractURI function, the collaborator list and the collection artwork can be set from the contract itself under ERC-7572, with no OpenSea sign-in at all. The metadata JSON accepts name, description, image, banner_image, featured_image, external_link and collaborators. Check for the function on your collection's Contract page, which routes the call through the Safe for you.

ERC-7572 also asks the contract to emit ContractURIUpdated() whenever contractURI() changes. That event is the signal marketplaces watch to re-read the metadata, so a contract that updates the URI without emitting it can leave OpenSea showing the old values indefinitely.

OpenSea does not document whether on-chain values override ones already saved in their dashboard. If an on-chain change does not appear even after the event fired, that is the likely reason, and the dashboard route above is the fallback.

Troubleshooting

A freeze failed

Almost always the freezer wallet is out of gas. Top it up from the dashboard and retry. If it still fails, the operator may not yet be assigned the freeze role. Check that the final Zodiac transaction in step 7 confirmed.

“Transfer would revert”

Usually the connected wallet isn't the collection's current owner. Check you're on the right wallet and the right network.

Setup got interrupted

Reconnect and reopen the wizard. Progress is saved per wallet and re-detected from on-chain state, so it resumes rather than restarting.

A wallet was flagged that shouldn't be

Open the finding and read its signals. They say exactly what triggered it. Set the wallet to ignored to take it out of the freeze queue, and tell us what it was doing; if the pattern is legitimate, the scoring gets fixed rather than the wallet excused.

Editing your collection on OpenSea

OpenSea reads edit rights from the contract's owner, which is now your Safe. See Changing collection settings on OpenSea for the full walkthrough.

FAQ

Who can use BotFreeze?

Anyone running an ERC721-C collection on Ethereum, ApeChain or Robinhood Chain. Open a ticket and we'll set it up with you. An AlloPass is not a requirement. It is a way to support the project, and it opens up the rest of what we make.

Will this freeze my real collectors?

Purchases are never scored, so buying, sweeping and flipping can't flag anyone. Volume alone can't either, because a primary signal is required. And nothing is frozen while it still holds tokens.

Can a frozen bot still post offers?

Yes. Freezing blocks transfers, not order posting, so you'll still see its orders in the activity tab. It can simply never settle one. The economic effect is total.

What if a wallet is frozen by mistake?

Open its case file for the signals and the numbers behind them, then unfreeze it in one click, on its own or with a whole selection. A wallet you release is never frozen again automatically. Send us the address too: several detection rules have been rewritten off the back of a single wrong flag.

What if I want to stop using BotFreeze?

Disable the Roles module from your Safe. The automation stops instantly. Your collection, your Safe and your ownership are unaffected, and you can export the freezer key first if you want to keep running it yourself.

Does this guarantee a higher floor?

No. It removes artificial downward pressure and a fake bid side. What your collection is worth after that is up to your collection.

Still stuck?

Open a ticket with your collection address and we'll look at it directly. Setup is free, and so is asking.

If BotFreeze ends up earning its place on your collection, an AlloPass is a good way to support it, and everything else we build comes with it.