[ Rules and methods ]
How each check works,and where it stops.
Nothing here is a black box. These are the exact methods, selectors and thresholds the site uses.
Contract Risk Scanner
- eth_getCode at the latest block. The code is walked opcode by opcode, skipping PUSH data, after cutting recognised compiler metadata.
- Every PUSH4 constant is a candidate selector. A risky function is reported when its selector is among them (selectors computed from the signatures below).
- Proxy slots read with eth_getStorageAt: implementation 0x360894a13b…, admin 0xb53127684a…, beacon 0xa3f0ad74e5…, EIP-1822 0xc5f16f0fcc…; EIP-1167 minimal proxies and EIP-7702 delegations by their code pattern. A proxy's implementation code is scanned too.
- owner(), getOwner(), paused(), name(), symbol(), decimals(), totalSupply() read with eth_call; the owner's code tells an account from a contract.
- Source, contract name and creator from the Elysium explorer API; verified source lines matching each power are quoted with file and line.
- Reports on the address from the report ledger.
owner
- 0x8da5cb5b owner()
- 0x893d20e8 getOwner()
- 0xf2fde38b transferOwnership(address)
- 0x715018a6 renounceOwnership()
- 0x79ba5097 acceptOwnership()
- 0x2f2ff15d grantRole(bytes32,address)
- 0xd547741f revokeRole(bytes32,address)
- 0x13af4035 setOwner(address)
- 0x8f283970 changeAdmin(address)
mint
- 0x40c10f19 mint(address,uint256)
- 0xa0712d68 mint(uint256)
- 0x449a52f8 mintTo(address,uint256)
- 0xcc872b66 issue(uint256)
- 0xb921e163 increaseSupply(uint256)
- 0x94d008ef mint(address,uint256,bytes)
- 0x8c2a993e bridgeMint(address,uint256)
- 0x18bf5077 crosschainMint(address,uint256)
pause
- 0x8456cb59 pause()
- 0x3f4ba83a unpause()
- 0x5c975abb paused()
- 0x16c38b3c setPaused(bool)
- 0x1031e36e pauseTrading()
- 0x8a8c523c enableTrading()
- 0xc2e5ec04 setTradingEnabled(bool)
- 0xc9567bf9 openTrading()
blocklist
- 0xf9f92be4 blacklist(address)
- 0x1a895266 unBlacklist(address)
- 0x44337ea1 addToBlacklist(address)
- 0x537df3b6 removeFromBlacklist(address)
- 0x153b0d1e setBlacklist(address,bool)
- 0xfe575a87 isBlacklisted(address)
- 0x7c0a893d blockAccount(address)
- 0x8d1fdf2f freeze(address)
- 0x0ecb93c0 addBlackList(address)
- 0x342aa8b5 setBot(address,bool)
- 0x9c0db5f3 setBots(address[],bool)
- 0x3bbac579 isBot(address)
- 0x455a4396 blacklistAddress(address,bool)
fees
- 0x69fe0e2d setFee(uint256)
- 0x0b78f9c0 setFees(uint256,uint256)
- 0xc4081a4c setTaxFee(uint256)
- 0x0cc835a3 setBuyFee(uint256)
- 0x8b4cee08 setSellFee(uint256)
- 0x2e5bb6ff setTax(uint256)
- 0xec28438a setMaxTxAmount(uint256)
- 0xea1644d5 setMaxWalletSize(uint256)
- 0x34e19907 setSwapFee(uint256)
- 0x6db79437 updateFees(uint256,uint256)
- 0xe74b981b setFeeRecipient(address)
- 0xc647b20e setTaxes(uint256,uint256)
- 0x437823ec excludeFromFee(address)
upgrade
- 0x3659cfe6 upgradeTo(address)
- 0x4f1ef286 upgradeToAndCall(address,bytes)
- 0x0900f010 upgrade(address)
- 0xd784d426 setImplementation(address)
- 0x17a68dd8 changeImplementation(address)
- 0x52d1902d proxiableUUID()
drain
- 0x3ccfd60b withdraw()
- 0x2e1a7d4d withdraw(uint256)
- 0x853828b6 withdrawAll()
- 0x01681a62 sweep(address)
- 0x57376198 rescueTokens(address,uint256)
- 0x8980f11f recoverERC20(address,uint256)
- 0xdb2e21bc emergencyWithdraw()
- 0x06b091f9 withdrawTokens(address,uint256)
- 0xb61d27f6 execute(address,uint256,bytes)
- 0xac9650d8 multicall(bytes[])
- This scan reads code and storage. It does not simulate transactions and does not run the contract.
- A function found in the code may be guarded, unused or harmless; a function not found may still exist under another name.
- A proxy can be upgraded after this scan. Scan again before every large interaction.
- Roles held through AccessControl, multisigs or timelocks are not resolved to people.
- No flag means nothing was found by these checks. It does not mean the contract is safe.
Wallet Permission Inspector
Approval (ERC-20 with three topics, ERC-721 with four) and ApprovalForAll logs with the wallet as owner, from block 0 to the head. A range answered with "too many logs" is split in two, newest half first, up to 48 times; what still fails is listed as a gap. Then allowance(), isApprovedForAll() or getApproved() read now. Unlimited means 2^255 or more. Revoke sends approve(spender, 0), setApprovalForAll(operator, false) or approve(0x0, tokenId) from your wallet.
Threat Monitoring rules
- highUnlimited approval granted (unlimited-approval): An outgoing approve() or increaseAllowance() whose amount is 2^255 or more.
- highCollection operator granted (operator-approval): An outgoing setApprovalForAll(operator, true).
- cautionLarge HYPE transfer out (large-out): One outgoing transaction carrying 100 HYPE or more.
- infoNew counterparty (new-counterparty): An outgoing transaction in the last 24 h to an address this wallet never sent to earlier in the fetched history (needs at least 20 older transactions).
- cautionBurst of transactions (burst): 10 or more outgoing transactions within 10 minutes.
- cautionFailed transactions in a row (failed-streak): 3 or more consecutive failed outgoing transactions.
- highMany tokens sent out quickly (token-sweep): 3 or more different tokens sent out within 30 minutes (a pattern of drainer scripts).
- cautionCalled a reported contract (reported-contract): An outgoing transaction to a contract with an open or upheld report on the report ledger.
- cautionLook-alike sender (address poisoning) (address-poisoning): An incoming token transfer of 0 from an address whose first 4 and last 4 hex characters match an address this wallet sent to, but which is a different address.
Defaults shown; each threshold can be changed on the monitor page. Data: the latest 100 transactions and 100 token transfers per wallet from the Elysium explorer API.
Contract events
- highUpgraded(address)
- highBeaconUpgraded(address)
- highAdminChanged(address,address)
- cautionOwnershipTransferred(address,address)
- highPaused(address)
- infoUnpaused(address)
- cautionRoleGranted(bytes32,address,address)
- infoRoleRevoked(bytes32,address,address)
- cautionTransfer(0x0, to, amount) (a mint)
Transaction Risk Preview
The calldata is decoded with a short standard list (approve, increaseAllowance, transfer, transferFrom, permit, setApprovalForAll, safeTransferFrom, multicall and a few more), else with the target's verified ABI from the explorer, or its implementation's. Multicall inner calls are decoded one level deep. The spender's code is read for approvals. The target gets a full scan. The preview reads the request and the target. It does not simulate the transaction.
Report ledger
SecurityumReportLedger, live on Elysium at 0xfdd15018e685996089f9ae596e8a7cb104aaf7d6. Bond, resolver key and the two windows are fixed at deployment and readable on chain: bond 0.05 HYPE per report and per counter, resolver key 0x98a5404a8224c0e43aa622c53b9e3059d24a3ea8, counter-evidence window 3 days, then verdict window 4 days. One open report per reporter per contract; up to 8 counter posts per report; evidence is a 32-byte hash plus an optional link of up to 256 bytes. No owner, fee, pause, upgrade or sweep.
Planned, not built
- plannedHosted alerts. Alerts delivered while the site is closed (push, email or webhook). Today alerts are evaluated in your browser while a page is open.
- plannedDeveloper API. The scanner and rules as an API with keys and quotas. Today the read endpoints of this site are rate-limited and keyless.
- plannedSignature preview. Decoding of typed-data signature requests (permits, orders) before you sign them. Today the preview covers transactions only.
- planned$SECURITYUM for quotas. Using the token for API and hosted-alert quotas once those services exist. Planned and unproven; nothing needs the token today.