1// SPDX-License-Identifier: UNLICENSED2pragma solidity ^0.8.20;3import {IPuzzle} from "curta/src/interfaces/IPuzzle.sol";4
5// NOTE: This is PUZZLE.SOL file -- NERVCommand.huff file is concatenated below.6// Find both files and a working example at : https://github.com/devtooligan/curta-elohim7
8/**9 *                        ()                        ^^                  - (     )-10 *                        |                                         v    ' / | \ `11 *                   //****\\            .12 *           =======//  * * \\======                     <13 *         ///===\ //\\____//  ===\\\            .                       ^      ^14 *        |||     \|         |/    \\\15 *        |||      |  O---O  |      \\\___....                   .          .           .16 *        |||      |    -    |       \\\///oo///=-=-=-*>*>*>17 *        X|X      |         |        XX|X===////''                 : '     (     ` /18 *       ()||\     |  O---O  |           ^^^^     _________           *   _|19 *       | /  \  //    /\    \\                  | o o o o |         **__/||\_20 *                \\    \ \    \\     ____       | o o o o |___      ** O  O  |21 *                 \\   \  \   ||    |o  o|  /|==| o o o o | - |____ |  O  O  |22 *                  || ||   \  ||    |o  o| /=|  | o o o o | - | == ||  O  O  |23 *                 /_____\  /_____\  |    |/  |  | o ||| o |   |  = ||  |^|^| |\24 *25 *             Elohim: The Fifth Impact26 *     =====================================27 *28 *     In the looming shadow of impending annihilation, humanity confronts an unparalleled menace29 *     — the Elohim.  These warrior angels wield weapons of insurmountable destruction and can30 *     communicate with their hive through their ethereal antennae. A single Elohim scout has31 *     arrived on Earth signaling the ominous advance of an entire fleet, poised to unleash the32 *     cataclysmic Fifth Impact upon our world.33 *34 *     From the depths of NERV Command, a beacon of hope emerges: Eva Units Seven, Eight, Nine,35 *     and Ten. These quantum-linked marvels of technology, can synchronize under the command of a36 *     single pilot.37 *38 *     Now the destiny of Tokyo-3 and all of Earth hinges upon you, pilot.39 *40 *     Can you master the four Evas, quell the Elohim threat, and unlock their DNA sequence to41 *     halt the impending invasion?42 *43 *     In this climactic clash of unity and chaos, where humanity's essence is laid bare, the44 *     moment has arrived to brave the unknown. Are you prepared to become the savior, our final45 *     hope in the darkest hour?46 *47 *     The Fifth Impact looms, and the ultimate battle ignites.48 */49
50contract Puzzle is IPuzzle {51    error QuantumOpcodeError(bytes1 opcode);52
53    address public NERV;54    address internal impl;55    address internal immutable addressThis;56    address internal immutable owner;57
58    constructor(address nerv_) {59        NERV = nerv_;60        impl = address(this);61        addressThis = address(this);62        owner = msg.sender;63    }64
65    ////////////////////////////////////////////////////////////////////////////////////////66    //                              CORE PILOT FUNCTIONS                                  //67    ////////////////////////////////////////////////////////////////////////////////////////68
69    function name() external pure returns (string memory) {70        return "Elohim";71    }72
73    /// @dev This function returns the pilot's account address.74    function generate(address _seed) external pure returns (uint256) {75        return uint160(_seed);76    }77
78    function verify(uint256 pilotAddress, uint256 input) external view returns (bool worldSaved) {79        return Puzzle(impl)._verify(pilotAddress, input);80    }81
82    function _verify(uint256 pilotAddress, uint256 input) external view returns (bool worldSaved) {83        /******************************* input ***************************************************84         **   | Evangelion                             | Eva    | Elohim DNA   | Simulator      **85         **   | Control Address                        | Config | Prediction   | Difficulty     **86         ** 0x 00112233445566778899AABBCCDDEEFF00112233 A1A2A3A3 AAAAAAAAAAAAAA 18              **87         *****************************************************************************************/88        require(msg.sender == addressThis, "ser, this is a wendy's");89        address pilot = address(uint160(pilotAddress));90
91        /** Simulator Difficulty */92        uint8 difficulty = uint8(input);93        _validateSimulatorDifficulty(difficulty, pilot);94
95        /** Elohim DNA96        It's up to you to develop an algorithm that can predict the Elohim's DNA sequence in97        advance. If you can do it, we can develop genetic weaponry to take on the invaders and98        we just might have a chance at saving the world. */99        uint56 dnaVerification = uint56(uint256(input >> 8));100
101        /** Eva Config102        The Eva configuration is based on a combination of the pilot's DNA and time-dependent103        environmental factors. These settings must be used in the submitted input, pilot. */104        uint256 config = (input & CONFIG_MASK) >> 64;105        if (generateEvaConfig(pilot, difficulty) != config) revert("invalid eva config");106        uint256[] memory configVals = new uint256[](4);107        for (uint256 idx; idx < 4; ++idx) {108            configVals[idx] = uint8(config >> (3 - idx) * 8);109        }110
111        /** Evangelion Control Address */112        address solutionAddress = address(uint160((input & ADDRESS_MASK) >> 96));113        _validateEvangelionControlProtocol(solutionAddress, difficulty); /**114
115
116                        ██████████████████████████████████████████████117                        █░░░░░░█████████░░░░░░░░░░░░░░█░░░░░░░░░░░░░░█118                        █░░▄▀░░█████████░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀▄▀▄▀▄▀▄▀░░█119                        █░░▄▀░░█████████░░▄▀░░░░░░░░░░█░░▄▀░░░░░░░░░░█120                        █░░▄▀░░█████████░░▄▀░░█████████░░▄▀░░█████████121                        █░░▄▀░░█████████░░▄▀░░░░░░░░░░█░░▄▀░░█████████122                        █░░▄▀░░█████████░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀░░██░░░░░░█123                        █░░▄▀░░█████████░░▄▀░░░░░░░░░░█░░▄▀░░██░░▄▀░░█124                        █░░▄▀░░█████████░░▄▀░░█████████░░▄▀░░██░░▄▀░░█125                        █░░▄▀░░░░░░░░░░█░░▄▀░░█████████░░▄▀░░░░░░▄▀░░█126                        █░░▄▀▄▀▄▀▄▀▄▀░░█░░▄▀░░█████████░░▄▀▄▀▄▀▄▀▄▀░░█127                        █░░░░░░░░░░░░░░█░░░░░░█████████░░░░░░░░░░░░░░█128                        ██████████████████████████████████████████████129                                     Defeat the Elohim130
131        You're cleared to establish Eva-link with NERV Command...132        This is it pilot -- good luck and God speed! */133        (uint256 s2EngineCheck, uint256 dnaSampled) = callNERVCommand(solutionAddress, configVals, difficulty);134
135
136        // Post-op S2 Engine integrity check137        _superSolenoidEngineCheck(s2EngineCheck, difficulty);138
139
140        // Are ya winning, son?141        worldSaved = dnaSampled == dnaVerification;142    }143
144    // Syncing with an Evangelion is a delicate process.145    // Configuration settings are based on the pilot's DNA and temporal environment factors.146    // All configuration settings must be valid quantum values -- 0x69 is sacred.147    function generateEvaConfig(address _seed, uint8 difficulty) public view returns (uint256 actualSeed) {148        uint256 adjustedBlock;149        if (difficulty == DIFFICULTY_LEVEL_HARD) adjustedBlock = block.number >> 7;150        if (difficulty == DIFFICULTY_LEVEL_INSANE) adjustedBlock = block.number >> 5;151        if (difficulty == DIFFICULTY_LEVEL_IMPOSSIBLE) adjustedBlock = block.number >> 3;152        if (difficulty == DIFFICULTY_LEVEL_CHAINLIGHT) adjustedBlock = block.number;153
154        uint32 hash = uint32(bytes4(keccak256(abi.encodePacked(_seed, adjustedBlock))));155
156        uint256 val;157        uint256 shiftAmount;158        for (uint256 idx; idx < 4; ++idx) {159            shiftAmount = (3 - idx) * 8;160            val = uint8(hash >> shiftAmount);161            if (val <= 0x1 || !_isValidQuantumValue(bytes1(uint8(val)), difficulty)) {162                val = 0x69;163            }164            actualSeed |= (val << shiftAmount);165        }166    }167
168   function callNERVCommand(address solutionAddress, uint256[] memory configVals, uint8 difficulty)169        public170        view171        returns (uint256 s2EngineCheck, uint256 dnaSampled)172    {173        /**174                                     __ _._.,._.__175                                .o8888888888888888P'176                                .d88888888888888888K177                ,8            888888888888888888888boo._178                :88b           888888888888888888888888888b.179                `Y8b          88888888888888888888888888888b.180                    `Yb.       d8888888888888888888888888888888b181                    `Yb.___.88888888888888888888888888888888888b182                        `Y888888888888888888888888888888CG88888P"'183                        `88888888888888888888888888888MM88P"'184        "Y888K    "Y8P""Y888888888888888888888888oo._""""185        88888b    8    8888`Y88888888888888888888888oo.186        8"Y8888b  8    8888  ,8888888888888888888888888o,187        8  "Y8888b8    8888""Y8`Y8888888888888888888888b.188        8    "Y8888    8888   Y  `Y8888888888888888888888189        8      "Y88    8888     .d `Y88888888888888888888b190        .d8b.      "8  .d8888b..d88P   `Y88888888888888888888191                                        `Y88888888888888888b.192                        "Y888P""Y8b. "Y888888888888888888888193                            888    888   Y888`Y888888888888888194                            888   d88P    Y88b `Y8888888888888195                            888"Y88K"      Y88b dPY8888888888P196                            888  Y88b       Y88dP  `Y88888888b197                            888   Y88b       Y8P     `Y8888888198                        .d888b.  Y88b.      Y        `Y88888199                                                        `Y88K200                                                            `Y8*/201
202        (bool success, bytes memory data) = address(NERV).staticcall(203            abi.encode(204                solutionAddress,205                configVals[0],206                configVals[1],207                configVals[2],208                configVals[3],209                difficulty210            )211        );212        require(success, "link interrupted");213        uint256 dnaSampledFull;214        (s2EngineCheck, dnaSampledFull) = abi.decode(data, (uint256, uint256));215        dnaSampled = uint56(dnaSampledFull);216    }217
218    ////////////////////////////////////////////////////////////////////////////////////////219    //                                  VALIDATIONS                                       //220    ////////////////////////////////////////////////////////////////////////////////////////221
222    function _validateSimulatorDifficulty(uint8 difficulty, address pilot) internal pure {223        /** There are 4 levels of difficulty that pilots can choose when entering the simulator:224
225        0x01 - HARD226        0x02 - INSANE227        0x03 - IMPOSSIBLE228        0x18 - CHAINLIGHT229
230        Pilot ranked #1 on the Curta leaderboard must select CHAINLIGHT231        Pilots ranked #2-#10 on the Curta leaderboard must select at least level IMPOSSIBLE232        Pilots ranked #11-#25 must select at least difficulty level INSANE233        All other pilots must select at least difficulty level HARD234
235        Warning: Choosing the CHAINLIGHT difficulty means engaging in a live battle with the236        Elohim. The number one rank on the leaderboard is required to engage in this mode, but237        anyone brave enough can also try. Evangelions lost in this mode CANNOT be revived.238
239        Choose your difficulty by setting the lowest byte of the solution to the desired difficulty240        level. Choosing a higher difficulty is guaranteed to bring you untold fame, new friends,241        and increased chances of finding a girlfriend. */242
243        bool valid;244        if (_isLeadeboardTopDog(pilot)) {245            valid = difficulty == DIFFICULTY_LEVEL_CHAINLIGHT;246        } else if (_isLeaderboardTop10(pilot)) {247            valid = _isDifficultyImpossibleOrHigher(difficulty);248        } else if (_isLeaderboardTop25(pilot)) {249            valid = _isDifficultyInsaneOrHigher(difficulty);250        } else {251            valid = difficulty == DIFFICULTY_LEVEL_HARD || _isDifficultyInsaneOrHigher(difficulty);252        }253
254        require(valid, "no plebs");  // you're like a pleb in a pillory in lieu of this exposé...255    }256
257    function _superSolenoidEngineCheck(uint256 s2EngineCheck, uint8 difficulty) internal pure {258        uint solenoidEngineThreshold;259        if (difficulty == DIFFICULTY_LEVEL_CHAINLIGHT) {260            solenoidEngineThreshold = 3748;261        } else if (difficulty == DIFFICULTY_LEVEL_IMPOSSIBLE) {262            solenoidEngineThreshold = 4000;263        } else if (difficulty == DIFFICULTY_LEVEL_INSANE) {264            solenoidEngineThreshold = 4150;265        } else if (difficulty == DIFFICULTY_LEVEL_HARD) {266            solenoidEngineThreshold = 4340;267        }268        require(s2EngineCheck <= solenoidEngineThreshold, "s2 engine failure");269    }270
271    function _isValidCodeSize(address solution, uint8 difficulty) internal view returns (bool) {272        uint256 maxCodeSize;273        if (difficulty == DIFFICULTY_LEVEL_CHAINLIGHT) {274            maxCodeSize = 189;275        } else if (difficulty == DIFFICULTY_LEVEL_IMPOSSIBLE) {276            maxCodeSize = 222;277        } else if (difficulty == DIFFICULTY_LEVEL_INSANE) {278            maxCodeSize = 300;279        } else if (difficulty == DIFFICULTY_LEVEL_HARD) {280            maxCodeSize = 466;281        }282        return solution.code.length <= maxCodeSize;283    }284
285    function _isValidQuantumValue(bytes1 opcd, uint8 difficulty) internal pure returns (bool) {286        if (difficulty == DIFFICULTY_LEVEL_CHAINLIGHT) {287            if (opcd == 0x18 || opcd == 0x42 || opcd == 0x44 ||288                opcd == 0x46 || opcd == 0x48) return false;289        }290        if (_isDifficultyImpossibleOrHigher(difficulty)) {291            if (opcd == 0x34 || opcd == 0x33 || opcd == 0x39 ||292                opcd == 0x3f || opcd == 0x40) return false;293        }294        if (_isDifficultyInsaneOrHigher(difficulty)) {295            if (opcd == 0xF1 || opcd == 0xF2 || opcd == 0xF4 ||296            opcd == 0xFa || opcd == 0xFe) return false;297        }298        return !(opcd == 0xf5 || opcd == 0xff);299    }300
301    function _validateQuantamValues(address solution, uint8 difficulty) internal view {302        bytes memory bts = solution.code;303        for (uint256 idx; idx < bts.length; ++idx) {304            if (!_isValidQuantumValue(bts[idx], difficulty)) revert QuantumOpcodeError(bts[idx]);305        }306    }307
308    function _isValidAddress(address solution, uint8 difficulty) public pure returns (bool valid) {309        if (difficulty == DIFFICULTY_LEVEL_HARD) {310            uint256 topBit = uint160(solution) >> 159;311            valid = topBit == 1;312        }313        if (difficulty == DIFFICULTY_LEVEL_INSANE) {314            valid = bytes1(bytes20(solution)) == bytes1(uint8(0x69));315        }316        if (difficulty == DIFFICULTY_LEVEL_IMPOSSIBLE) {317            valid = bytes2(bytes20(solution)) == bytes2(uint16(0x0420));318        }319        if (difficulty == DIFFICULTY_LEVEL_CHAINLIGHT) {320            valid = bytes3(bytes20(solution)) == bytes3(uint24(0x181818));321        }322    }323
324    function _validateEvangelionControlProtocol(address solution, uint8 difficulty) internal view {325        /** You're not a rookie any more, pilot.326
327        Runtime gas limits, bytecode size restraints, opcode restrictions, and vanity addresses are328        just par for the course. Let's do this and get on the battle field. */329        require(_isValidAddress(solution, difficulty), "mining failure");330        require(_isValidCodeSize(solution, difficulty), "too long! twss");331        _validateQuantamValues(solution, difficulty);332    }333
334    ////////////////////////////////////////////////////////////////////////////////////////335    //                                  UTILITIES                                         //336    ////////////////////////////////////////////////////////////////////////////////////////337
338    function _isLeadeboardTopDog(address addr) internal pure returns (bool) {339        return addr == LEADERBOARD_1_ADDRESS;340    }341
342    function _isLeaderboardTop10(address addr) internal pure returns (bool) {343        return addr == LEADERBOARD_2_ADDRESS || addr == LEADERBOARD_3_ADDRESS ||344               addr == LEADERBOARD_4_ADDRESS || addr == LEADERBOARD_5_ADDRESS ||345               addr == LEADERBOARD_6_ADDRESS || addr == LEADERBOARD_7_ADDRESS ||346               addr == LEADERBOARD_8_ADDRESS || addr == LEADERBOARD_9_ADDRESS ||347               addr == LEADERBOARD_10_ADDRESS;348    }349
350    function _isLeaderboardTop25(address addr) internal pure returns (bool) {351        return addr == LEADERBOARD_11_ADDRESS || addr == LEADERBOARD_12_ADDRESS ||352               addr == LEADERBOARD_13_ADDRESS || addr == LEADERBOARD_14_ADDRESS ||353               addr == LEADERBOARD_15_ADDRESS || addr == LEADERBOARD_16_ADDRESS ||354               addr == LEADERBOARD_17_ADDRESS || addr == LEADERBOARD_18_ADDRESS ||355               addr == LEADERBOARD_19_ADDRESS || addr == LEADERBOARD_20_ADDRESS ||356               addr == LEADERBOARD_21_ADDRESS || addr == LEADERBOARD_22_ADDRESS ||357               addr == LEADERBOARD_23_ADDRESS || addr == LEADERBOARD_24_ADDRESS ||358               addr == LEADERBOARD_25_ADDRESS;359    }360
361    function _isDifficultyImpossibleOrHigher(uint8 difficulty) internal pure returns (bool) {362        return difficulty == DIFFICULTY_LEVEL_IMPOSSIBLE ||363               difficulty == DIFFICULTY_LEVEL_CHAINLIGHT;364    }365
366    function _isDifficultyInsaneOrHigher(uint8 difficulty) internal pure returns (bool) {367        return difficulty == DIFFICULTY_LEVEL_INSANE ||368                               _isDifficultyImpossibleOrHigher(difficulty);369    }370
371
372    ////////////////////////////////////////////////////////////////////////////////////////373    //                                STATIC VALUES                                       //374    ////////////////////////////////////////////////////////////////////////////////////////375
376    uint256 constant ADDRESS_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000;377    uint256 constant CONFIG_MASK = 0x0000000000000000000000000000000000000000FFFFFFFF0000000000000000;378    uint256 constant ANSWER_MASK = 0x000000000000000000000000000000000000000000000000FFFFFFFFFFFFFF00;379
380    uint8 constant DIFFICULTY_LEVEL_HARD = 0x1;381    uint8 constant DIFFICULTY_LEVEL_INSANE = 0x2;382    uint8 constant DIFFICULTY_LEVEL_IMPOSSIBLE = 0x3;383    uint8 constant DIFFICULTY_LEVEL_CHAINLIGHT = 0x18; // 퍼즐 난이도 18이라니, 대박! 화이팅!384
385    address constant LEADERBOARD_1_ADDRESS = 0xB49bf876BE26435b6fae1Ef42C3c82c5867Fa149; // chainlight.io386    address constant LEADERBOARD_2_ADDRESS = 0x6E82554d7C496baCcc8d0bCB104A50B772d22a1F; // minimooger.eth387    address constant LEADERBOARD_3_ADDRESS = 0x4a69B81A2cBEb3581C61d5087484fBda2Ed39605; // jinu.eth388    address constant LEADERBOARD_4_ADDRESS = 0x14869c6bF40BBc73e45821F7c28FD792151b3f9A; // igorline.eth389    address constant LEADERBOARD_5_ADDRESS = 0x0Fc363b52E49074a395B075a6814Cb8F37E8F8BE; // p0pular.eth390    address constant LEADERBOARD_6_ADDRESS = 0xBDfeB5439f5daecb78A17Ff846645A8bDBbF5725; // datadanne.eth391    address constant LEADERBOARD_7_ADDRESS = 0x2de14DB256Db2597fe3c8Eed46eF5b20bA390823; // eoa.sina.eth392    address constant LEADERBOARD_8_ADDRESS = 0xB95777719Ae59Ea47A99e744AfA59CdcF1c410a1; // 0xcacti.eth393    address constant LEADERBOARD_9_ADDRESS = 0xd4057e08B9d484d70C5977784fC1f6D82d45ff67; // kalzak.eth394    address constant LEADERBOARD_10_ADDRESS = 0x97735C60c5E3C2788b7EE570306775e687095D19; // plotchy.eth395    address constant LEADERBOARD_11_ADDRESS = 0x4790c165A2c4B37527B56ac7772B792912C46329;396    address constant LEADERBOARD_12_ADDRESS = 0x0DEdcE798692E8C668d67e430151106aBC9ABCe1; // ngndev.eth397    address constant LEADERBOARD_13_ADDRESS = 0x433EA2df6D7c567B1Dd55e3FB99512222Cb23d95; // ragepit.eth398    address constant LEADERBOARD_14_ADDRESS = 0x79d31bFcA5Fda7A4F15b36763d2e44C99D811a6C; // horsefacts.eth399    address constant LEADERBOARD_15_ADDRESS = 0x0165f91FAF9EDeb9C5817c7a3c92110aa5329BeA; // pa-tate.eth400    address constant LEADERBOARD_16_ADDRESS = 0x58593392d72A9D90b133e1C8ecEec581C354687f; // sampriti.eth401    address constant LEADERBOARD_17_ADDRESS = 0x03433830468d771A921314D75b9A1DeA53C165d7; // karmafacts.eth402    address constant LEADERBOARD_18_ADDRESS = 0x79635b386B9bd6636Cd701879C32E6dd181C853F; // vicnaum.eth403    address constant LEADERBOARD_19_ADDRESS = 0x6b756b6905A07be65FD59b50e58dD4C965C32500;404    address constant LEADERBOARD_20_ADDRESS = 0x9470Ab9c3aAc221A57e94F522659D4327C5EAdEd; // sileo.eth405    address constant LEADERBOARD_21_ADDRESS = 0x5f71a197D303Cd700511323976067ECe43dE8AD0; // shung.crypto-frens.eth406    address constant LEADERBOARD_22_ADDRESS = 0x5DFfD5527551888c2AC47f799c4Dc8e830dECeE7; // sina.eth407    address constant LEADERBOARD_23_ADDRESS = 0xC6868e56b7BeCd885102fdaF33137F1712Bcf1d7; // 0xkitetsu.eth408    address constant LEADERBOARD_24_ADDRESS = 0x7976B5A96Dc857309498E8Ab0d342117c7C9e6c5; // adamegyed.eth409    address constant LEADERBOARD_25_ADDRESS = 0x286cD2FF7Ad1337BaA783C345080e5Af9bBa0b6e; // forager.eth410
411    ////////////////////////////////////////////////////////////////////////////////////////412    //                         NERV COMMAND SECURITY CLEARANCE REQUIRED                   //413    ////////////////////////////////////////////////////////////////////////////////////////414
415    function setNERV(address nerv_) external {416        require(msg.sender == owner);417        NERV = nerv_;418    }419    function properRug(address newImpl) external {420        require(msg.sender == owner);421        impl = newImpl;422    }423}424
425// ================END-OF-FILE: Puzzle.sol====================================================================================426
427
428
429// ================BEGIN-FILE: NERVCommand.huff====================================================================================430/**431
432                        ███╗░░██╗███████╗██████╗░██╗░░░██╗  ██╗░░██╗░██████╗░433                        ████╗░██║██╔════╝██╔══██╗██║░░░██║  ██║░░██║██╔═══██╗434                        ██╔██╗██║█████╗░░██████╔╝╚██╗░██╔╝  ███████║██║██╗██║435                        ██║╚████║██╔══╝░░██╔══██╗░╚████╔╝░  ██╔══██║╚██████╔╝436                        ██║░╚███║███████╗██║░░██║░░╚██╔╝░░  ██║░░██║░╚═██╔═╝░437                        ╚═╝░░╚══╝╚══════╝╚═╝░░╚═╝░░░╚═╝░░░  ╚═╝░░╚═╝░░░╚═╝░░438                          God's in His heaven, all's right with the world439
440  ┌─┬────────────────────────────────────────────────────────────────────────────────────────┬─┐441  │ ├────────────────────────────────────────────────────────────────────────────────────────┤ │442  │ │                    //  S  //  S  //================\\  S  \\  S  \                     │ │443  │ │                   //  S  //  S  //                  \\  S  \\  S \\                    │ │444  │ │    ┌────────────────────────────┐                 ┌────────────────────────────┐       │ │445  │ │    │DANANG TYPE-8 DEFENSE SCREEN│    ___          │TIME TO COLLAPSE :  223.229 │       │ │446  │ │    └────────────────────────────┘   \   \         └────────────────────────────┘       │ │447  │ │               //  S  //  S  //       \ X \              \\  S  \\  S \\                │ │448  │ │              //  S  //  S  //         \ X \_________     \\  S  \\  S \\               │ │449  │ │             //  S  //  S  //           \   CELEBRUM/      \\  S  \\  S \\              │ │450  │ │            //  S  //  S  //            /01 _______/        \\  S  \\  S \\             │ │451  │ │            \\  S  \\  S  \\           / M /                //  S  //  S //             │ │452  │ │             \\  S  \\  S  \\         / A /                //  S  //  S //              │ │453  │ │              \\  S  \\  S  \\       / G /                //  S  //  S //               │ │454  │ │               \\  S  \\  S  \\     /_I_/                //  S  //  S //                │ │455  │ │    ┌────────────────────────────┐                  ┌────────────────────────────┐      │ │456  │ │    │PROTECT NO. 666 ON MAGI-01  │                  │TIME SINCE/SCREEN RAISED 009│      │ │457  │ │    └────────────────────────────┘                  └────────────────────────────┘      │ │458  │ │                   \\  S  \\  S  \\                  //  S  //  S //                    │ │459  │ │                    \\  S  \\  S  \\================//  S  //  S //                     │ │460  │ ├────────────────────────────────────────────────────────────────────────────────────────┤ │461  └─┴────────────────────────────────────────────────────────────────────────────────────────┴─462
463      ================================EVANGELION-ERROR-CODES==============================464     XX                                                                                  XX465     XX                    0001 - Evangelion synchronization failed                      XX466     XX                    0002 - Wave 1 - Invalid Evangelion response                   XX467     XX                    0003 - Super Solenoid Engine failure                          XX468     XX                    0004 - AT Field Fragmentation                                 XX469     XX                    0005 - Soul Sync Out of Bounds                                XX470     XX                    0006 - Zero-Time Disruption                                   XX471     XX                    0007 - Alpha Z881                                             XX472     XX                    0008 - Elohim DNA mismatch                                    XX473     XX                    0009 - Fracked Inner Core                                     XX474     XX                    0010 - Soul Pattern Unknown                                   XX475     XX                    0011 - Angelic Code Injection                                 XX476     XX                    0012 - Instrumentation Query Malfunction                      XX477     XX                    0013 - Quantum Energy Flux                                    XX478     XX                    0014 - LCL Anomaly Detected                                   XX479     XX                    0015 - Soul Sync Cascade Failure                              XX480     XX                    0016 - Eva Unit Energy Flux                                   XX481     XX                                                                                  XX482      ===================================================================================483*/484
485                           #define function eva_SEVEN() nonpayable returns ()486                           #define function eva_EIGHT() nonpayable returns ()487                           #define function eva_NINE() nonpayable returns ()488                           #define function eva_TEN() nonpayable returns ()489                           #define constant DIFFICULTY_LEVEL_HARD = 0x1490                           #define constant DIFFICULTY_LEVEL_INSANE = 0x2491                           #define constant DIFFICULTY_LEVEL_IMPOSSIBLE = 0x3492                           #define constant LIVE_MODE_ACTIVATED = 0x18493                           #define constant CD_EVA_CONTROL_ADDRESS = 0x0494                           #define constant SIMULATOR_SETTING = 0xa0495                           #define constant MAX_GAS_FOR_EVA = 0x30d40496                           #define macro MAIN() = takes (0) returns (0) {497
498                           //╱╱╱╱ ╱╱ ╱╱ ╱╱╱ ╱╱╱╱ ╱╱╱╱╱╱╱ ╱╱╱╱╱╱╱ ╱╱ ╱╱╱╱╱499                           //╱╱╱ ╱ ╱╱ ╱╱╱ ╱ ╱ ╱ ╱╱╭╮╱╱/╱╱ ╱╱╱╭╮╱╱╱╱╱╭╮ ╱╱500                           //╱╱╱╱╱ ╱╱ ╱ ╱╱╱ ╱╱ ╱╱╱┃┃╱╱╱╱╱╱╱╱╭╯╰╮╱╱╱╱┃┃ ╱╱501                           //╱╭━━┳━━┳╮╭┳╮╭┳━━┳━╮╭━╯┃╭━━┳━━┳━╋╮╭╋━┳━━┫┃ ╱╱502                           //╱┃╭━┫╭╮┃╰╯┃╰╯┃╭╮┃╭╮┫╭╮┃┃╭━┫╭╮┃╭╮┫┃┃╭┫╭╮┃┃ ╱╱503                           //╱┃╰━┫╰╯┃┃┃┃┃┃┃╭╮┃┃┃┃╰╯┃┃╰━┫╰╯┃┃┃┃╰┫┃┃╰╯┃╰╮╱╱504                           // ╰━━┻━━┻┻┻┻┻┻┻╯╰┻╯╰┻━━╯╰━━┻━━┻╯╰┻━┻╯╰━━┻━╯505
506
507
508                                /** *************************** */509                                /** **   !!!START HERE!!!    ** */510                                /** *************************** */511
512                                /** 5F Push Zero to Initiate Attack513                                                 |514                                               \ | /515                                                \*/516                                               0x00517
518                                         /** がんばって!*/519
520                                              WAVE1()521
522                                         /** ファイト!*/523
524                                              WAVE2()525
526
527                                             // | \\528
529
530                                              // \\531
532    /**              WAVE's 1 and 2 are complete. The Elohim appears to be down...533    .534    ..535    ...536    ....537    ..............................................................................................538            ==> HARD and INSANE mode skip this part and proceed directly to fin: <==539
540                                    ███████╗██╗  ██╗██╗██████╗541                                    ██╔════╝██║ ██╔╝██║██╔══██╗542                                    ███████╗█████╔╝ ██║██████╔╝543                                    ╚════██║██╔═██╗ ██║██╔═══╝544                                    ███████║██║  ██╗██║██║545                                    ╚══════╝╚═╝  ╚═╝╚═╝╚═╝546            ==> HARD and INSANE mode skip this part and proceed directly to fin: <==547    ..............................................................................................548    */549    [SIMULATOR_SETTING] calldataload [DIFFICULTY_LEVEL_HARD] eq550    [SIMULATOR_SETTING] calldataload [DIFFICULTY_LEVEL_INSANE] eq or fin jumpi/**551    ..............................................................................................552    .....553    ....554    ...555    ..556    .557
558    NERV Commmand: Come in pilot! Sensors indicating the Elohim is still showing signs of life...559
560    We need you to finish it off with two final attack waves.  Go, go, go!561
562    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> */ ATTACK_WAVE1() ATTACK_WAVE2()563
564    /*************************/565    /**   LIVE MODE ONLY!!   *//** /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/// */566    /**                      */ [SIMULATOR_SETTING] calldataload [LIVE_MODE_ACTIVATED]        // */567    /** in simuluation mode  */ eq iszero fin jumpi                                           // */568    /** skip this section    *//** /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/// */569    /** and proceed to final */570    /**                      *  ->->->->->->->->->->->->->->->->->->  * \ . | * . . . * | . / */571    /**                      *  ->->->->->->->->->->->->->->->->->-> */    THE_FIFTH_IMPACT() // *572    /*********************** *  ->->->->->->->->->->->->->->->->->->  * / ' | * . . . * | ' \ */573
574    /** -/;.'/.`// \.*;'/+.`',.'-/';.&,;'.* \.;*-,.\ / ..,`*.&/';.&,;'.* \.;*-,.\ /;'.* \.;*-,.\ */575    /** -/;.'/.`// \.*;'/+.`',.'-/';.&,;'.* \.;*-,.\ / ..,`*.&/';.&,;'.* \.;*-,.\ /;'.* \.;*-,.\ */576    /** -/;.'/.`// \.*;'/+.`',.'-/';.&,;'.* \.;*-,.\ / ..,`*.&/';.&,;'.* \.;*-,.\ /;'.* \.;*-,.\ */577    /** -/;.'/.`// \.*;'/+.`',.'-/';.&,;'.* \.;*-,.\ / ..,`*.&/';.&,;'.* \.;*-,.\ /;'.* \.;*-,.\ */578    /** -/;.'/.`// \.*;'/+.`',.'-/';.&,;'.* \.;*-,.\ / ..,`*.&/';.&,;'.* \.;*-,.\ /;'.* \.;*-,.\ */579    /** -/;.'/.`// \.*;'/+.`',.'-/';.&,;'.* \.;*-,.\ / ..,`*.&/';.&,;'.* \.;*-,.\ /;'.* \.;*-,.\580                                            ___581                                            |__  | |\ |582                                            |    | | \|583
584        -/;.'/.`// \.*;'/+.`',.'-/';.&,;'.* \.;*-,.\ / ..,`*.&/';.&,;'.* \.;*-,.\ /;'.* \.;*-,.\ */585    /** -/;.'/.`// \.*;'/+.`',.'-/';.&,;'.* \.;*-,.\ / ..,`*.&/';.&,;'.* \.;*-,.\ /;'.* \.;*-,.\ */586    /** -/;.'/.`// \.*;'/+.`',.'-/';.&,;'.* \.;*-,.\ / ..,`*.&/';.&,;'.* \.;*-,.\ /;'.* \.;*-,.\ */587    /** -/;.'/.`// \.*;'/+.`',.'-/';.&,;'.* \.;*-,.\ / ..,`*.&/';.&,;'.* \.;*-,.\ /;'.* \.;*-,.\ */588    /** -/;.'/.`// \.*;'/+.`',.'-/';.&,;'.* \.;*-,.\ / ..,`*.&/';.&,;'.* \.;*-,.\ /;'.* \.;*-,.\ */589    /** -/;.'/.`// \.*;'/+.`',.'-/';.&,;'.* \.;*-,.\ / ..,`*.&/';.&,;'.* \.;*-,.\ /;'.* \.;*-,.\ */590
591                                                fin:592                /** You made it through, pilot. Did you predict the correct DNA sequence? */593
594                                0x20 mstore 0x00 mstore 0x40 0x00595                                                return596    }597
598
599// ================================EVANGELION-OPERATIONAL-MANDATES=================+MAGI-01-ORIGINAL600
601#define macro ZERO_TIME_SOUL_SYNC(errorcode) = takes (1) returns (0) {602    no_fail jumpi603    <errorcode> 0x00 mstore 0x20 0x00 revert604    no_fail:605}606
607#define macro ALPHA_Z8881() = takes (0) returns (0) {608    returndatasize 0x20 eq all_good jumpi609    0x7 0x00 mstore 0x20 0x00 revert610    all_good:611}612
613#define macro ANALYZE_EVA_RESPONSE() = takes (1) returns (0) {614    ZERO_TIME_SOUL_SYNC(0x01) ALPHA_Z8881()615}616
617
618// ================================EVANGELION-ATTACK-MANDATES=====================+MAGI-02-ORIGINAL619
620#define macro WAVE1() = takes (0) returns (0) {621    /**                                 INITIATE SYNCHRONIZED ATTACK WAVE 0x1 */ ATTACK_WAVE1() /**622
623                     \\624        -             \\                            .                                        ^625                        \                                                      .           ^  ^626  _          ===7===== / *)627             ========= \ *)>>                                    ()628     -                  /            \\                          |629                      //               \\                   // ***\            \             ..630       \\           //                   \          =======// * *  \\======         `631         \\                   ===8===== /  \>     ///===\ //\\____//  ===\\\                    /632           \            -     ========= \  />    |||     \|         |/    \\\     '     "633=10====== / ()_                          /       |||      |  O---O  |      \\\___....634========= \ ()          \\             //        |||      |    -    |       \\\///oo///=-=-=-     .635           /              \\         //          X|X      |         |        XX|X===////''   o  `'636         //                 \                   ()||\     |  O---O  |           ^^^^     _____***637       //        =9======= / .)                 | /  \  //    /\    \\                  | o o o** .638                 ========= \ .)                          \\    \ \    \\     ____      .| o o o |'639                            /              o       ___    \\   \  \   ||    |o  o|  /|==| o o o |.640  .            -          //                 _____| O |    || ||   \  ||    |o  o| /=|  | o o o |641                        //                  |XXxO|  O |   /_____\  /_____\  |    |/  |  | o|| o |:642                       */643}644
645#define macro WAVE2() = takes (0) returns (0) {646    /** This is it pilot! We need to finish this angel off and take a second DNA sample.647
648     The Elohim angels are reportedly capable of some unbelievable feats when they are649     close to death. It's even rumored that they can alter their own DNA.650
651     Watch your power levels and don't let your guard down! Good luck! */652
653    ATTACK_WAVE2_FINISH_HIM() /** Wave 0x2 - Let's end this now pilot! Aerial attack formation!654
655
656    .                        .          \         \      ||657                                                         9|         |          /658                                    ^               \\   ||   //        o             *659                                                     \\  ||  //660              ^                         \       z      \ || /        ||   .            /661                                                        \/\/         10662       ^    ^                                           ^^^^    \\   ||   //663        ^   ^  ^                        \                00      \\  ||  //    ,664           ^ ^                                   |      \__/       \ || /665       ^                                                       .    \/\/666                                                ||                  (XXX)    "667                    .                           8|          |        \|/668                                           \\   ||   //669                                            \\  ||  //     ||     /       '670                                              \ || /       7|671                                               \/\/   \\   ||   //  .672                                               (**)    \\  ||  //673          ^                                      |       \ || /674                            .                             \/\/                  .675                                                          ()()676                                                           \|677     _______678       (x )==O679                                         \ | )_           ()               ___....680               ______                      \\\             |              \'\///oo///=-=-=-*>*>*>681             O==(x )                        \\        // *** \          ///XX|X===////''682                                    ,        \\======//  o o \\====== //683           _______                                =\ //\\__O_//  ===\\\        .684         O==(x )                                   \|         |/685                                               .    |  O---O  |  *  .686                            .         /             |    - XxX|         -            "687                                              **    | x       |  \'  * '688                   _________                  .  *  |  O---O  |689                  | o o o o |          ___^^^^_   //    /\    \\   * * * .690       ____       | o o o o |___      |  O  O  |   \\    \ \    \\691      |o  o|  /|==| o o o o | - |____ |  O  O  |    \\   \  \   ||  .   *   ,692      |o  o| /=|  | o o o o | - | == ||  O  O  |     || ||   \  ||693      |    |/  |  | o ||| o |   |  = ||  |^|^| |\   /_____\  /_____\ *  **  * * ** */694}695
696#define macro THE_FIFTH_IMPACT() = takes (1) returns (1) {697    /** Good fighting so far, pilot!  Congrats on taking out the scout Elohim.698        But now it's too late. An advance batallion of 100 Elohim has just landed!699        We don't have the genetic weapon ready yet so you'll have to engage these enemies,700        there is no other alternative.  Can you defeat all of these foes? */701
702                                                         //(f*zzz703                                                        //704                                                       //705                                 //*************************\\706                                 /**      \         /      **/707                                 /**     0           0     **/708    ATTACK_WAVE1() ATTACK_WAVE2()                           ATTACK_WAVE2() ATTACK_WAVE1()709    ATTACK_WAVE1() ATTACK_WAVE2()/** \\________________// */ ATTACK_WAVE2() ATTACK_WAVE1()710    ATTACK_WAVE2() ATTACK_WAVE1() ATTACK_WAVE1() ATTACK_WAVE2() ATTACK_WAVE1() ATTACK_WAVE1()711    ATTACK_WAVE2()                ATTACK_WAVE1() ATTACK_WAVE2()               ATTACK_WAVE2()712    ATTACK_WAVE1()                ATTACK_WAVE1() ATTACK_WAVE2()                  ATTACK_WAVE2()713    ATTACK_WAVE1()                ATTACK_WAVE2() ATTACK_WAVE1()                   ATTACK_WAVE1()714    ATTACK_WAVE2()                ATTACK_WAVE1() ATTACK_WAVE1()                   ATTACK_WAVE2()715    ATTACK_WAVE1()                ATTACK_WAVE2() ATTACK_WAVE2()                   ATTACK_WAVE1()716    ATTACK_WAVE1()                ATTACK_WAVE2() ATTACK_WAVE2()                    ATTACK_WAVE1()717    ATTACK_WAVE2()                ATTACK_WAVE1() ATTACK_WAVE1()                     ATTACK_WAVE2() ATTACK_WAVE1() ATTACK_WAVE1() ATTACK_WAVE2()718      ATTACK_WAVE1()              ATTACK_WAVE2()  ATTACK_WAVE2()                         ATTACK_WAVE1() ATTACK_WAVE1() ATTACK_WAVE2()719                                  ATTACK_WAVE2()  ATTACK_WAVE1()720                                  ATTACK_WAVE2()   ATTACK_WAVE1()721                                 ATTACK_WAVE1()     ATTACK_WAVE2()722                                ATTACK_WAVE1()       ATTACK_WAVE1()723                                ATTACK_WAVE2()        ATTACK_WAVE1()724                                ATTACK_WAVE2()         ATTACK_WAVE2()725                                ATTACK_WAVE1()       ATTACK_WAVE1()726                              ATTACK_WAVE2()          ATTACK_WAVE2()727                              ATTACK_WAVE1()           ATTACK_WAVE2()728                              ATTACK_WAVE1()            ATTACK_WAVE1()729                              ATTACK_WAVE2()            ATTACK_WAVE1()730                              ATTACK_WAVE1()             ATTACK_WAVE2()731                          ATTACK_WAVE1()                ATTACK_WAVE2()732                          ATTACK_WAVE2()                ATTACK_WAVE1()733                          ATTACK_WAVE1()                ATTACK_WAVE2()734            ATTACK_WAVE2() ATTACK_WAVE1()               ATTACK_WAVE2() ATTACK_WAVE1()735            ATTACK_WAVE1() ATTACK_WAVE2()               ATTACK_WAVE1() ATTACK_WAVE1()736            ATTACK_WAVE2() ATTACK_WAVE1()               ATTACK_WAVE2() ATTACK_WAVE2()737 /** ** * */ATTACK_WAVE1() ATTACK_WAVE1()               ATTACK_WAVE2() ATTACK_WAVE2() /** * * *    ***   * * **** ** ** *** *** * ** ** *** **  */738 /**  * * *** * * ** ** *** ***** * * *** ****** * * ** * * * ****** **** * * ** ** ******* ****    ** *** *** *** ** * * ** * ***** ** *** * * */739 /* * * * *** * * **** * * *** ****** * * ** * * * ****** **** * * ** ** ******* ****  **** ** * ** ** *** *** *** ** * * ** * * ** *** * * *** */740 /** **b*zzz ** * * *** * * * ** *** ***** * * ** ** *** *** *** ** * * ** * ************* * *** * ** ** * *****  ** *** * * ** ** ** ** *** *  */741}742
743
744
745// // ================================EVANGELION-ATTACK-UTILITIES=================+MAGI-03-ORIGINAL746
747#define fn ATTACK_WAVE1() = takes (1) returns (1) {748    0x07749        EVA_SEVEN()750            EVA_EIGHT()751        EVA_NINE()752            EVA_TEN()753    pop754}755
756#define macro EVA_SEVEN() = takes (2) returns (2) {757    __FUNC_SIG(eva_SEVEN) 0x00 mstore CONFIRM_EVA_CONTRACT()758}759
760#define macro EVA_EIGHT() = takes (2) returns (2) {761    __FUNC_SIG(eva_EIGHT) 0x00 mstore CONFIRM_EVA_CONTRACT()762}763
764#define macro EVA_NINE() = takes (2) returns (2) {765    __FUNC_SIG(eva_NINE) 0x00 mstore CONFIRM_EVA_CONTRACT()766}767
768#define macro EVA_TEN() = takes (2) returns (1) {769    __FUNC_SIG(eva_TEN) 0x00 mstore CONFIRM_EVA_CONTRACT()770}771
772#define macro ATTACK_WAVE2() = takes (1) returns (2) {773    __FUNC_SIG(eva_SEVEN) 0x00 mstore CALL_EVA_CONTRACT()774    __FUNC_SIG(eva_EIGHT) 0x00 mstore CALL_EVA_CONTRACT()775    __FUNC_SIG(eva_NINE)  0x00 mstore CALL_EVA_CONTRACT()776    __FUNC_SIG(eva_TEN)   0x00 mstore CALL_EVA_CONTRACT()777
778    // Angel neural resequencing779    add add add780    0x07 0x20 calldataload exp781    0x08 0x40 calldataload exp782    0x09 0x60 calldataload exp783    0x10 0x80 calldataload exp784    add add add785
786    dup1 swap2 eq ZERO_TIME_SOUL_SYNC(0x18)787    swap1 add788}789
790// Same as ATTACK_WAVE2 but this one includes a S2 Engine gas check791#define macro ATTACK_WAVE2_FINISH_HIM() = takes (1) returns (2) {792
793    gas794    __FUNC_SIG(eva_SEVEN) 0x00 mstore CALL_EVA_CONTRACT()795    __FUNC_SIG(eva_EIGHT) 0x00 mstore CALL_EVA_CONTRACT() add796    __FUNC_SIG(eva_NINE)  0x00 mstore CALL_EVA_CONTRACT() add797    __FUNC_SIG(eva_TEN)   0x00 mstore CALL_EVA_CONTRACT() add798    gas799
800    // Angel neural resequencing801    0x07 0x20 calldataload exp802    0x08 0x40 calldataload exp add803    0x09 0x60 calldataload exp add804    0x10 0x80 calldataload exp add805
806    dup1 swap3 eq ZERO_TIME_SOUL_SYNC(0x8)807
808    // Super Solenoid power level evaluation809    swap3 add swap2 swap1 sub swap1810}811
812#define macro CALL_EVA_CONTRACT() = takes (0) returns (1) {813    gas [MAX_GAS_FOR_EVA] lt814    ZERO_TIME_SOUL_SYNC(0x03)815
816    0x00 0x20 0x04 0x1c [CD_EVA_CONTROL_ADDRESS] calldataload [MAX_GAS_FOR_EVA] staticcall817    ANALYZE_EVA_RESPONSE()818    returndatasize 0x0 0x20 returndatacopy 0x20 mload819}820
821#define fn CONFIRM_EVA_CONTRACT() = takes (2) returns (2) {822    swap1823    CALL_EVA_CONTRACT()824
825    0x06 dup4 sub 0x20 mul calldataload dup4 swap1 exp dup2 eq826    ZERO_TIME_SOUL_SYNC(0x02)827    add swap1 0x01 add828}Time Left
Solve locally (WIP)
- Clone GitHub repo + install deps
git clone https://github.com/waterfall-mkt/curta-puzzles.git && cd curta-puzzles && forge install- Set RPC_URL_MAINNETin.env
.env
RPC_URL_MAINNET=""- Write solution + run script
forge script <PATH_TO_PUZZLE> -f mainnet -vvvThis is still WIP.