Where crypto money gets stuck (and how to get it back)
Find my money →1. It finds your lost money
A real wallet we tested had 1.27 ETH of PoWH3D dividends sitting in a 2018 contract, plus 0.0168 ETH in a Fomo3D vault. Replaying our checks at the block before each withdrawal finds those amounts to the wei and builds the same withdraw() call the owner actually sent. Those replays are now regression tests.
Every finding ends in a link
- Step 1, get it back: a permanent swapchan.com/recover page. It decodes the call, you connect your wallet and sign it yourself. We only build calls that pay you (withdraw, exit, redeem to self, collect to self, claimWithdrawal) and never send value.
- Step 2, swap it: a prefilled SwapChan swap to USDC, with a short link.
- Swap all of it: one batch link for everything found.
Trustless by design
SwapChan never signs transactions, never holds your keys or funds, and can't store or spend money. It only builds unsigned transactions. Your own wallet signs every step, and you can read the decoded call before you do.
2. Your agent does it for you
Add the SwapChan MCP server and your agent gets the find_money tool. Then just say:
“Here's my wallet, find me money.”
It returns ranked findings with the recover step, the swap step and the swap-all link. You still sign everything in your own wallet.
Agent-first: information, not just buttons
SwapChan is built to make agents smart about chain state. Every finding comes back as a structured, verifiable recovery package your agent can reason over, re-check and act on alone:
- contract: chain, address, explorer and verified-source link
- detection: each read call, args, block number and raw return value
- interface: ABI fragments for the reads and the recovery function
- value: estimated USD plus the pricing source
- recoveryTx: exact unsigned to / data / value, checked to pay only you
- swapUrl + short link, and a swap-all batch link
"recovery": {
"contract": { "chainId": 1, "address": "0xB3775fB83F7D12A36E0475aBdD1FCA35c091efBe",
"verifiedSource": "https://etherscan.io/address/0xB377…efBe#code" },
"detection": [{ "call": "dividendsOf(address)", "block": "26095609",
"raw": "1272687502039539941" }],
"interface": { "reads": ["function dividendsOf(address) view returns (uint256)"],
"recovery": "function withdraw()" },
"value": { "estUsd": 4200, "pricingSource": "DefiLlama coins API" },
"recoveryTx": { "to": "0xB377…efBe", "data": "0x3ccfd60b", "value": "0",
"unsigned": true, "verified": true }
}Full agent loop: find_money → signing_guide / verify_tx → human signs → broadcast_tx. Lost the key? Key recovery hub.
3. It's completely free, and here's why
No signup, no fee for checking, no cut of what you recover. It's free because recoveries usually end in a swap, and if you swap on SwapChan we earn our normal small swap fee. The free finder is how people meet SwapChan. You can also take the recovery tx and swap anywhere you like.
The map: every place we know money gets stuck
| Category | Chains | Examples | How we detect it (read-only) | Coverage |
|---|---|---|---|---|
| Legacy dividend contracts | Ethereum | PoWH3D (P3D), Fomo3D, EtherDelta | dividendsOf / getPlayerVaults / balanceOf on the contract | Covered |
| Vault & yield shares | EVM | ERC-4626 vaults, Yearn v1/v2 | share balance Ă— convertToAssets + redeem/withdraw tx + evidence | Covered |
| Uncollected LP fees | EVM | Uniswap v3 positions | positions() tokensOwed + static collect() | Covered |
| Accrued lending rewards | EVM | Compound COMP, Venus XVS | compAccrued / venusAccrued | Covered |
| Lending deposits | EVM | Aave, Compound, Venus, JustLend | aToken / cToken / jToken balances | Covered |
| Unwrapped wrapped native | EVM + Tron | WETH, WBNB, WPOL, WAVAX, WTRX | balanceOf + withdraw evidence | Covered |
| Finalized unstake requests | Ethereum | Lido withdrawal NFTs | getWithdrawalRequests + getWithdrawalStatus + evidence | Covered |
| Forgotten multisigs | EVM | Safe | Safe tx service owners → safes, native balance | Covered |
| Merkle airdrops & rewards | EVM | Merkl + UNI/ENS/1INCH/OP/ARB distributors | Merkl API + distributor portals / claim trees when published | Covered |
| Old LP tokens | EVM | Uniswap v2, Sushi pairs | LP balance Ă— reserves + removeLiquidity tx (approve router first) | Covered |
| Rent in empty token accounts | Solana | SPL token accounts | getTokenAccountsByOwner, zero balance | Covered |
| Deactivated stake accounts | Solana | Native stake | getProgramAccounts + StakeProgram.Withdraw svm-instructions | Covered |
| Solana program archaeology | Solana | History programs + SPL balances | signatures → program ids; token accounts by owner | New |
| Tron stake / votes / resources | Tron | Stake 1.0+2.0, voting rewards, delegated BW/energy | getaccount + WithdrawBalance / WithdrawExpireUnfreeze | Covered |
| Tron DeFi + archaeology | Tron | JustLend, WTRX, JST, USDJ, sTRX/stUSDT, SUN, 2019–21 dividend dapps | TronGrid views + recoveryHints + promote-candidates log | New |
| L2 withdrawals not finalized | Optimism, Arbitrum, Base | OP/Base MessagePasser, ArbSys | Detect prior withdraw txs; prove/finalize still manual on official bridges | New |
| Bridge exits | Polygon PoS, Multichain, Celer | PoS portal, Anyswap, cBridge | History detect + explain (Multichain often unrecoverable) | New |
| Gauges, escrow, streams | EVM | Curve/Convex, Synthetix, Sablier, Pendle, GMX, Rocket Pool rETH | known-contract registry handlers + evidence | New |
| Governance airdrops | EVM | ENS, UNI, 1INCH, OP, ARB | Distributor live check + claim tx when merkle tree published | New |
| Bitcoin | BTC | xpub / bc1 / legacy addresses | blockchain.info multiaddr + mempool.space UTXO (read-only) | New |
| Unknown contract archaeology | Every supported chain | Any history contract with earned/claimable/balance | Probe recovery selectors, Sourcify ABI, confidence + promote-to-registry log | New |
“Not yet” means we say so in results instead of pretending. Mixers are out of scope.
