TW
Tripwire
Find contracts. Test them. Review real vulns.

Analysis Run

019bb490-f357-73a9-a37d-3131c31270dd

failed
Chain ID
1
Address
Block Number
Created
Mon, Jan 12, 2026 11:35 PM
Review Summary

What survived the funnel

Open this run to answer one question: is this real attacker-relevant behavior with real impact, or just normal contract plumbing?

Confirmed
0
Validated
0
Source
Verified
Review Backing
Not yet
Best current signal
Untrusted DELEGATECALL target reachable
crit 0 high 0 proxy context implementation known
Review Checklist
1. Read the findings table first. Ignore raw jobs until the result looks real.
2. Confirm attacker control, not just the existence of a sink.
3. Confirm money or privilege impact.
4. Keep it if the behavior is real. Kill it if this is normal proxy, admin, or upgrade plumbing.

Processing Jobs

Status & attempts
ID Type Status Attempts Heartbeat
40074 artifact.fetch complete 1 / 3 3 months ago
40075 proxy.resolve complete 1 / 3 3 months ago
40076 tool.cast_disasm complete 1 / 3 3 months ago
40077 analysis.bundle complete 1 / 3 3 months ago
40078 capability.graph complete 1 / 3 3 months ago
40079 detector.run complete 1 / 3 3 months ago
40080 validation.fork complete 1 / 3 3 months ago
40226 report.consolidate complete 1 / 6 3 months ago
40227 tool.slither failed 2 / 2 3 months ago

Artifact

Runtime bytecode: available
Creation TX:
Deployer:
Proxy: yes onchain_only
Verified Source: yes
Proxy evidence
{
    "method": "minimal_proxy",
    "status": "onchain_only",
    "implementation": "0x516b8ca95eb59e7a69d79a27522ed63fcbe22b64",
    "onchain_method": "minimal_proxy"
}

Slither

tool.slither
Status
failed slither failed (exit 1): 'forge clean' running (wd: /tmp/slither-mzqt6qmh) 'forge config --json' running 'forge build --build-info --skip ./test/** ./script/** --force' running (wd: /tmp/slither-mzqt6qmh) 'forge' returned non-zero exit code 1 Error: Encountered invalid solc version in lib/openzeppelin-contracts/contracts/utils/Strings.sol: No solc version exists that matches the version requirement: ^0.8.24 Traceback (most recent call last): File "/var/www/tripwire/.venv/bin/slither", line 10, in <module> sys.exit(main()) ~~~~^^ File "/var/www/tripwire/.venv/lib/python3.13/site-packages/slither/__main__.py", line 776, in main main_impl(all_detector_classes=detectors, all_printer_classes=printers) ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/var/www/tripwire/.venv/lib/python3.13/site-packages/slither/__main__.py", line 882, in main_impl ) = process_all(filename, args, detector_classes, printer_classes) ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/var/www/tripwire/.venv/lib/python3.13/site-packages/slither/__main__.py", line 96, in process_all compilations = compile_all(target, **vars(args)) File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/crytic_compile.py", line 722, in compile_all compilations.append(CryticCompile(target, **kwargs)) ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^ File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/crytic_compile.py", line 211, in __init__ self._compile(**kwargs) ~~~~~~~~~~~~~^^^^^^^^^^ File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/crytic_compile.py", line 633, in _compile self._platform.compile(self, **kwargs) ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^ File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/platform/foundry.py", line 102, in compile hardhat_like_parsing( ~~~~~~~~~~~~~~~~~~~~^ crytic_compile, str(self._target), build_directory, str(self._project_root) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ) ^ File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/platform/hardhat.py", line 52, in hardhat_like_parsing raise InvalidCompilation(txt) crytic_compile.platform.exceptions.InvalidCompilation: Compilation failed. Can you run build command? /tmp/slither-mzqt6qmh/out/build-info is not a directory.
Attempts
2 / 2
Findings
0
Solc
View stderr
Traceback (most recent call last):
  File "/var/www/tripwire/worker/worker.py", line 198, in main
    payload = dispatch_job(job_type, job_id, job_meta, run_data, config, laravel_client)
  File "/var/www/tripwire/worker/worker.py", line 114, in dispatch_job
    return slither_run.run(job_id, job_meta, run_data, config, log, laravel_client)
           ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/var/www/tripwire/worker/jobs/slither_run.py", line 1084, in run
    stdout_text, stderr_text, result_json = _run_slither(
                                            ~~~~~~~~~~~~^
        workspace,
        ^^^^^^^^^^
    ...<4 lines>...
        target_path=target_path,
        ^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/var/www/tripwire/worker/jobs/slither_run.py", line 958, in _run_slither
    raise RuntimeError(f"slither failed (exit {result.returncode}): {stderr_text or stdout_text}")
RuntimeError: slither failed (exit 1): 'forge clean' running (wd: /tmp/slither-mzqt6qmh)
'forge config --json' running
'forge build --build-info --skip ./test/** ./script/** --force' running (wd: /tmp/slither-mzqt6qmh)
'forge' returned non-zero exit code 1
Error: Encountered invalid solc version in lib/openzeppelin-contracts/contracts/utils/Strings.sol: No solc version exists that matches the version requirement: ^0.8.24
Traceback (most recent call last):
  File "/var/www/tripwire/.venv/bin/slither", line 10, in <module>
    sys.exit(main())
             ~~~~^^
  File "/var/www/tripwire/.venv/lib/python3.13/site-packages/slither/__main__.py", line 776, in main
    main_impl(all_detector_classes=detectors, all_printer_classes=printers)
    ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/var/www/tripwire/.venv/lib/python3.13/site-packages/slither/__main__.py", line 882, in main_impl
    ) = process_all(filename, args, detector_classes, printer_classes)
        ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/var/www/tripwire/.venv/lib/python3.13/site-packages/slither/__main__.py", line 96, in process_all
    compilations = compile_all(target, **vars(args))
  File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/crytic_compile.py", line 722, in compile_all
    compilations.append(CryticCompile(target, **kwargs))
                        ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^
  File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/crytic_compile.py", line 211, in __init__
    self._compile(**kwargs)
    ~~~~~~~~~~~~~^^^^^^^^^^
  File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/crytic_compile.py", line 633, in _compile
    self._platform.compile(self, **kwargs)
    ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^
  File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/platform/foundry.py", line 102, in compile
    hardhat_like_parsing(
    ~~~~~~~~~~~~~~~~~~~~^
        crytic_compile, str(self._target), build_directory, str(self._project_root)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/var/www/tripwire/.venv/lib/python3.13/site-packages/crytic_compile/platform/hardhat.py", line 52, in hardhat_like_parsing
    raise InvalidCompilation(txt)
crytic_compile.platform.exceptions.InvalidCompilation: Compilation failed. Can you run build command?
/tmp/slither-mzqt6qmh/out/build-info is not a directory.

Codex

report.consolidate
Job Status
complete
Attempts
1 / 6
Findings
0
No findings?
yes
Summary
Reviewed `ERC721TL` implementation in scope; no exploitable vulnerabilities found in the audited first‑party code under the requested focus areas.
View stdout
{"no_findings":true,"summary":"Reviewed `ERC721TL` implementation in scope; no exploitable vulnerabilities found in the audited first‑party code under the requested focus areas.","findings":[]}
View stderr
OpenAI Codex v0.77.0 (research preview)
--------
workdir: /tmp/codex-f1tmyr3d
model: gpt-5.2-codex
provider: openai
approval: never
sandbox: read-only
reasoning effort: high
reasoning summaries: auto
session id: 019bb4a6-5528-7eb1-8800-fd91fa6e50b5
--------
user
Context: The user requested the proxy at 0xbb77dd67d90dd7d654c30a917458cf997c87eae3.
Audit the implementation at 0x516b8ca95eb59e7a69d79a27522ed63fcbe22b64.
Findings should refer to the implementation unless explicitly about proxy mechanics.

You are a security auditor. Audit this Solidity codebase for exploitable vulnerabilities.
Focus on: reentrancy, access control, upgradeability/proxy issues, signature validation, oracle manipulation,
accounting/invariant breaks, external call patterns, unchecked return values, and dangerous delegatecall.

Scope rules:
- You MUST fully read `AUDIT_BUNDLE.txt` before concluding. It contains the complete contents of all first-party Solidity sources in this workspace.
- Treat `lib/` and `@openzeppelin/` as third-party dependencies; skip them unless there is a concrete misuse angle in first-party code.
- If there are only dependency files and no first-party sources, set no_findings=true and explain in summary.

Output MUST be valid JSON matching the provided schema.
- If you find nothing meaningful: set no_findings=true and findings=[].
- Otherwise: set no_findings=false and include findings with severity/category/title and file/line locations when possible.

Output constraints (IMPORTANT):
- severity MUST be exactly one of: info, low, medium, high, critical (lowercase).
- category MUST be exactly one of: access_control, reentrancy, math, oracle, upgradeability, auth, other.
Keep summary short and concrete.
mcp startup: no servers

thinking
**Reading AUDIT_BUNDLE content**
exec
/bin/bash -lc ls in /tmp/codex-f1tmyr3d succeeded in 7ms:
AUDIT_BUNDLE.txt
codex-output-schema.json
dependencies
src
exec
/bin/bash -lc 'cat AUDIT_BUNDLE.txt' in /tmp/codex-f1tmyr3d succeeded in 6ms:
This file concatenates the full contents of first-party Solidity sources for auditing.
Do not treat dependency code under lib/ or @openzeppelin/ as first-party.

================================================================================
FILE: dependencies/tl-sol-tools-3.1.4/dependencies/@openzeppelin-contracts-5.0.2/interfaces/IERC165.sol
================================================================================
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)

pragma solidity ^0.8.20;

import {IERC165} from "../utils/introspection/IERC165.sol";

================================================================================
FILE: dependencies/tl-sol-tools-3.1.4/dependencies/@openzeppelin-contracts-5.0.2/interfaces/IERC4906.sol
================================================================================
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC4906.sol)

pragma solidity ^0.8.20;

thinking
**Searching for main contract in bundle**
exec
/bin/bash -lc 'rg -n "contract" AUDIT_BUNDLE.txt' in /tmp/codex-f1tmyr3d succeeded in 25ms:
5:FILE: dependencies/tl-sol-tools-3.1.4/dependencies/@openzeppelin-contracts-5.0.2/interfaces/IERC165.sol
15:FILE: dependencies/tl-sol-tools-3.1.4/dependencies/@openzeppelin-contracts-5.0.2/interfaces/IERC4906.sol
39:FILE: dependencies/tl-sol-tools-3.1.4/dependencies/@openzeppelin-contracts-5.0.2/interfaces/IERC721.sol
49:FILE: dependencies/tl-sol-tools-3.1.4/dependencies/@openzeppelin-contracts-5.0.2/interfaces/draft-IERC6093.sol
214:FILE: dependencies/tl-sol-tools-3.1.4/dependencies/@openzeppelin-contracts-5.0.2/token/ERC721/IERC721.sol
224: * @dev Required interface of an ERC721 compliant contract.
265:     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon
273:     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
283:     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon
353:FILE: dependencies/tl-sol-tools-3.1.4/dependencies/@openzeppelin-contracts-5.0.2/token/ERC721/IERC721Receiver.sol
362: * @dev Interface for any contract that wants to support safeTransfers
363: * from ERC721 asset contracts.
367:     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
385:FILE: dependencies/tl-sol-tools-3.1.4/dependencies/@openzeppelin-contracts-5.0.2/token/ERC721/extensions/IERC721Metadata.sol
416:FILE: dependencies/tl-sol-tools-3.1.4/dependencies/@openzeppelin-contracts-5.0.2/utils/Strings.sol
514:FILE: dependencies/tl-sol-tools-3.1.4/dependencies/@openzeppelin-contracts-5.0.2/utils/introspection/IERC165.sol
525: * Implementers can declare support of contract interfaces, which can then be
532:     * @dev Returns true if this contract implements the interface defined by
543:FILE: dependencies/tl-sol-tools-3.1.4/dependencies/@openzeppelin-contracts-5.0.2/utils/math/Math.sol
594:            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522

thinking
**Searching source files in bundle**
exec
/bin/bash -lc 'rg -n "FILE: src" AUDIT_BUNDLE.txt' in /tmp/codex-f1tmyr3d succeeded in 7ms:
2698:FILE: src/erc-721/ERC721TL.sol
3155:FILE: src/erc-721/IERC721TL.sol
3215:FILE: src/interfaces/IBlockListRegistry.sol
3257:FILE: src/interfaces/ICreatorBase.sol
3341:FILE: src/interfaces/IMutableMetadata.sol
3364:FILE: src/interfaces/IStory.sol
3439:FILE: src/interfaces/ITLNftDelegationRegistry.sol

thinking
**Inspecting ERC721TL implementation**
exec
/bin/bash -lc "sed -n '2698,3154p' AUDIT_BUNDLE.txt" in /tmp/codex-f1tmyr3d succeeded in 6ms:
FILE: src/erc-721/ERC721TL.sol
================================================================================
// SPDX-License-Identifier: MIT
pragma solidity 0.8.22;

import {IERC4906} from "@openzeppelin-contracts-5.0.2/interfaces/IERC4906.sol";
import {Strings} from "@openzeppelin-contracts-5.0.2/utils/Strings.sol";
import {
    ERC721Upgradeable,
    IERC165,
    IERC721
} from "@openzeppelin-contracts-upgradeable-5.0.2/token/ERC721/ERC721Upgradeable.sol";
import {OwnableAccessControlUpgradeable} from
    "tl-sol-tools-3.1.4/upgradeable/access/OwnableAccessControlUpgradeable.sol";
import {EIP2981TLUpgradeable} from "tl-sol-tools-3.1.4/upgradeable/royalties/EIP2981TLUpgradeable.sol";
import {IBlockListRegistry} from "../interfaces/IBlockListRegistry.sol";
import {ICreatorBase} from "../interfaces/ICreatorBase.sol";
import {IMutableMetadata} from "../interfaces/IMutableMetadata.sol";
import {IStory} from "../interfaces/IStory.sol";
import {ITLNftDelegationRegistry} from "../interfaces/ITLNftDelegationRegistry.sol";


thinking
**Analyzing ERC721 batch mint and transfer logic**

I’m dissecting how batch minting affects ownership and balances, focusing on the override of _ownerOf and its interplay with transfers, burns, and approvals. I’m also checking for reentrancy possibilities during mint and burn calls, as well as access control and edge cases like zero address checks and delegation registry interactions. Overall, I’m validating that the batch mint design aligns with ERC721 standards without introducing vulnerabilities.
thinking
**Evaluating approval and initialization nuances**

I’m inspecting how approvals interact with batch minted tokens and reviewing the initialize function’s handling of owner setup. I’m also considering potential edge cases around operator blocklist checks, token burning states, and address validation during minting to spot any subtle issues that could affect contract behavior or security.
exec
/bin/bash -lc 'rg -n "function _mint" -n AUDIT_BUNDLE.txt' in /tmp/codex-f1tmyr3d succeeded in 7ms:
2058:    function _mint(address to, uint256 tokenId) internal {
exec
/bin/bash -lc "sed -n '2038,2075p' AUDIT_BUNDLE.txt" in /tmp/codex-f1tmyr3d succeeded in 10ms:

        $._owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        return from;
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */

thinking
**Analyzing batchMint ownership and balance logic**
exec
/bin/bash -lc 'rg -n "function _requireOwned" -n AUDIT_BUNDLE.txt' in /tmp/codex-f1tmyr3d succeeded in 15ms:
2224:    function _requireOwned(uint256 tokenId) internal view returns (address) {
exec
/bin/bash -lc "sed -n '2218,2238p' AUDIT_BUNDLE.txt" in /tmp/codex-f1tmyr3d succeeded in 6ms:
    /**
     * @dev Reverts if the `tokenId` doesn't have a current owner (it hasn't been minted, or it has been burned).
     * Returns the owner.
     *
     * Overrides to ownership logic should be done to {_ownerOf}.
     */
    function _requireOwned(uint256 tokenId) internal view returns (address) {
        address owner = _ownerOf(tokenId);
        if (owner == address(0)) {
            revert ERC721NonexistentToken(tokenId);
        }
        return owner;
    }

    /**
     * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target address. This will revert if the
     * recipient doesn't accept the token transfer. The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens

thinking
**Analyzing token ownership and batch mint risks**
codex
{"no_findings":true,"summary":"Reviewed `ERC721TL` implementation in scope; no exploitable vulnerabilities found in the audited first‑party code under the requested focus areas.","findings":[]}
tokens used
30,727
Metadata
{
    "codex": {
        "ran_at": "2026-01-13T00:01:42.755835+00:00",
        "returncode": 0
    },
    "project": {
        "mode": "source",
        "file_count": 27,
        "import_count": 34,
        "first_party_contracts_count": 27
    },
    "summary": "Reviewed `ERC721TL` implementation in scope; no exploitable vulnerabilities found in the audited first\u2011party code under the requested focus areas.",
    "raw_final": {
        "summary": "Reviewed `ERC721TL` implementation in scope; no exploitable vulnerabilities found in the audited first\u2011party code under the requested focus areas.",
        "findings": [],
        "no_findings": true
    },
    "no_findings": true,
    "proxy_context": {
        "proxy_run_id": "019bb490-f357-73a9-a37d-3131c31270dd",
        "proxy_address": "0xbb77dd67d90dd7d654c30a917458cf997c87eae3",
        "implementation_run_id": "019bb491-5c99-70d4-b14e-863e8385bc51",
        "implementation_address": "0x516b8ca95eb59e7a69d79a27522ed63fcbe22b64"
    },
    "schema_version": 1
}

Opcode Heuristics

tool.cast_disasm
Delegatecall
1
Selfdestruct
0
CREATE2
0
CALL-family (heavy)
0
EXT*/BALANCE
0
Total opcodes
24
Flags
delegatecall_present
View cast disassembly output
00000000: CALLDATASIZE
00000001: RETURNDATASIZE
00000002: RETURNDATASIZE
00000003: CALLDATACOPY
00000004: RETURNDATASIZE
00000005: RETURNDATASIZE
00000006: RETURNDATASIZE
00000007: CALLDATASIZE
00000008: RETURNDATASIZE
00000009: PUSH20 0x516b8ca95eb59e7a69d79a27522ed63fcbe22b64
0000001e: GAS
0000001f: DELEGATECALL
00000020: RETURNDATASIZE
00000021: DUP3
00000022: DUP1
00000023: RETURNDATACOPY
00000024: SWAP1
00000025: RETURNDATASIZE
00000026: SWAP2
00000027: PUSH1 0x2b
00000029: JUMPI
0000002a: REVERT
0000002b: JUMPDEST
0000002c: RETURN

Findings

validated = confirmed for call sinks; sink observed for others
Severity Category Tool Title Confidence Validated Confirmed Details
critical upgradeability detector Untrusted DELEGATECALL target reachable 70 no no
view
trace_id: 0x8adfe4d382dacbd45d840928d2cd7d714316342f38aa2758e82c78abb0a45d8b
call_targets: 0x516b8ca95eb59e7a69d79a27522ed63fcbe22b64
target_varies: no
classification: constant_target
validation_json
{
    "sink": "DELEGATECALL",
    "errors": 0,
    "status": "sink_reached",
    "attempts": 1,
    "trace_id": "0x8adfe4d382dacbd45d840928d2cd7d714316342f38aa2758e82c78abb0a45d8b",
    "confirmed": false,
    "trace_mode": "callTracer",
    "call_targets": [
        "0x516b8ca95eb59e7a69d79a27522ed63fcbe22b64"
    ],
    "matched_probe": null,
    "target_varies": false,
    "classification": "constant_target"
}
witness_json
{
    "notes": "heuristic witness; entrypoints are best-effort selectors with zeroed calldata",
    "constraints": [],
    "entrypoints": [
        {
            "calldata": "0x",
            "selector": "fallback",
            "calldata_variants": [
                "0x"
            ]
        }
    ]
}
evidence_json
{
    "examples": [
        {
            "pc": 31,
            "opcode": "DELEGATECALL",
            "returndata_checked": null,
            "value_expression_category": "n/a",
            "target_expression_category": "computed"
        }
    ],
    "guards_detected": [],
    "delegatecall_count": 1,
    "untrusted_delegatecall_count": 1
}
medium upgradeability cast DELEGATECALL present 80 no
view
evidence_json
{
    "notes": "delegatecall enables execution in caller context; common in proxies/upgradeable patterns",
    "delegatecall_count": 1
}