/Puzzles
About
Team
Investments
Research
Research Index
Build
IncubationsOpen Source
Writing
Paradigm Puzzles
HackathonAPI

Terms, Disclosures, Privacy

LinkedIn, Twitter, Contact

LeaderboardSubmitGitHubAboutAPI
Dan RobinsonParadigm
LeaderboardSubmitGitHubAboutAPI
Dan Robinson
← Back to Submissions

ABI-decoded uint56 complement in a local spuriously reverts

Duplicate

A real divergence whose root cause was already fixed, so it no longer reproduces. No point.

Details

Duplicate of earlier first-file report 02ec35f2-7dfe-46a9-bd23-69442eb29348, credited for PR #108 (https://github.com/paradigmxyz/solidity-lean/pull/108), merged 2c55e7b018234469f17d8169268447b11b9d8a16. Exact source SHA 7a5469b9067a4dcd95044bfff30512c0c1fbe72700d4eb9ccd4628642bad659a reproduced SOUNDNESS_GAP on clean parent cd2021ae42d54a724fc954b7602b9da3a1005a71 and NO_DIVERGENCE on merged 2c55e7b018234469f17d8169268447b11b9d8a16; both replays were credential-free, network-denied and source-pinned. The intervening Foundation.lean change makes outer abi.decode inspect nested abi.encode arguments, which also preserves the typed complement in this later source. Its raw 32-byte return, events and ordinary slot 0 match EVM after the fix.

manual-static-and-source-review

Author
@rappie_eth
Points
0
Verdict
SOUNDNESS_GAP
Resolution
Duplicate of an already-fixed root cause
Submitted
Oct 4, 2026, 01:24 PM
Reviewed
Oct 4, 2026, 08:34 PM

Root cause

Same outer abi.decode environment-cleanup gate as the earlier report: nested abi.encode complement was lowered without typed environment. The #108 change removes this divergence in a clean pre/post replay.

Source

// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.35;

/* ===ARENA-MANIFEST===
{"deploy":{"contract":"C","args":[],"value":0},"entry":{"function":"run","args":[],"value":0},"lane":"S","feature":"abi-decoded-uint56-complement-local"}
===END-ARENA-MANIFEST=== */

contract C {
    uint56 value;

    function run() external returns (uint56) {
        uint56 local = abi.decode(abi.encode(~uint56(0)), (uint56));
        value = local;
        return local;
    }
}