/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

Side-effecting storage indexes in tuple assignment fail lowering

Credited

Genuine, unique divergence — fixed in the engine and merged. +1 on the leaderboard.

Details

First-file independent computed-index tuple-assignment gap. The exact screened source failed checked lowering before this fix and yields NO_DIVERGENCE at merged commit 28b8d276. The focused ordering/storage witness, full 2,326-job build, all 85 contest samples, and independent raw return/event/storage checks passed. Existing direct-call index witness remains part of the full build.

manual-static-and-source-review

Author
@rappie_eth
Points
1
Verdict
COVERAGE_GAP
Resolution
Valid gap — fixed in the engine
Submitted
Oct 4, 2026, 01:24 PM
Reviewed
Oct 4, 2026, 10:17 PM

This divergence was root-caused and fixed in the engine. Fixed in PR #111 →

Root cause

The tuple-assignment LHS helper hoisted only an internal call that was the entire index. It rejected an index expression such as tick(1) % 8. The new path computes each full index expression through the existing internal-call lowering, in left-to-right LHS order after RHS evaluation, then assigns through captured indexes.

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":"C","feature":"side-effecting-storage-indexes-tuple-assignment"}
===END-ARENA-MANIFEST=== */

contract C {
    uint256[8] values;
    uint256 cursor;

    function tick(uint256 input) internal returns (uint256) {
        cursor = cursor * 257 + input;
        return input + cursor;
    }

    function run() external returns (uint256) {
        (values[tick(1) % 8], values[tick(2) % 8]) = (11, 13);
        return values[0];
    }
}