Desk is an over-the-counter desk for BNB Smart Chain. It lets a holder sell a whole bag, or a buyer pick one up, without routing the size through a PancakeSwap pool.
The OTC desk is Shadow's main product and stays at the center of everything we build. From there, the plan is to expand into a wider ecosystem around Shadow and $SHADOW. Only what is live is documented here; new pieces appear in the changelog when they ship.
The problem
Liquidity on most BEP-20 coins sits in one or two pools. A pool prices every trade on a curve: the bigger the trade relative to the pool, the worse the price, and the further the chart moves. Selling $100,000 into a pool that holds $1,000,000 on each side costs the seller about 9.3 % of the bag and drops the chart about 17 %. Everyone watching sees the candle.
The usual answer is to split the sale over days, or to find a buyer in a group chat and trust them to send first. The first leaks value and time. The second is how people get robbed.
What the desk does
Asks. A holder lists an amount of a coin for a total price in BNB. The tokens stay in the holder's wallet; the desk only holds an approval.
Bids. A buyer offers BNB for an amount of a coin. The BNB is escrowed in the contract so the bid is real.
Private offers. Either kind can name one taker. Only that wallet can fill it. The maker sends the link.
One transaction. When an offer is taken, the contract moves the tokens and the BNB in the same transaction. If any part fails, nothing moves.
There is no backend, no account, no order matching server. The book is the contract's storage; this site reads it from a public BNB Smart Chain node and writes through your own wallet.
Around the desk
Search across every BNB Chain token, a sell simulator on every token, Bags to see what your holdings would do to their charts, Whales to find the top holders of a token and bid on their bag, sealed auctions, wallet cards, an inbox and approvals you can revoke. See Tools.
What it is not
Not a market maker. Nobody quotes you a price; another person has to want the other side.
Not a router. The desk never touches PancakeSwap, so it can't give you a better pool price either.
Not custody. Asks hold nothing. Bids hold only the BNB a buyer chose to escrow, and the buyer can take it back at any time.
Status
ShadowDesk is live on BNB Chain at 0x7Fd63896472013696BB4658cCF3814FD2DDe80Da, deployed at block 132,691,744. It is derived from the MIT-licensed RelayDesk contract. The book is read directly from this Shadow deployment.
How it works
Three calls carry the whole desk: post, take, cancel. Here is what each one moves.
FIG. 1 · An ask being taken. The desk never holds the tokens; it pulls them from the seller and pushes them to the buyer inside the same call.
An ask, step by step
The seller approves the desk for the amount (one ERC-20 approve).
The seller calls postAsk(token, amount, priceWei, taker, expiry, partialOk). The contract checks the balance and the approval, then writes the ask to storage and emits AskPosted.
A buyer calls takeAsk(id, amount) with BNB attached. The contract computes the cost pro rata, pulls the tokens from the seller to the buyer, sends the BNB to the seller minus the fee, and refunds any extra BNB.
Partial fills repeat step 3 until nothing is left. The last fill pays exactly what remains, so rounding never leaves dust.
A bid, step by step
The buyer calls postBid(token, amount, taker, expiry, partialOk) with the BNB as msg.value. The BNB stays in the contract.
A holder approves the desk and calls takeBid(id, amount). The contract pulls the tokens to the buyer and pays the holder from the escrow, minus the fee.
The buyer can cancel at any time and gets back the BNB still escrowed. After expiry anyone can close the bid; the refund still goes to the buyer.
Private offers
Set taker to a wallet address and only that wallet can fill. The site gives every offer a link (offer.html#ask/12); send it to your counterparty. Anyone can read a private offer, only the named wallet can take it.
What the contract checks
Every token move is measured before and after. A token that takes a tax on transfer, or that rebases down, is rejected with TokenTaxed instead of short-changing one side.
An ask is filled straight from the seller's wallet, so if the seller sold the tokens elsewhere or revoked the approval, the fill reverts and the buyer's BNB never leaves.
Expiry is between now and 30 days. Self-trades revert. All state changes sit behind a reentrancy lock.
Quickstart
From the desk page in under a minute, or straight against the contract with Foundry's cast.
From the site
Open the offers page and connect a wallet on BNB Smart Chain (chain id 56). The site asks to switch if you are elsewhere.
Pick the coin on the left, or paste its address in the search box.
In the right panel choose Sell a bag or Buy a bag, type the amount, press a price button (−10 %, −5 %, Pool, +5 %) or type a total in BNB.
Choose how long it stays open, whether partial fills are fine, and optionally one private taker.
Confirm in the wallet. An ask asks for an approval first, then the post. A bid sends the BNB with the post.
From the command line
Replace $DESK with the published address and $TOKEN with the coin.
export RPC=https://bsc-dataseed.bnbchain.org
# 1. approve the desk for 4,200,000 tokens (18 decimals)
cast send $TOKEN "approve(address,uint256)" $DESK 4200000ether --rpc-url $RPC --account me
# 2. ask 18 BNB for all of it, open to anyone, 7 days, partial fills ok
cast send $DESK "postAsk(address,uint256,uint256,address,uint64,bool)" \
$TOKEN 4200000ether 18ether 0x0000000000000000000000000000000000000000 \
$(( $(date +%s) + 604800 )) true --rpc-url $RPC --account me
# 3. read it back
cast call $DESK "getAsk(uint256)((address,uint64,bool,bool,address,address,uint256,uint256,uint256,uint256))" 0 --rpc-url $RPC
# 4. a buyer takes half: cost is quoted by the contract
cast call $DESK "quoteFill(uint8,uint256,uint256)(uint256)" 0 0 2100000ether --rpc-url $RPC
cast send $DESK "takeAsk(uint256,uint256)" 0 2100000ether --value 9ether --rpc-url $RPC --account buyer
Sharing an offer
Every offer has a stable address on the site: offer.html#ask/<id> or offer.html#bid/<id>. The page reads the offer straight from the contract, so the link shows the live state: open, filled, cancelled or expired.
Concepts
The words used on the desk, the way the desk uses them.
Term
Meaning
Bag
A size of one token that changes hands whole, in one transaction.
Ask
An offer to sell an amount for a total in BNB. Nothing is held; the seller's approval lets the desk move the tokens at fill time.
Bid
An offer to buy an amount for a total in BNB. The BNB is escrowed in the contract.
Maker
The wallet that posted the offer.
Taker
The wallet that fills it. If the maker names one, only that wallet can fill.
Weight
The token amount still open on an offer.
vs pool
The offer's price per token against the pool price right now. 0% = the pool price, −5% = 5% under it. Shown on every offer so you can judge it at a glance.
Pool impact
What selling into the pool costs: the slippage paid and the chart move it causes.
Partial fill
Taking part of an offer. The maker decides whether it is allowed.
Expiry
When the offer stops being fillable. Between now and 30 days.
Serial
The offer id, shown as No. 000012. Asks and bids count separately.
Fee pass
Holding at least the set amount of $TOKEN makes a fill fee-free, for either side.
Pricing and pool impact
Every pool number on the site uses the constant-product model that PancakeSwap v2 pools follow. Here is the math, and where it stops being exact.
The model
A pool holds R worth of the coin and R worth of the quote (BNB or a stable) at the mid price, so the reported liquidity is L = 2R. Selling a bag worth D at mid:
proceeds = D · R / (R + D) · (1 − 0.0025) # 0.25 % LP fee
price after = price before · (R / (R + D))²
lost = D − proceeds
The desk fee on an OTC fill of the same bag is D · 0.003, and the chart does not move.
A $2,000,000 pool
One side holds $1,000,000. Selling into it:
Bag
Chart move
Pool pays
Lost
Lost %
Desk fee
$10,000
−1.97 %
$9,876
$124
1.24 %
$30
$50,000
−9.30 %
$47,500
$2,500
5.00 %
$150
$100,000
−17.36 %
$90,682
$9,318
9.32 %
$300
$250,000
−36.00 %
$199,500
$50,500
20.20 %
$750
$500,000
−55.56 %
$332,500
$167,500
33.50 %
$1,500
Where the estimate is off
v3 pools. Concentrated liquidity sits in ranges. Near the price a v3 pool can be deeper than the formula says; past the edge of the range it can be much thinner.
Several pools. Aggregators split a big sale across pools. On token pages and in Bags the site adds up the liquidity of every BNB Chain pool of the token and treats it as one pool, which is close to what a well-routed sale gets. The home page's Pool check shows one trending pool at a time.
Arbitrage. After a dump, bots buy back part of the move. The chart move shown is the instant one.
Reported liquidity. The numbers are DexScreener's view of the pool at the time you look, completed by GeckoTerminal when DexScreener has none.
Launchpad curves. A four.meme or Flap token that has not migrated yet trades on its launchpad's bonding curve, not in a PancakeSwap pool. The site shows the curve's depth and applies the same pool formula, which is only a rough guide for a curve. The token page links to the launchpad for the real curve chart.
Reading "vs pool"
"vs pool" compares an offer to the pool's mid price, which is a price you can't actually get at size. An ask at −5% can still be a good deal for the buyer: buying the same size in the pool would push the price up, often by more than 5 %. The desk shows both numbers so you don't have to guess.
The tools
Everything around the desk: find the right token, see what size does to a chart, find the other side, and keep track of what needs you. All of it reads the chain from your browser; nothing here signs anything until you press a button that says so.
Search
Press ⌘K (or the search box) and type a name, a ticker, a contract address or an offer number like A12 / B3. Names and tickers are searched across every BNB Chain token, not only the ones on screen.
When several tokens share a ticker, all of them are listed, ranked by market cap, with their address, liquidity and age, and a same ticker ×N tag. The real token is almost always first; copies follow.
Tokens with under $5,000 of liquidity go last and are tagged low liquidity: a market cap without liquidity behind it means little.
Always check the address. Clones copy names, never contracts.
Sell simulator
On every token page: type a size in dollars or in tokens, or drag the slider. You see what the pool would pay you, the chart move, the price after the sale and how much of the pool's buy side your sale would drain, next to the same sale on the desk. Depth is the sum of every BNB Chain pool of the token (see Pricing).
Bags
Paste any wallet, or use yours. Shadow reads its balances on chain for a few hundred tokens (live market lists, the tokens on the desk, majors, $TOKEN), plus what the wallet received in the last hours. For each bag: amount, value, depth, and what dumping all of it would do. Sell OTC opens an ask already filled with that bag. A rare token can be missing: add it by address.
Whales
Paste a token address: the top 30 holders, rebuilt from the token's transfers on chain, with their share of supply, value and size tier.
For a young token the list is complete since launch. For an older one it covers wallets that moved the token in the last ~10 days, and the page says so.
Pools, lockers, burn addresses and contracts are labelled and cannot be bid on. Wallets using an EIP-7702 smart account count as wallets.
Private bid escrows your BNB for that holder's bag: only that wallet can fill it, and you can cancel at any time. Message opens Blockscan Chat, the wallet-to-wallet messenger from the BscScan team, so you can tell them.
Wallet cards
Every offer page shows who is behind it: the maker, and whoever filled it. A size tier from the bags we can price plus BNB (🦐 under $1K, 🐟 $1K+, 🐬 $10K+, 🦈 $100K+, 🐋 $500K+), the share of the offer's token they hold, their BNB balance, how many transactions they have sent (new wallets and exchange-like wallets are flagged), known labels, and their record on Shadow. The same tier shows as a badge next to every offer. Wallets, not people: one person can use many wallets.
Sealed auctions
Open. The seller escrows the tokens, sets a minimum price in BNB (the reserve) and how long bidding (1 hour to 7 days) and revealing (1 hour to 2 days) last. The seller can cancel until the first bid arrives.
Bid sealed. A buyer sends a hidden bid with a BNB deposit that must cover it. Others see the deposit, never the price: deposit more than you bid to keep it hidden. Your reveal key is kept in your browser; copy it if you may reveal from another device.
Reveal. After bidding closes, each buyer reveals. Bids under the minimum or above their deposit are void and fully refunded. A bid that is never revealed loses 1% of its deposit to the seller.
Settle and collect. Anyone can settle once the reveal window ends. The highest valid bid wins (ties: first revealed). The winner gets the tokens, the seller the price minus the desk fee, everyone else their deposit back. With no valid bid, the tokens go back to the seller.
Inbox
Connect a wallet and every page tells you when something needs you: a private offer that names your wallet, a bid to reveal before the window closes, an auction to settle, BNB to collect. Offers → For me lists every private offer made to your wallet.
Update the price
On your own open offer: pick the pool price, ±2% or ±5%, or type a new one, and keep either the size or, for a bid, the BNB. A posted price never changes on chain, so a taker always pays exactly what they saw: the site cancels your offer and posts it again at the new price, in two signatures. The old link points to the new offer.
Dump Watch
Big sells into the 20 busiest BNB Chain token pools (paired with BNB or a stablecoin; pools whose daily volume is above 50 times their liquidity are left out, that is a bot trading with itself), over the last hour and live from then on: the seller's wallet, the size, how far the sale pushed the chart and how much the seller lost to slippage, next to the same sale on the desk (no chart move, 0.30% fee or none with the pass). Pick the minimum size ($2K to $25K), sort by latest or biggest. The sells are read straight from the chain, from each pool's Swap events, and refreshed every 30 seconds; the seller is the wallet that sent the transaction. The chart move and the loss are estimates from each pool's depth now, with the constant-product model: a sale split by an aggregator loses less.
For projects
A page for teams that need to move size: paste your token and see what selling 0.25% to 5% of supply (or any amount) would do to your chart through the pool, next to the same sale on the desk. Then four playbooks, each one button away and filled with your token: a sealed auction for a treasury sale, a private offer for a partner or investor allocation, your top holders for a whale who wants out, and a public ask for a fixed-price sale. Open it.
Boost
Boost can rank offers by verifiable token burns. The token address is published, but Boost remains disabled.
How it works: a boost is one plain transfer of $SHADOW from your wallet to the burn address 0x000000000000000000000000000000000000dEaD, with the offer's number appended to the call data (9 bytes: 524c5942, then 00 for an ask or 01 for a bid, then the offer id). The token ignores those extra bytes. No approval, no contract of ours: nobody can move the burned $SHADOW again. The site reads the boosts back from the chain (the token's transfers to the burn address over the last 24 hours, then each transaction's call data), so anyone can rebuild the ranking.
A boost does not change the offer, its price or who can take it. It leaves the bar after 24 hours, or earlier when the offer is filled, cancelled or expires. A burn is never refunded.
Your approvals
On the Offers page: every token your wallet approved for the desk, with the amount. Revoke sets an approval back to zero. The site only ever asks to approve the exact amount of an ask, and the desk can only use an approval inside a fill of an ask you posted, paid in the same transaction. After a revoke, an ask still open on that token can no longer be filled, so cancel it too.
Fees and $TOKEN
One fee, on fills only, taken in BNB.
Action
Fee
Paid by
Post an ask or a bid
none (gas only)
—
Cancel
none (gas only)
—
Take an ask
0.30 % of the BNB
Seller (comes off what the seller receives)
Take a bid
0.30 % of the BNB
Seller (comes off the payout)
Win an auction
0.30 % of the winning bid
Seller (comes off the price)
Bid in an auction, reveal, withdraw
none (gas only)
—
The fee rate is feeBps, set to 30 at deploy. The owner can change it but the code caps it at MAX_FEE_BPS = 50 (0.50 %).
A fee change applies to fills after the change. It never touches an offer's price.
Fee pass. The contract supports an optional pass token and threshold. Shadow’s pass remains disabled. Publishing the token address does not change the standard trading fees.
Fees are pushed to feeTo with a gas cap. If that push fails, the fee is kept in feesOwed and anyone can call flushFees(). A broken fee wallet can never block a trade.
Chains
Shadow settlement is live on BNB Chain.
Deployment status
Network
Markets
Shadow settlement
BNB Chain · 56
Live public market data
Deployed and verified
Robinhood Chain
Public market data where available
Not deployed
Solana
Public market data where available
Not configured
Only BNB Chain can create and settle Shadow offers. The other network selectors do not use another project’s contracts or backend.
Solana
A separate settlement service and signing infrastructure are required before Solana trading can be enabled.
Contract
The desk contract, Solidity 0.8.26, no proxy, no external dependencies.
Fills 1 and 2 round the cost up to the last wei; fill 3 takes the remaining price exactly, so the total paid is 18 BNB to the wei.
A private bid
A buyer wants a holder's 2.5 % of supply without moving the chart. They post a bid for 25,000,000 TOKEN, escrow 40 BNB, set taker to the holder, 3 days, all or nothing, and send the link. The holder opens it, approves, and calls takeBid(7, 25000000e18): the holder receives 39.88 BNB, the buyer receives the tokens, the fee wallet 0.12 BNB. If the holder never answers, the buyer cancels and gets 40 BNB back.
A taxed token
A coin with a 5 % transfer tax is listed. At fill time the desk measures the buyer's balance: it grew by 95 % of the amount, not 100 %. The whole fill reverts with TokenTaxed; the buyer keeps the BNB, the seller keeps the tokens.
Many BNB Chain "tax tokens" only tax buys and sells in their pool and leave wallet-to-wallet transfers untouched. Those settle on the desk normally: the desk moves tokens wallet to wallet, so the buyer receives the full amount and no tax is taken. We checked this on a Flap tax token: 5,000 of 5,000 tokens arrived. What the desk refuses is a token that taxes every transfer.
Risks
Read this before you trade. It is short on purpose.
Smart contract risk. The contract has not had a paid third-party audit. The design has run on mainnet on another chain, and every rule in these docs is in the source, but a bug could still cost funds.
What you can check yourself
Verified source. Sourcify confirms an exact creation and runtime match. Read verified source. Source verification is not an independent security audit.
The ShadowOTC token address is published. Fee pass, Boost and buybacks remain disabled.
Every number on this site comes from the chain or from public market data (DexScreener, GeckoTerminal). Nothing goes through a server of ours.
Who you are trusting
The contract code, for settlement and escrow. There is no admin path to user funds, no pause, no upgrade.
The owner, only for the fee (capped at 0.50 %), the fee wallet and the fee pass.
This website, for showing you the right numbers. It builds the transaction your wallet signs: check the contract address and the values in your wallet before you confirm. You can always use the contract from BscScan or cast instead.
DexScreener, GeckoTerminal, four.meme and Flap, for prices, liquidity, logos and charts shown next to offers. Those numbers are for reference; they never enter a transaction.
What can go wrong
Wrong coin. Anyone can post an offer on any token, including a fake with a copied name and logo. Always check the token address, not the ticker.
Price. The desk does not judge whether a price is fair. A maker can ask far above the pool. Check "vs pool" on the offer.
Honeypots. A token can block transfers or sales after you buy it. OTC does not protect you from the token itself.
Approvals. An ask leaves an approval in place. Cancel the ask and revoke the approval if you change your mind; the desk can only use it inside a fill you agreed to, but an approval left open is still an open door if the contract ever had a bug.
Stale offers. An ask can fail at fill time if the seller moved the tokens. You lose only gas.
FAQ
Why not just sell in the pool?
For small sizes, do. The pool is fast and always there. The desk is for sizes where the pool's curve costs you real money, or where the chart move matters to you or the community.
Does the desk hold my tokens?
For an ask, no. The tokens stay in your wallet until the second a buyer pays. For a bid, the desk holds the buyer's BNB until it is filled, cancelled or expired.
Can someone fill my ask without paying?
No. takeAsk reverts unless the BNB attached covers the cost, and the tokens move in the same call.
Which coins work?
Any standard BEP-20 on BNB Smart Chain, listed or not: paste the contract address in the search (⌘K) or in the offer window. There is no allowlist. Tokens that tax every transfer or rebase down are rejected at fill time.
Does a token need to be on PancakeSwap?
No. four.meme and Flap tokens can be traded on the desk while they are still on their bonding curve: wallet-to-wallet transfers are open on both launchpads before migration, and that is all the desk needs. We checked both on chain. The site shows their logo, the curve's depth and a link to the launchpad.
Can I search a token by name?
Any BNB Chain token, by name, ticker or contract address. When several tokens use the same ticker, they are all listed by market cap with their address: always check the address before you trade.
What does the buyer see on the chart?
Nothing. The trade never touches a pool, so no candle. The transfer is public on BscScan like any transfer.
Can I change the price of an offer?
Yes, from the offer page: Update the price. A posted price never changes on chain, so a taker always pays exactly what they saw; the site cancels your offer and posts it again at the new price, in two signatures.
Is there a minimum size?
No, but gas makes tiny offers pointless.
Where are the sealed auctions?
In the contract. On the Auctions page: open one with a minimum price, or bid on one. The functions are also listed in Contract.
Changelog
10 November 2026 · Shadow 1.0
BNB Chain OTC asks, bids, private fills and sealed auctions.
Market discovery, pool impact simulator, Bags, Whales, wallet activity and approvals.
Independent ShadowDesk deployed at block 132,691,744.
Contract source verified with an exact creation and runtime match on Sourcify.
ShadowOTC token CA is published; fee pass, Boost and buybacks remain disabled.