WTF Solidity 极简入门教程,供小白们使用。Now supports English! 官网: https://wtf.academy
This report summarizes scanner evidence for AmazingAng/WTF-Solidity, a Solidity project with 14,067 GitHub stars. SynthScan examined 231,372 lines of code across 1122 source files, recording 103 pattern matches distributed across 10 syntactic categories. The legacy adjusted pattern signal is 0.8 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 71 finding(s).
Are imports declared and package/API names verified? 18 finding(s).
Are wrappers, guards, and repeated structures necessary? 57 finding(s).
Which changes need focused human review? 103 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 103 distinct pattern matches across 10 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | S02_SelectorClash/readme.md | 69 | function putCurEpochConPubKeyBytes(bytes memory _bytes) public { | CODE |
| LOW | Languages/ja/29_Selector_ja/readme.md | 125 | function nonFixedSizeParamSelector(uint256[] memory param1,string memory param2) external returns(bytes4 selectorWit | CODE |
| LOW | Languages/pt-br/S02_SelectorClash/readme.md | 59 | function putCurEpochConPubKeyBytes(bytes memory _bytes) public { | CODE |
| LOW | Languages/en/S02_SelectorClash_en/readme.md | 70 | function putCurEpochConPubKeyBytes(bytes memory _bytes) public { | CODE |
| LOW | lib/forge-std/scripts/vm.py | 138 | def prefix_with_group_headers(cheats: list["Cheatcode"]): | STRING |
| LOW | …pelin-contracts/test/token/ERC1155/ERC1155.behavior.js | 517 | function batchTransferWasSuccessful() { | CODE |
| LOW | …y/transparent/TransparentUpgradeableProxy.behaviour.js | 8 | module.exports = function shouldBehaveLikeTransparentUpgradeableProxy() { | CODE |
| LOW | …ppelin-contracts/test/access/AccessControl.behavior.js | 12 | function shouldBehaveLikeAccessControl() { | CODE |
| LOW | …ppelin-contracts/test/access/AccessControl.behavior.js | 227 | function shouldBehaveLikeAccessControlEnumerable() { | CODE |
| LOW | …ppelin-contracts/test/access/AccessControl.behavior.js | 264 | function shouldBehaveLikeAccessControlDefaultAdminRules() { | CODE |
| LOW | …ntracts/test/access/manager/AccessManager.predicate.js | 171 | function testAsSchedulableOperation({ scheduled: { before, after, expired }, notScheduled }) { | CODE |
| LOW | …ntracts/test/access/manager/AccessManager.predicate.js | 234 | function testAsRestrictedOperation({ callerIsTheManager: { executing, notExecuting }, callerIsNotTheManager }) { | CODE |
| LOW | …ontracts/test/access/manager/AccessManager.behavior.js | 19 | function shouldBehaveLikeDelayedAdminOperation() { | CODE |
| LOW | …ontracts/test/access/manager/AccessManager.behavior.js | 58 | function shouldBehaveLikeNotDelayedAdminOperation() { | CODE |
| LOW | …ontracts/test/access/manager/AccessManager.behavior.js | 102 | function shouldBehaveLikeRoleAdminOperation(roleAdmin) { | CODE |
| LOW | …ontracts/test/access/manager/AccessManager.behavior.js | 142 | function shouldBehaveLikeAManagedRestrictedOperation() { | CODE |
| LOW | …ontracts/test/access/manager/AccessManager.behavior.js | 199 | function shouldBehaveLikeASelfRestrictedOperation() { | CODE |
| LOW | …/openzeppelin-contracts/test/utils/Context.behavior.js | 8 | function shouldBehaveLikeRegularContext() { | CODE |
| LOW | …b/openzeppelin-contracts/test/utils/Nonces.behavior.js | 69 | function shouldBehaveLikeNoncesKeyed() { | CODE |
| LOW | …penzeppelin-contracts/test/account/Account.behavior.js | 7 | function shouldBehaveLikeAccountCore() { | CODE |
| LOW | …penzeppelin-contracts/test/account/Account.behavior.js | 80 | function shouldBehaveLikeAccountHolder() { | CODE |
| LOW | lib/openzeppelin-contracts/lib/forge-std/scripts/vm.py | 138 | def prefix_with_group_headers(cheats: list["Cheatcode"]): | STRING |
| LOW | 29_Selector/readme.md | 117 | function nonFixedSizeParamSelector(uint256[] memory param1,string memory param2) external returns(bytes4 selectorWit | CODE |
| LOW | …pelin-contracts/test/token/ERC1155/ERC1155.behavior.js | 517 | function batchTransferWasSuccessful() { | CODE |
| LOW | …y/transparent/TransparentUpgradeableProxy.behaviour.js | 8 | module.exports = function shouldBehaveLikeTransparentUpgradeableProxy() { | CODE |
| LOW | …ppelin-contracts/test/access/AccessControl.behavior.js | 12 | function shouldBehaveLikeAccessControl() { | CODE |
| LOW | …ppelin-contracts/test/access/AccessControl.behavior.js | 227 | function shouldBehaveLikeAccessControlEnumerable() { | CODE |
| LOW | …ppelin-contracts/test/access/AccessControl.behavior.js | 264 | function shouldBehaveLikeAccessControlDefaultAdminRules() { | CODE |
| LOW | …ntracts/test/access/manager/AccessManager.predicate.js | 171 | function testAsSchedulableOperation({ scheduled: { before, after, expired }, notScheduled }) { | CODE |
| LOW | …ntracts/test/access/manager/AccessManager.predicate.js | 234 | function testAsRestrictedOperation({ callerIsTheManager: { executing, notExecuting }, callerIsNotTheManager }) { | CODE |
| LOW | …ontracts/test/access/manager/AccessManager.behavior.js | 19 | function shouldBehaveLikeDelayedAdminOperation() { | CODE |
| LOW | …ontracts/test/access/manager/AccessManager.behavior.js | 58 | function shouldBehaveLikeNotDelayedAdminOperation() { | CODE |
| LOW | …ontracts/test/access/manager/AccessManager.behavior.js | 102 | function shouldBehaveLikeRoleAdminOperation(roleAdmin) { | CODE |
| LOW | …ontracts/test/access/manager/AccessManager.behavior.js | 142 | function shouldBehaveLikeAManagedRestrictedOperation() { | CODE |
| LOW | …ontracts/test/access/manager/AccessManager.behavior.js | 199 | function shouldBehaveLikeASelfRestrictedOperation() { | CODE |
| LOW | …/openzeppelin-contracts/test/utils/Context.behavior.js | 8 | function shouldBehaveLikeRegularContext() { | CODE |
| LOW | …b/openzeppelin-contracts/test/utils/Nonces.behavior.js | 69 | function shouldBehaveLikeNoncesKeyed() { | CODE |
| LOW | …penzeppelin-contracts/test/account/Account.behavior.js | 7 | function shouldBehaveLikeAccountCore() { | CODE |
| LOW | …penzeppelin-contracts/test/account/Account.behavior.js | 80 | function shouldBehaveLikeAccountHolder() { | CODE |
| LOW | …lib/openzeppelin-contracts/lib/forge-std/scripts/vm.py | 138 | def prefix_with_group_headers(cheats: list["Cheatcode"]): | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | …zeppelin-contracts/.github/workflows/release-cycle.yml | 4 | # ┌───────────┐ ┌─────────────┐ ┌────────────────┐ | COMMENT |
| MEDIUM⚡ | …zeppelin-contracts/.github/workflows/release-cycle.yml | 6 | # └───────────┘ └─┬─────────▲─┘ │ └─┬────────────▲─┘ | COMMENT |
| MEDIUM⚡ | …zeppelin-contracts/.github/workflows/release-cycle.yml | 10 | # ┌▼─────────┴┐ │ ┌▼────────────┴┐ | COMMENT |
| MEDIUM⚡ | …zeppelin-contracts/.github/workflows/release-cycle.yml | 12 | # └───────────┘ └──────────────┘ | COMMENT |
| MEDIUM⚡ | …zeppelin-contracts/.github/workflows/release-cycle.yml | 4 | # ┌───────────┐ ┌─────────────┐ ┌────────────────┐ | COMMENT |
| MEDIUM⚡ | …zeppelin-contracts/.github/workflows/release-cycle.yml | 6 | # └───────────┘ └─┬─────────▲─┘ │ └─┬────────────▲─┘ | COMMENT |
| MEDIUM⚡ | …zeppelin-contracts/.github/workflows/release-cycle.yml | 10 | # ┌▼─────────┴┐ │ ┌▼────────────┴┐ | COMMENT |
| MEDIUM⚡ | …zeppelin-contracts/.github/workflows/release-cycle.yml | 12 | # └───────────┘ └──────────────┘ | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | lib/forge-std/scripts/vm.py | 0 | \ /// the `vmsafe` interface does not allow manipulation of the evm state or other actions that may /// result in script | STRING |
| HIGH | lib/openzeppelin-contracts/lib/forge-std/scripts/vm.py | 0 | \ /// the `vmsafe` interface does not allow manipulation of the evm state or other actions that may /// result in script | STRING |
| HIGH | …lib/openzeppelin-contracts/lib/forge-std/scripts/vm.py | 0 | \ /// the `vmsafe` interface does not allow manipulation of the evm state or other actions that may /// result in script | STRING |
| HIGH | lib/forge-std/scripts/vm.py | 0 | \ /// the `vm` interface does allow manipulation of the evm state. these are all intended to be used /// in tests, but i | STRING |
| HIGH | lib/openzeppelin-contracts/lib/forge-std/scripts/vm.py | 0 | \ /// the `vm` interface does allow manipulation of the evm state. these are all intended to be used /// in tests, but i | STRING |
| HIGH | …lib/openzeppelin-contracts/lib/forge-std/scripts/vm.py | 0 | \ /// the `vm` interface does allow manipulation of the evm state. these are all intended to be used /// in tests, but i | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …r/Topics/Onchain_debug/03_write_your_own_poc/readme.md | 181 | pragma solidity ^0.8.17; | COMMENT |
| LOW | …_34_ERC721_ShuxunOo/ERC721实例分析总结_ShuxunOo/ERC721 综述.md | 61 | COMMENT | |
| LOW | …_34_ERC721_ShuxunOo/ERC721实例分析总结_ShuxunOo/ERC721 综述.md | 81 | COMMENT | |
| LOW | …_34_ERC721_ShuxunOo/ERC721实例分析总结_ShuxunOo/ERC721 综述.md | 101 | /// @param _from Proprietário atual do NFT | COMMENT |
| LOW | …_34_ERC721_ShuxunOo/ERC721实例分析总结_ShuxunOo/ERC721 综述.md | 121 | /// @dev Aciona o evento ApprovalForAll. O contrato deve permitir que um proprietário de NFT tenha vários gerentes d | COMMENT |
| LOW | …_34_ERC721_ShuxunOo/ERC721实例分析总结_ShuxunOo/ERC721 综述.md | 161 | COMMENT | |
| LOW | …in-contracts/test/access/manager/AccessManager.test.js | 81 | manager, | COMMENT |
| LOW | …eppelin-contracts/test/metatx/ERC2771Forwarder.test.js | 161 | COMMENT | |
| LOW | …enzeppelin-contracts/scripts/fetch-common-contracts.js | 1 | #!/usr/bin/env node | COMMENT |
| LOW | …zeppelin-contracts/.github/workflows/release-cycle.yml | 1 | # D: Manual Dispatch | COMMENT |
| LOW | Topics/Onchain_debug/03_write_your_own_poc/readme.md | 181 | ```solidity= | COMMENT |
| LOW | …in-contracts/test/access/manager/AccessManager.test.js | 81 | manager, | COMMENT |
| LOW | …eppelin-contracts/test/metatx/ERC2771Forwarder.test.js | 161 | COMMENT | |
| LOW | …enzeppelin-contracts/scripts/fetch-common-contracts.js | 1 | #!/usr/bin/env node | COMMENT |
| LOW | …zeppelin-contracts/.github/workflows/release-cycle.yml | 1 | # D: Manual Dispatch | COMMENT |
| LOW | …_34_ERC721_ShuxunOo/ERC721实例分析总结_ShuxunOo/ERC721 综述.md | 61 | COMMENT | |
| LOW | …_34_ERC721_ShuxunOo/ERC721实例分析总结_ShuxunOo/ERC721 综述.md | 81 | COMMENT | |
| LOW | …_34_ERC721_ShuxunOo/ERC721实例分析总结_ShuxunOo/ERC721 综述.md | 101 | /// @param _from 当前NFT的拥有者 | COMMENT |
| LOW | …_34_ERC721_ShuxunOo/ERC721实例分析总结_ShuxunOo/ERC721 综述.md | 121 | /// @dev 触发 ApprovalForAll 事件. 合约必须允许一个NFT的owner有多个被授权的第三方管理者 | COMMENT |
| LOW | …_34_ERC721_ShuxunOo/ERC721实例分析总结_ShuxunOo/ERC721 综述.md | 161 | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | Languages/pt-br/Topics/Tools/TOOL03_Ganache/readme.md | 79 | ganache -f https://eth-mainnet.alchemyapi.io/v2/YOUR_API_KEY | CODE |
| HIGH | Languages/pt-br/Topics/Tools/TOOL03_Ganache/readme.md | 91 | ganache -f https://eth-mainnet.alchemyapi.io/v2/YOUR_API_KEY --wallet.accounts=ACCOUNT_PRIVATE_KEY,AMOUNT_WEI --wallet.a | CODE |
| HIGH | Topics/Tools/TOOL03_Ganache/readme.md | 80 | ganache -f https://eth-mainnet.alchemyapi.io/v2/YOUR_API_KEY | CODE |
| HIGH | Topics/Tools/TOOL03_Ganache/readme.md | 92 | ganache -f https://eth-mainnet.alchemyapi.io/v2/YOUR_API_KEY --wallet.accounts=ACCOUNT_PRIATE_KEY,AMOUNT_WEI --wallet.ac | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | lib/openzeppelin-contracts/test/utils/RLP.test.js | 179 | 'Lorem ipsum dolor sit amet, consectetur adipisicing elit', | CODE |
| LOW | lib/openzeppelin-contracts/test/utils/RLP.test.js | 179 | 'Lorem ipsum dolor sit amet, consectetur adipisicing elit', | CODE |
| LOW | lib/openzeppelin-contracts/test/utils/Bytes.test.js | 20 | 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna a | CODE |
| LOW | lib/openzeppelin-contracts/test/utils/Bytes.test.js | 20 | 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna a | CODE |
| LOW | …enzeppelin-contracts/test/utils/SlotDerivation.test.js | 46 | { type: 'string', key: 'lorem ipsum', isValueType: false }, | CODE |
| LOW | …/openzeppelin-contracts/test/utils/StorageSlot.test.js | 16 | { name: 'String', type: 'string', value: 'lorem ipsum', isValueType: false, zero: '' }, | CODE |
| LOW | …_wtf/lib/openzeppelin-contracts/test/utils/RLP.test.js | 179 | 'Lorem ipsum dolor sit amet, consectetur adipisicing elit', | CODE |
| LOW | …_wtf/lib/openzeppelin-contracts/test/utils/RLP.test.js | 179 | 'Lorem ipsum dolor sit amet, consectetur adipisicing elit', | CODE |
| LOW | …tf/lib/openzeppelin-contracts/test/utils/Bytes.test.js | 20 | 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna a | CODE |
| LOW | …tf/lib/openzeppelin-contracts/test/utils/Bytes.test.js | 20 | 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna a | CODE |
| LOW | …enzeppelin-contracts/test/utils/SlotDerivation.test.js | 46 | { type: 'string', key: 'lorem ipsum', isValueType: false }, | CODE |
| LOW | …/openzeppelin-contracts/test/utils/StorageSlot.test.js | 16 | { name: 'String', type: 'string', value: 'lorem ipsum', isValueType: false, zero: '' }, | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | lib/openzeppelin-contracts/scripts/gen-nav.js | 76 | print( | CODE |
| HIGH | …ello_wtf/lib/openzeppelin-contracts/scripts/gen-nav.js | 76 | print( | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | Topics/Onchain_debug/03_write_your_own_poc/en/readme.md | 91 | ### Step 1: Information gathering | COMMENT |
| LOW | Topics/Onchain_debug/03_write_your_own_poc/en/readme.md | 110 | ### Step 2: Transaction Debugging | COMMENT |
| LOW | Topics/Onchain_debug/03_write_your_own_poc/en/readme.md | 162 | ### Step 3: Reproduce code | COMMENT |
| LOW | Topics/Onchain_debug/03_write_your_own_poc/en/readme.md | 306 | ### Step 4: Analyzing the exploit | COMMENT |
| LOW | Topics/Onchain_debug/03_write_your_own_poc/en/readme.md | 375 | ### Step 5: Reproduce | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | lib/forge-std/scripts/vm.py | 424 | CODE | |
| LOW | lib/openzeppelin-contracts/lib/forge-std/scripts/vm.py | 424 | CODE | |
| LOW | …lib/openzeppelin-contracts/lib/forge-std/scripts/vm.py | 424 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | lib/forge-std/scripts/vm.py | 478 | CODE | |
| LOW | lib/openzeppelin-contracts/lib/forge-std/scripts/vm.py | 478 | CODE | |
| LOW | …lib/openzeppelin-contracts/lib/forge-std/scripts/vm.py | 478 | CODE |