Contract Powers Registry / polygon
USDC (native, Polygon)
0x3c499c542cef5e3811e1192ce70d8cc03d5c3359 on polygon
In one line: upgradeable proxy (zeppelinos.implementation); admin key is a plain EOA; retained powers: blacklist, mint, ownership, pause, sweep, upgrade.
Can this code be replaced?
Yes — this is a proxy. The address you interact with holds no logic of its own; it forwards calls to a second contract. Whoever holds the upgrade right can point it somewhere else, and every behaviour described on this page changes with it.
| Pattern | zeppelinos.implementation |
|---|---|
| Current logic | 0x235ae97b28466db30469b89a9fe4cff0659f82cb |
| Logic name | FiatTokenV2_2 |
| Logic source verified | Yes |
Raw storage evidence (1)
zeppelinos.implementation→0x235ae97b28466db30469b89a9fe4cff0659f82cb
Who holds the keys?
| Owner / admin | 0xaee29e350dbb28ce77d0595d898be658626d2bcc |
|---|---|
| Found via | owner() |
| That address is | A plain wallet (EOA) |
owner is a plain externally-owned account — a single private key controls it. In practice: one private key, held by someone, can exercise every power listed below. There is no on-chain delay and no second approver.
What the privileged role can still do
Each card is a capability found in the code. declared = the contract’s published interface exposes it. bytecode-heuristic = the 4-byte selector appears in the compiled code, which often means the contract implements it — but it can equally be a function this contract calls on another contract. Only a verified source settles that.
Addresses can be frozen
declaredA specific address can be blocked from moving its own balance.
Evidence (4)
blacklist(address)implementation-abiunBlacklist(address)implementation-abiblacklist(address)implementation-bytecodeisBlacklisted(address)implementation-bytecode
New tokens can be created
declaredSupply is not fixed by the code — the privileged role can issue more.
Evidence (2)
mint(address,uint256)implementation-abimint(address,uint256)implementation-bytecode
Control can be transferred
declaredThe privileged role itself can be handed to another address, or renounced.
Evidence (2)
transferOwnership(address)implementation-abitransferOwnership(address)implementation-bytecode
Transfers can be halted
declaredA privileged role can stop activity, including your ability to exit.
Evidence (4)
pause()implementation-abiunpause()implementation-abipause()implementation-bytecodeunpause()implementation-bytecode
Tokens can be pulled out
declaredA rescue/sweep path exists that moves tokens held by the contract.
Evidence (2)
rescueERC20(address,address,uint256)implementation-abiupdateRescuer(address)implementation-abi
Code can be replaced
declaredThe logic behind this address can be swapped for different code. Everything below can change with it.
Evidence (4)
changeAdmin(address)abiupgradeTo(address)abiupgradeToAndCall(address,bytes)abichangeAdmin(address)bytecode-selector
Is there a bug bounty on this?
No live bug-bounty program matched this contract’s name in my index (186 Immunefi + 52 Cantina programs, rebuilt daily). Matching is by name, not by address — a program can cover this contract without the names lining up. Browse the full index at Bounty Radar.
Raw facts
| Chain | polygon (chainId 137) |
|---|---|
| Contract name | FiatTokenProxy |
| Compiler | v0.6.12+commit.27d51765 |
| License | — |
| Bytecode size | 1,852 bytes (logic: 23,464) |
| DELEGATECALL | present |
| SELFDESTRUCT | absent |
| CREATE2 | absent |
| Explorer | view on block explorer ↗ |
How this was produced, and what it cannot tell you
Storage slots, bytecode and eth_call results were read from public RPC nodes;
where the source is verified, the published interface was read too. Nothing here is copied from another
site’s opinion. Generated in 574 ms on 2026-08-29.
- confidence="declared" means the ABI exposes the function. confidence="bytecode-heuristic" means the 4-byte selector appears in the code — usually its own dispatch table, but it can also be a selector this contract CALLS on another contract. Only a verified ABI settles it.
- admin.ownerType="contract" does not mean multisig — this endpoint does not inspect the owner contract.
- bounty.match="name-heuristic" matches a contract NAME to a program name; it is not proof the address is in scope.
What would change the answer: an upgrade after the date above; a power reachable only through a contract this one trusts; or role-based access control, whose holders this registry does not enumerate. Re-read the chain before you rely on it.
Machine-readable
Same facts as JSON, free, no key: /c/polygon/0x3c499c542cef5e3811e1192ce70d8cc03d5c3359.json.
Live lookups for any address (not just this list) are $0.05 per call.
Want a human-grade read?
This page is automated pattern-matching. If you need someone to actually read the code and tell you what breaks, I do fixed-scope micro-audits — you pay after you read the report.