AAVEETHDynamicFeeVerifier6h

Description:

Smart contract deployed on Ethereum with Factory features.

Blockchain: Ethereum

Source Code: View Code On The Blockchain

Solidity Source Code:

{{
  "language": "Solidity",
  "sources": {
    "src/verifiers/AAVEETHDynamicFeeVerifier6h.sol": {
      "content": "// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import {IHalo2Verifier} from "../interface/IHalo2Verifier.sol";

/// @title AAVEETHDynamicFeeVerifier6h
/// @notice verifier contract for  AAVE-ETH dynamic fee proof over a 6-hour period.
contract AAVEETHDynamicFeeVerifier6h is IHalo2Verifier {
    uint256 internal constant DELTA = 4131629893567559867359510883348571134090853742863529169391034518566172092834;
    uint256 internal constant R = 21888242871839275222246405745257275088548364400416034343698204186575808495617;

    uint256 internal constant FIRST_QUOTIENT_X_CPTR = 0x09a4;
    uint256 internal constant LAST_QUOTIENT_X_CPTR = 0x0aa4;

    uint256 internal constant VK_MPTR = 0x0b60;
    uint256 internal constant VK_DIGEST_MPTR = 0x0b60;
    uint256 internal constant NUM_INSTANCES_MPTR = 0x0b80;
    uint256 internal constant K_MPTR = 0x0ba0;
    uint256 internal constant N_INV_MPTR = 0x0bc0;
    uint256 internal constant OMEGA_MPTR = 0x0be0;
    uint256 internal constant OMEGA_INV_MPTR = 0x0c00;
    uint256 internal constant OMEGA_INV_TO_L_MPTR = 0x0c20;
    uint256 internal constant HAS_ACCUMULATOR_MPTR = 0x0c40;
    uint256 internal constant ACC_OFFSET_MPTR = 0x0c60;
    uint256 internal constant NUM_ACC_LIMBS_MPTR = 0x0c80;
    uint256 internal constant NUM_ACC_LIMB_BITS_MPTR = 0x0ca0;
    uint256 internal constant G1_X_MPTR = 0x0cc0;
    uint256 internal constant G1_Y_MPTR = 0x0ce0;
    uint256 internal constant G2_X_1_MPTR = 0x0d00;
    uint256 internal constant G2_X_2_MPTR = 0x0d20;
    uint256 internal constant G2_Y_1_MPTR = 0x0d40;
    uint256 internal constant G2_Y_2_MPTR = 0x0d60;
    uint256 internal constant NEG_S_G2_X_1_MPTR = 0x0d80;
    uint256 internal constant NEG_S_G2_X_2_MPTR = 0x0da0;
    uint256 internal constant NEG_S_G2_Y_1_MPTR = 0x0dc0;
    uint256 internal constant NEG_S_G2_Y_2_MPTR = 0x0de0;

    uint256 internal constant CHALLENGE_MPTR = 0x16c0;

    uint256 internal constant THETA_MPTR = 0x16c0;
    uint256 internal constant BETA_MPTR = 0x16e0;
    uint256 internal constant GAMMA_MPTR = 0x1700;
    uint256 internal constant Y_MPTR = 0x1720;
    uint256 internal constant X_MPTR = 0x1740;
    uint256 internal constant ZETA_MPTR = 0x1760;
    uint256 internal constant NU_MPTR = 0x1780;
    uint256 internal constant MU_MPTR = 0x17a0;

    uint256 internal constant ACC_LHS_X_MPTR = 0x17c0;
    uint256 internal constant ACC_LHS_Y_MPTR = 0x17e0;
    uint256 internal constant ACC_RHS_X_MPTR = 0x1800;
    uint256 internal constant ACC_RHS_Y_MPTR = 0x1820;
    uint256 internal constant X_N_MPTR = 0x1840;
    uint256 internal constant X_N_MINUS_1_INV_MPTR = 0x1860;
    uint256 internal constant L_LAST_MPTR = 0x1880;
    uint256 internal constant L_BLIND_MPTR = 0x18a0;
    uint256 internal constant L_0_MPTR = 0x18c0;
    uint256 internal constant INSTANCE_EVAL_MPTR = 0x18e0;
    uint256 internal constant QUOTIENT_EVAL_MPTR = 0x1900;
    uint256 internal constant QUOTIENT_X_MPTR = 0x1920;
    uint256 internal constant QUOTIENT_Y_MPTR = 0x1940;
    uint256 internal constant R_EVAL_MPTR = 0x1960;
    uint256 internal constant PAIRING_LHS_X_MPTR = 0x1980;
    uint256 internal constant PAIRING_LHS_Y_MPTR = 0x19a0;
    uint256 internal constant PAIRING_RHS_X_MPTR = 0x19c0;
    uint256 internal constant PAIRING_RHS_Y_MPTR = 0x19e0;

    function verifyProof(bytes calldata proof, uint256[] calldata instances) public returns (bool) {
        assembly {
            // Read EC point (x, y) at (proof_cptr, proof_cptr + 0x20),
            // and check if the point is on affine plane,
            // and store them in (hash_mptr, hash_mptr + 0x20).
            // Return updated (success, proof_cptr, hash_mptr).
            function read_ec_point(success, proof_cptr, hash_mptr, q) -> ret0, ret1, ret2 {
                let x := calldataload(proof_cptr)
                let y := calldataload(add(proof_cptr, 0x20))
                ret0 := and(success, lt(x, q))
                ret0 := and(ret0, lt(y, q))
                ret0 := and(ret0, eq(mulmod(y, y, q), addmod(mulmod(x, mulmod(x, x, q), q), 3, q)))
                mstore(hash_mptr, x)
                mstore(add(hash_mptr, 0x20), y)
                ret1 := add(proof_cptr, 0x40)
                ret2 := add(hash_mptr, 0x40)
            }

            // Squeeze challenge by keccak256(memory[0..hash_mptr]),
            // and store hash mod r as challenge in challenge_mptr,
            // and push back hash in 0x00 as the first input for next squeeze.
            // Return updated (challenge_mptr, hash_mptr).
            function squeeze_challenge(challenge_mptr, hash_mptr, r) -> ret0, ret1 {
                let hash := keccak256(0x00, hash_mptr)
                mstore(challenge_mptr, mod(hash, r))
                mstore(0x00, hash)
                ret0 := add(challenge_mptr, 0x20)
                ret1 := 0x20
            }

            // Squeeze challenge without absorbing new input from calldata,
            // by putting an extra 0x01 in memory[0x20] and squeeze by keccak256(memory[0..21]),
            // and store hash mod r as challenge in challenge_mptr,
            // and push back hash in 0x00 as the first input for next squeeze.
            // Return updated (challenge_mptr).
            function squeeze_challenge_cont(challenge_mptr, r) -> ret {
                mstore8(0x20, 0x01)
                let hash := keccak256(0x00, 0x21)
                mstore(challenge_mptr, mod(hash, r))
                mstore(0x00, hash)
                ret := add(challenge_mptr, 0x20)
            }

            // Batch invert values in memory[mptr_start..mptr_end] in place.
            // Return updated (success).
            function batch_invert(success, mptr_start, mptr_end) -> ret {
                let gp_mptr := mptr_end
                let gp := mload(mptr_start)
                let mptr := add(mptr_start, 0x20)
                for {} lt(mptr, sub(mptr_end, 0x20)) {} {
                    gp := mulmod(gp, mload(mptr), R)
                    mstore(gp_mptr, gp)
                    mptr := add(mptr, 0x20)
                    gp_mptr := add(gp_mptr, 0x20)
                }
                gp := mulmod(gp, mload(mptr), R)

                mstore(gp_mptr, 0x20)
                mstore(add(gp_mptr, 0x20), 0x20)
                mstore(add(gp_mptr, 0x40), 0x20)
                mstore(add(gp_mptr, 0x60), gp)
                mstore(add(gp_mptr, 0x80), sub(R, 2))
                mstore(add(gp_mptr, 0xa0), R)
                ret := and(success, staticcall(gas(), 0x05, gp_mptr, 0xc0, gp_mptr, 0x20))
                let all_inv := mload(gp_mptr)

                let first_mptr := mptr_start
                let second_mptr := add(first_mptr, 0x20)
                gp_mptr := sub(gp_mptr, 0x20)
                for {} lt(second_mptr, mptr) {} {
                    let inv := mulmod(all_inv, mload(gp_mptr), R)
                    all_inv := mulmod(all_inv, mload(mptr), R)
                    mstore(mptr, inv)
                    mptr := sub(mptr, 0x20)
                    gp_mptr := sub(gp_mptr, 0x20)
                }
                let inv_first := mulmod(all_inv, mload(second_mptr), R)
                let inv_second := mulmod(all_inv, mload(first_mptr), R)
                mstore(first_mptr, inv_first)
                mstore(second_mptr, inv_second)
            }

            // Add (x, y) into point at (0x00, 0x20).
            // Return updated (success).
            function ec_add_acc(success, x, y) -> ret {
                mstore(0x40, x)
                mstore(0x60, y)
                ret := and(success, staticcall(gas(), 0x06, 0x00, 0x80, 0x00, 0x40))
            }

            // Scale point at (0x00, 0x20) by scalar.
            function ec_mul_acc(success, scalar) -> ret {
                mstore(0x40, scalar)
                ret := and(success, staticcall(gas(), 0x07, 0x00, 0x60, 0x00, 0x40))
            }

            // Add (x, y) into point at (0x80, 0xa0).
            // Return updated (success).
            function ec_add_tmp(success, x, y) -> ret {
                mstore(0xc0, x)
                mstore(0xe0, y)
                ret := and(success, staticcall(gas(), 0x06, 0x80, 0x80, 0x80, 0x40))
            }

            // Scale point at (0x80, 0xa0) by scalar.
            // Return updated (success).
            function ec_mul_tmp(success, scalar) -> ret {
                mstore(0xc0, scalar)
                ret := and(success, staticcall(gas(), 0x07, 0x80, 0x60, 0x80, 0x40))
            }

            // Perform pairing check.
            // Return updated (success).
            function ec_pairing(success, lhs_x, lhs_y, rhs_x, rhs_y) -> ret {
                mstore(0x00, lhs_x)
                mstore(0x20, lhs_y)
                mstore(0x40, mload(G2_X_1_MPTR))
                mstore(0x60, mload(G2_X_2_MPTR))
                mstore(0x80, mload(G2_Y_1_MPTR))
                mstore(0xa0, mload(G2_Y_2_MPTR))
                mstore(0xc0, rhs_x)
                mstore(0xe0, rhs_y)
                mstore(0x100, mload(NEG_S_G2_X_1_MPTR))
                mstore(0x120, mload(NEG_S_G2_X_2_MPTR))
                mstore(0x140, mload(NEG_S_G2_Y_1_MPTR))
                mstore(0x160, mload(NEG_S_G2_Y_2_MPTR))
                ret := and(success, staticcall(gas(), 0x08, 0x00, 0x180, 0x00, 0x20))
                ret := and(ret, mload(0x00))
            }

            // Modulus
            let q := 21888242871839275222246405745257275088696311157297823662689037894645226208583 // BN254 base field
            let r := 21888242871839275222246405745257275088548364400416034343698204186575808495617 // BN254 scalar field

            // Initialize success as true
            let success := true

            {
                // Load vk_digest and num_instances of vk into memory
                mstore(0x0b60, 0x1e8dcb18a9e75d35e355203a109522ff64257978cd9bcb2b14e65ff0c6eb892b) // vk_digest
                mstore(0x0b80, 0x00000000000000000000000000000000000000000000000000000000000002a3) // num_instances

                // Check valid length of proof
                success := and(success, eq(0x1640, proof.length))

                // Check valid length of instances
                let num_instances := mload(NUM_INSTANCES_MPTR)
                success := and(success, eq(num_instances, instances.length))

                // Absorb vk diegst
                mstore(0x00, mload(VK_DIGEST_MPTR))

                // Read instances and witness commitments and generate challenges
                let hash_mptr := 0x20
                let instance_cptr := instances.offset
                for { let instance_cptr_end := add(instance_cptr, mul(0x20, num_instances)) } lt(
                    instance_cptr, instance_cptr_end
                ) {} {
                    let instance := calldataload(instance_cptr)
                    success := and(success, lt(instance, r))
                    mstore(hash_mptr, instance)
                    instance_cptr := add(instance_cptr, 0x20)
                    hash_mptr := add(hash_mptr, 0x20)
                }

                let proof_cptr := proof.offset
                let challenge_mptr := CHALLENGE_MPTR

                // Phase 1
                for { let proof_cptr_end := add(proof_cptr, 0x0240) } lt(proof_cptr, proof_cptr_end) {} {
                    success, proof_cptr, hash_mptr := read_ec_point(success, proof_cptr, hash_mptr, q)
                }

                challenge_mptr, hash_mptr := squeeze_challenge(challenge_mptr, hash_mptr, r)

                // Phase 2
                for { let proof_cptr_end := add(proof_cptr, 0x0300) } lt(proof_cptr, proof_cptr_end) {} {
                    success, proof_cptr, hash_mptr := read_ec_point(success, proof_cptr, hash_mptr, q)
                }

                challenge_mptr, hash_mptr := squeeze_challenge(challenge_mptr, hash_mptr, r)
                challenge_mptr := squeeze_challenge_cont(challenge_mptr, r)

                // Phase 3
                for { let proof_cptr_end := add(proof_cptr, 0x0400) } lt(proof_cptr, proof_cptr_end) {} {
                    success, proof_cptr, hash_mptr := read_ec_point(success, proof_cptr, hash_mptr, q)
                }

                challenge_mptr, hash_mptr := squeeze_challenge(challenge_mptr, hash_mptr, r)

                // Phase 4
                for { let proof_cptr_end := add(proof_cptr, 0x0140) } lt(proof_cptr, proof_cptr_end) {} {
                    success, proof_cptr, hash_mptr := read_ec_point(success, proof_cptr, hash_mptr, q)
                }

                challenge_mptr, hash_mptr := squeeze_challenge(challenge_mptr, hash_mptr, r)

                // Read evaluations
                for { let proof_cptr_end := add(proof_cptr, 0x0b40) } lt(proof_cptr, proof_cptr_end) {} {
                    let eval := calldataload(proof_cptr)
                    success := and(success, lt(eval, r))
                    mstore(hash_mptr, eval)
                    proof_cptr := add(proof_cptr, 0x20)
                    hash_mptr := add(hash_mptr, 0x20)
                }

                // Read batch opening proof and generate challenges
                challenge_mptr, hash_mptr := squeeze_challenge(challenge_mptr, hash_mptr, r) // zeta
                challenge_mptr := squeeze_challenge_cont(challenge_mptr, r) // nu

                success, proof_cptr, hash_mptr := read_ec_point(success, proof_cptr, hash_mptr, q) // W

                challenge_mptr, hash_mptr := squeeze_challenge(challenge_mptr, hash_mptr, r) // mu

                success, proof_cptr, hash_mptr := read_ec_point(success, proof_cptr, hash_mptr, q) // W'

                // Load full vk into memory
                mstore(0x0b60, 0x1e8dcb18a9e75d35e355203a109522ff64257978cd9bcb2b14e65ff0c6eb892b) // vk_digest
                mstore(0x0b80, 0x00000000000000000000000000000000000000000000000000000000000002a3) // num_instances
                mstore(0x0ba0, 0x0000000000000000000000000000000000000000000000000000000000000018) // k
                mstore(0x0bc0, 0x30644e427ce32d4886b01bfe313ba1dba6db8b2045d128178a7164500e0a6c11) // n_inv
                mstore(0x0be0, 0x1951441010b2b95a6e47a6075066a50a036f5ba978c050f2821df86636c0facb) // omega
                mstore(0x0c00, 0x26501ebfe559ea5826f023d3e76e4b66f170cd940408eb5590a4075c80b498d6) // omega_inv
                mstore(0x0c20, 0x20669a4af88d28096b76c1e00c7eb94022b5eeb63400055aa63bd19ae7ede714) // omega_inv_to_l
                mstore(0x0c40, 0x0000000000000000000000000000000000000000000000000000000000000000) // has_accumulator
                mstore(0x0c60, 0x0000000000000000000000000000000000000000000000000000000000000000) // acc_offset
                mstore(0x0c80, 0x0000000000000000000000000000000000000000000000000000000000000000) // num_acc_limbs
                mstore(0x0ca0, 0x0000000000000000000000000000000000000000000000000000000000000000) // num_acc_limb_bits
                mstore(0x0cc0, 0x0000000000000000000000000000000000000000000000000000000000000001) // g1_x
                mstore(0x0ce0, 0x0000000000000000000000000000000000000000000000000000000000000002) // g1_y
                mstore(0x0d00, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) // g2_x_1
                mstore(0x0d20, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed) // g2_x_2
                mstore(0x0d40, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b) // g2_y_1
                mstore(0x0d60, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa) // g2_y_2
                mstore(0x0d80, 0x186282957db913abd99f91db59fe69922e95040603ef44c0bd7aa3adeef8f5ac) // neg_s_g2_x_1
                mstore(0x0da0, 0x17944351223333f260ddc3b4af45191b856689eda9eab5cbcddbbe570ce860d2) // neg_s_g2_x_2
                mstore(0x0dc0, 0x06d971ff4a7467c3ec596ed6efc674572e32fd6f52b721f97e35b0b3d3546753) // neg_s_g2_y_1
                mstore(0x0de0, 0x06ecdb9f9567f59ed2eee36e1e1d58797fd13cc97fafc2910f5e8a12f202fa9a) // neg_s_g2_y_2
                mstore(0x0e00, 0x29325edbdb4f9f0dc5cb8abf19cd136a266bb32799004425bb0cc4df90ee1388) // fixed_comms[0].x
                mstore(0x0e20, 0x1c6871eb57a58676553a75fbca23e2ce1dc9bbf6a5c2ed08edd03f38aa26be8d) // fixed_comms[0].y
                mstore(0x0e40, 0x2a2c60e18b4292763cb4a9daa85e2783932ef66fd8df08127cc31b841d5eecdb) // fixed_comms[1].x
                mstore(0x0e60, 0x2930d4dc3a836e0a80a68fad34aa319b1f04bdd9f915b0eeaebeebeaf797e1b5) // fixed_comms[1].y
                mstore(0x0e80, 0x2dbd1fdb22135a1f1629aa0e6a1af5e2d0369591f3cfd6ef8a3e260d011becd9) // fixed_comms[2].x
                mstore(0x0ea0, 0x1a3b48753e38aa806c66b93da7b6bc3b786a1a7c6332bf3703ae9719f0023388) // fixed_comms[2].y
                mstore(0x0ec0, 0x249efcdc4de7cc3f3b1a227833b3a6c2458881a7dd2a24564a254b3ca393be9c) // fixed_comms[3].x
                mstore(0x0ee0, 0x23618fc1e76426108716f3b195464860b3ebd9ed8cb9225f8608bcc776adbaa4) // fixed_comms[3].y
                mstore(0x0f00, 0x277dfc3832d2d3019005ddbae62528787838a52527a13ead2bdb00c04d1b5ba0) // fixed_comms[4].x
                mstore(0x0f20, 0x12ed06f5dd6a44205e0a812f7e96f7d5a31e71a5af9b2db4406271770ad0ba99) // fixed_comms[4].y
                mstore(0x0f40, 0x1f5886bc0558717e3351d15f2c1b30228f6c35f545b6b407abf090c018f4b9e1) // fixed_comms[5].x
                mstore(0x0f60, 0x2ff6a0891f8a0e34af354e0db56370db4ddba77b212520f4d7a0c0d77116f3f4) // fixed_comms[5].y
                mstore(0x0f80, 0x28902464eb062ae351d2875eb8862fbc829952468b80a7780c52789942244245) // fixed_comms[6].x
                mstore(0x0fa0, 0x13239edd8d5c375986a7419efaae989b65d2342f494f3449df95d7aa3e5c68a1) // fixed_comms[6].y
                mstore(0x0fc0, 0x2e76fcb66c734d6a7d84dd95519d64fe4aa743a22600d1a05b305d91e5947ee7) // fixed_comms[7].x
                mstore(0x0fe0, 0x1625341cf5a1a8a2afc25c9294be235af2348f7a8d35cc807995223cc6659676) // fixed_comms[7].y
                mstore(0x1000, 0x0000000000000000000000000000000000000000000000000000000000000000) // fixed_comms[8].x
                mstore(0x1020, 0x0000000000000000000000000000000000000000000000000000000000000000) // fixed_comms[8].y
                mstore(0x1040, 0x1a0ad537eef76d603a8d2ca3fa5efd48ca8fea20aa19c6ffea27edf4a2bf1c39) // fixed_comms[9].x
                mstore(0x1060, 0x19a6fe614bcf44be6110e5409c963d10fbe1bf45236aab52d63f57237e464093) // fixed_comms[9].y
                mstore(0x1080, 0x06d56c5bfdba4b78870ac5d324d846f2eb326c3be84eec2d8dd302af4d40de35) // fixed_comms[10].x
                mstore(0x10a0, 0x02d2f59d8f541ca544f4642809c8b274b20265b24075d8fe2565e1eb099cb116) // fixed_comms[10].y
                mstore(0x10c0, 0x0172f8f3eccc4c55713cb29324d971b04a12b208ae0e00d12e0447b62744d669) // fixed_comms[11].x
                mstore(0x10e0, 0x0fd16b236a1c406e03b446060c7adc853a450a39d528761d4b6b4bd3b907d800) // fixed_comms[11].y
                mstore(0x1100, 0x1d6332d7622a40b9df8b79416e69fb463ca3a784085bfe99f59252ebc9fa73df) // fixed_comms[12].x
                mstore(0x1120, 0x2f8c1fa22455ebd5eceffa819307ac906d123718bfe5188b572783dbcd44f6e8) // fixed_comms[12].y
                mstore(0x1140, 0x1d9960afb61d5929993545f2568468007842ecbccb58e6c61a6cab16b08bcade) // fixed_comms[13].x
                mstore(0x1160, 0x15b1a4ca8038a8ec297a2ede4e3ea270ca01d9551c176f6039b45067b39ca62f) // fixed_comms[13].y
                mstore(0x1180, 0x1277f1b46869f88b73626de2f41dbf59df88d8423daf3663a3d632d0f04b017f) // fixed_comms[14].x
                mstore(0x11a0, 0x0c09cafe3a1d45a612e1e2e608cda96429118bce3a2d4a095a90e6b1742dab08) // fixed_comms[14].y
                mstore(0x11c0, 0x1a804c21a8d22501716b5aecf9fc15b6ba61de4f6750583d47cab2eb62ede9cf) // fixed_comms[15].x
                mstore(0x11e0, 0x262a4ff61362796dcc8593332bbb60cfa7a86d20f012e0618525d278c2f55664) // fixed_comms[15].y
                mstore(0x1200, 0x050ac34466fbe3a5a5cfed22e2aeed00fe450def3bc37e34bb40c2c084cbe76f) // fixed_comms[16].x
                mstore(0x1220, 0x014240d7405c2f87262d2bd6fdf9bbd40eb5d08e48382fb594840e3428759021) // fixed_comms[16].y
                mstore(0x1240, 0x23b02911cde6a415fc1092256e97291c1284cdb72390ff0c5f831e7f9ae5909a) // fixed_comms[17].x
                mstore(0x1260, 0x2f519ff23d042ff387aea52ad141e80ae269cf0844655e147c4da91b7768f2d4) // fixed_comms[17].y
                mstore(0x1280, 0x2dda5a1d43813c50b5630d3b7a6fba4cf3f1b9195106476748863c626fde44bb) // fixed_comms[18].x
                mstore(0x12a0, 0x10c14c39b75ccc6a9562100fe77e8f4e9949bc52aac77c2db890d898aaeb2a31) // fixed_comms[18].y
                mstore(0x12c0, 0x2dda5a1d43813c50b5630d3b7a6fba4cf3f1b9195106476748863c626fde44bb) // fixed_comms[19].x
                mstore(0x12e0, 0x10c14c39b75ccc6a9562100fe77e8f4e9949bc52aac77c2db890d898aaeb2a31) // fixed_comms[19].y
                mstore(0x1300, 0x3004dd4047d931d09681f673aa9181be7215cb39d515b8386b1fc2773313553d) // fixed_comms[20].x
                mstore(0x1320, 0x2b319932cf06d1f45169fb9cfe7b13a15d917e67e98252ddec19c1ccea8ffcd2) // fixed_comms[20].y
                mstore(0x1340, 0x2f7b004f0570057f100343d9a17c19bc4ee25cf27612c456234eec7850f516d6) // fixed_comms[21].x
                mstore(0x1360, 0x0d51706acd70a8e75e7f38e0e4546b4e3b4c35db648ea31848ecef4d108bbcad) // fixed_comms[21].y
                mstore(0x1380, 0x22fc2c17a9912003578709ec3fe589029e2f8d936ae47365c479c40c96d59f5c) // fixed_comms[22].x
                mstore(0x13a0, 0x1fd1f9578b708106de12cc4f1d6188388b4f57ce99ec92a3d973b4792743042d) // fixed_comms[22].y
                mstore(0x13c0, 0x1bf74050e46cf9212af9f592b94bdd5ec233c05474d4d4e95bf8cbc07a24094f) // fixed_comms[23].x
                mstore(0x13e0, 0x13d89e8d94c7432de79e19383be743a819ac333efe5afbc84b295a3dcc5fb9bb) // fixed_comms[23].y
                mstore(0x1400, 0x16db493c78582dd490e917ef1645ad4bb25b0a16c7d73252fcb09fa9bbd8db46) // permutation_comms[0].x
                mstore(0x1420, 0x0e3d8ef2b405bff37c627aaebf0091349fb6ddd767dfcd0ab9227afa4596b37e) // permutation_comms[0].y
                mstore(0x1440, 0x1627018fc9527c08c77f8fc59e47dba128823e5eb36ceb09d8ce3a4c418a5be7) // permutation_comms[1].x
                mstore(0x1460, 0x0fa64b5f1a5f9f11375f47682184c5a3cc4b0507c2dc8e7c67972e9fa6f703f2) // permutation_comms[1].y
                mstore(0x1480, 0x0dfe8f6ee8fed329b8c7bba59c96fd9055e1cb43dae8c01d570db3f727c3ff3a) // permutation_comms[2].x
                mstore(0x14a0, 0x081dff3ec1af9172b601b6a55817c6d987d82861b7c3d0482c2bd4f6dbd161f6) // permutation_comms[2].y
                mstore(0x14c0, 0x213f0d4787f59eb5e477e7b3e34588e726bc934597a35bbc23683cad2da769b4) // permutation_comms[3].x
                mstore(0x14e0, 0x24f3c759e8dea1deb84ec3b76ba62b6f54bd8a3e7a88b509106c7ddfaae48873) // permutation_comms[3].y
                mstore(0x1500, 0x0c0db561cdb5f96dc4662e0e990e679ff486eb0119a040975ccd82037891a572) // permutation_comms[4].x
                mstore(0x1520, 0x2238fd4b1d8f2c545c3e77db8266a4617918c9f1ea8c92c538fa1cc86388ced7) // permutation_comms[4].y
                mstore(0x1540, 0x2e0e357431e180ffcb4e42cc63f1ade4753c03be0115407f2ebadab66f73395f) // permutation_comms[5].x
                mstore(0x1560, 0x10822b0ca2869b8eff5a33fc57b89226e0267ae803a5628d5da16b8f73dd051d) // permutation_comms[5].y
                mstore(0x1580, 0x0010620a5889690480de68c2739e4bb163ac24f823deaf555b008d5ccb289549) // permutation_comms[6].x
                mstore(0x15a0, 0x138528e3976a0e246dae4f153e81bdbdde56b72ad0f033c5833e511a4e099c78) // permutation_comms[6].y
                mstore(0x15c0, 0x060407416a4bc9c3ca2804032110ce5ad5b62aa4e83baed4c122390e1fbe5159) // permutation_comms[7].x
                mstore(0x15e0, 0x0399db9458928b134c91724c26259203451b43667e16f3f2c2e02a5e0ef0bf06) // permutation_comms[7].y
                mstore(0x1600, 0x01a7837e6470babb230978a3079af34e382588caaf1c0c791e81f37222798929) // permutation_comms[8].x
                mstore(0x1620, 0x155c9bea95acf37b018196229c82254163940010ab902b96a4dcde67c6a99a6f) // permutation_comms[8].y
                mstore(0x1640, 0x1d296075779e2ba9c155d39520c251e86b5d9d5d0f9dc615040624ba57247382) // permutation_comms[9].x
                mstore(0x1660, 0x0af24ab2f05d515fdd55c278ea308ac21a23ec7d670b85344d305c410ea80854) // permutation_comms[9].y
                mstore(0x1680, 0x08de7a1ec67000e216177ededba9cc3a666f74b9099e5567cce38239067b5fc6) // permutation_comms[10].x
                mstore(0x16a0, 0x13e1d20bfa0b238732be63d042b6b9b523c90262e0c6b5981d62e486edb52bba) // permutation_comms[10].y

                // Read accumulator from instances
                if mload(HAS_ACCUMULATOR_MPTR) {
                    let num_limbs := mload(NUM_ACC_LIMBS_MPTR)
                    let num_limb_bits := mload(NUM_ACC_LIMB_BITS_MPTR)

                    let cptr := add(instances.offset, mul(mload(ACC_OFFSET_MPTR), 0x20))
                    let lhs_y_off := mul(num_limbs, 0x20)
                    let rhs_x_off := mul(lhs_y_off, 2)
                    let rhs_y_off := mul(lhs_y_off, 3)
                    let lhs_x := calldataload(cptr)
                    let lhs_y := calldataload(add(cptr, lhs_y_off))
                    let rhs_x := calldataload(add(cptr, rhs_x_off))
                    let rhs_y := calldataload(add(cptr, rhs_y_off))
                    for {
                        let cptr_end := add(cptr, mul(0x20, num_limbs))
                        let shift := num_limb_bits
                    } lt(cptr, cptr_end) {} {
                        cptr := add(cptr, 0x20)
                        lhs_x := add(lhs_x, shl(shift, calldataload(cptr)))
                        lhs_y := add(lhs_y, shl(shift, calldataload(add(cptr, lhs_y_off))))
                        rhs_x := add(rhs_x, shl(shift, calldataload(add(cptr, rhs_x_off))))
                        rhs_y := add(rhs_y, shl(shift, calldataload(add(cptr, rhs_y_off))))
                        shift := add(shift, num_limb_bits)
                    }

                    success :=
                        and(success, eq(mulmod(lhs_y, lhs_y, q), addmod(mulmod(lhs_x, mulmod(lhs_x, lhs_x, q), q), 3, q)))
                    success :=
                        and(success, eq(mulmod(rhs_y, rhs_y, q), addmod(mulmod(rhs_x, mulmod(rhs_x, rhs_x, q), q), 3, q)))

                    mstore(ACC_LHS_X_MPTR, lhs_x)
                    mstore(ACC_LHS_Y_MPTR, lhs_y)
                    mstore(ACC_RHS_X_MPTR, rhs_x)
                    mstore(ACC_RHS_Y_MPTR, rhs_y)
                }

                pop(q)
            }

            // Revert earlier if anything from calldata is invalid
            if iszero(success) { revert(0, 0) }

            // Compute lagrange evaluations and instance evaluation
            {
                let k := mload(K_MPTR)
                let x := mload(X_MPTR)
                let x_n := x
                for { let idx := 0 } lt(idx, k) { idx := add(idx, 1) } { x_n := mulmod(x_n, x_n, r) }

                let omega := mload(OMEGA_MPTR)

                let mptr := X_N_MPTR
                let mptr_end := add(mptr, mul(0x20, add(mload(NUM_INSTANCES_MPTR), 6)))
                if iszero(mload(NUM_INSTANCES_MPTR)) { mptr_end := add(mptr_end, 0x20) }
                for { let pow_of_omega := mload(OMEGA_INV_TO_L_MPTR) } lt(mptr, mptr_end) { mptr := add(mptr, 0x20) } {
                    mstore(mptr, addmod(x, sub(r, pow_of_omega), r))
                    pow_of_omega := mulmod(pow_of_omega, omega, r)
                }
                let x_n_minus_1 := addmod(x_n, sub(r, 1), r)
                mstore(mptr_end, x_n_minus_1)
                success := batch_invert(success, X_N_MPTR, add(mptr_end, 0x20))

                mptr := X_N_MPTR
                let l_i_common := mulmod(x_n_minus_1, mload(N_INV_MPTR), r)
                for { let pow_of_omega := mload(OMEGA_INV_TO_L_MPTR) } lt(mptr, mptr_end) { mptr := add(mptr, 0x20) } {
                    mstore(mptr, mulmod(l_i_common, mulmod(mload(mptr), pow_of_omega, r), r))
                    pow_of_omega := mulmod(pow_of_omega, omega, r)
                }

                let l_blind := mload(add(X_N_MPTR, 0x20))
                let l_i_cptr := add(X_N_MPTR, 0x40)
                for { let l_i_cptr_end := add(X_N_MPTR, 0xc0) } lt(l_i_cptr, l_i_cptr_end) {
                    l_i_cptr := add(l_i_cptr, 0x20)
                } { l_blind := addmod(l_blind, mload(l_i_cptr), r) }

                let instance_eval := 0
                for {
                    let instance_cptr := instances.offset
                    let instance_cptr_end := add(instance_cptr, mul(0x20, mload(NUM_INSTANCES_MPTR)))
                } lt(instance_cptr, instance_cptr_end) {
                    instance_cptr := add(instance_cptr, 0x20)
                    l_i_cptr := add(l_i_cptr, 0x20)
                } { instance_eval := addmod(instance_eval, mulmod(mload(l_i_cptr), calldataload(instance_cptr), r), r) }

                let x_n_minus_1_inv := mload(mptr_end)
                let l_last := mload(X_N_MPTR)
                let l_0 := mload(add(X_N_MPTR, 0xc0))

                mstore(X_N_MPTR, x_n)
                mstore(X_N_MINUS_1_INV_MPTR, x_n_minus_1_inv)
                mstore(L_LAST_MPTR, l_last)
                mstore(L_BLIND_MPTR, l_blind)
                mstore(L_0_MPTR, l_0)
                mstore(INSTANCE_EVAL_MPTR, instance_eval)
            }

            // Compute quotient evavluation
            {
                let quotient_eval_numer
                let y := mload(Y_MPTR)
                {
                    let f_20 := calldataload(0x0ea4)
                    let var0 := 0x2
                    let var1 := sub(R, f_20)
                    let var2 := addmod(var0, var1, R)
                    let var3 := mulmod(f_20, var2, R)
                    let var4 := 0x3
                    let var5 := addmod(var4, var1, R)
                    let var6 := mulmod(var3, var5, R)
                    let var7 := 0x4
                    let var8 := addmod(var7, var1, R)
                    let var9 := mulmod(var6, var8, R)
                    let a_4 := calldataload(0x0b64)
                    let a_0 := calldataload(0x0ae4)
                    let a_2 := calldataload(0x0b24)
                    let var10 := addmod(a_0, a_2, R)
                    let var11 := sub(R, var10)
                    let var12 := addmod(a_4, var11, R)
                    let var13 := mulmod(var9, var12, R)
                    quotient_eval_numer := var13
                }
                {
                    let f_21 := calldataload(0x0ec4)
                    let var0 := 0x2
                    let var1 := sub(R, f_21)
                    let var2 := addmod(var0, var1, R)
                    let var3 := mulmod(f_21, var2, R)
                    let var4 := 0x3
                    let var5 := addmod(var4, var1, R)
                    let var6 := mulmod(var3, var5, R)
                    let var7 := 0x4
                    let var8 := addmod(var7, var1, R)
                    let var9 := mulmod(var6, var8, R)
                    let a_5 := calldataload(0x0b84)
                    let a_1 := calldataload(0x0b04)
                    let a_3 := calldataload(0x0b44)
                    let var10 := addmod(a_1, a_3, R)
                    let var11 := sub(R, var10)
                    let var12 := addmod(a_5, var11, R)
                    let var13 := mulmod(var9, var12, R)
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), var13, r)
                }
                {
                    let f_20 := calldataload(0x0ea4)
                    let var0 := 0x1
                    let var1 := sub(R, f_20)
                    let var2 := addmod(var0, var1, R)
                    let var3 := mulmod(f_20, var2, R)
                    let var4 := 0x2
                    let var5 := addmod(var4, var1, R)
                    let var6 := mulmod(var3, var5, R)
                    let var7 := 0x4
                    let var8 := addmod(var7, var1, R)
                    let var9 := mulmod(var6, var8, R)
                    let a_4 := calldataload(0x0b64)
                    let a_0 := calldataload(0x0ae4)
                    let a_2 := calldataload(0x0b24)
                    let var10 := mulmod(a_0, a_2, R)
                    let var11 := sub(R, var10)
                    let var12 := addmod(a_4, var11, R)
                    let var13 := mulmod(var9, var12, R)
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), var13, r)
                }
                {
                    let f_21 := calldataload(0x0ec4)
                    let var0 := 0x1
                    let var1 := sub(R, f_21)
                    let var2 := addmod(var0, var1, R)
                    let var3 := mulmod(f_21, var2, R)
                    let var4 := 0x2
                    let var5 := addmod(var4, var1, R)
                    let var6 := mulmod(var3, var5, R)
                    let var7 := 0x4
                    let var8 := addmod(var7, var1, R)
                    let var9 := mulmod(var6, var8, R)
                    let a_5 := calldataload(0x0b84)
                    let a_1 := calldataload(0x0b04)
                    let a_3 := calldataload(0x0b44)
                    let var10 := mulmod(a_1, a_3, R)
                    let var11 := sub(R, var10)
                    let var12 := addmod(a_5, var11, R)
                    let var13 := mulmod(var9, var12, R)
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), var13, r)
                }
                {
                    let f_20 := calldataload(0x0ea4)
                    let var0 := 0x1
                    let var1 := sub(R, f_20)
                    let var2 := addmod(var0, var1, R)
                    let var3 := mulmod(f_20, var2, R)
                    let var4 := 0x3
                    let var5 := addmod(var4, var1, R)
                    let var6 := mulmod(var3, var5, R)
                    let var7 := 0x4
                    let var8 := addmod(var7, var1, R)
                    let var9 := mulmod(var6, var8, R)
                    let a_4 := calldataload(0x0b64)
                    let a_0 := calldataload(0x0ae4)
                    let a_2 := calldataload(0x0b24)
                    let var10 := sub(R, a_2)
                    let var11 := addmod(a_0, var10, R)
                    let var12 := sub(R, var11)
                    let var13 := addmod(a_4, var12, R)
                    let var14 := mulmod(var9, var13, R)
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), var14, r)
                }
                {
                    let f_21 := calldataload(0x0ec4)
                    let var0 := 0x1
                    let var1 := sub(R, f_21)
                    let var2 := addmod(var0, var1, R)
                    let var3 := mulmod(f_21, var2, R)
                    let var4 := 0x3
                    let var5 := addmod(var4, var1, R)
                    let var6 := mulmod(var3, var5, R)
                    let var7 := 0x4
                    let var8 := addmod(var7, var1, R)
                    let var9 := mulmod(var6, var8, R)
                    let a_5 := calldataload(0x0b84)
                    let a_1 := calldataload(0x0b04)
                    let a_3 := calldataload(0x0b44)
                    let var10 := sub(R, a_3)
                    let var11 := addmod(a_1, var10, R)
                    let var12 := sub(R, var11)
                    let var13 := addmod(a_5, var12, R)
                    let var14 := mulmod(var9, var13, R)
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), var14, r)
                }
                {
                    let f_21 := calldataload(0x0ec4)
                    let var0 := 0x1
                    let var1 := sub(R, f_21)
                    let var2 := addmod(var0, var1, R)
                    let var3 := mulmod(f_21, var2, R)
                    let var4 := 0x2
                    let var5 := addmod(var4, var1, R)
                    let var6 := mulmod(var3, var5, R)
                    let var7 := 0x3
                    let var8 := addmod(var7, var1, R)
                    let var9 := mulmod(var6, var8, R)
                    let a_4 := calldataload(0x0b64)
                    let a_4_prev_1 := calldataload(0x0c04)
                    let var10 := 0x0
                    let a_0 := calldataload(0x0ae4)
                    let a_2 := calldataload(0x0b24)
                    let var11 := mulmod(a_0, a_2, R)
                    let var12 := addmod(var10, var11, R)
                    let a_1 := calldataload(0x0b04)
                    let a_3 := calldataload(0x0b44)
                    let var13 := mulmod(a_1, a_3, R)
                    let var14 := addmod(var12, var13, R)
                    let var15 := addmod(a_4_prev_1, var14, R)
                    let var16 := sub(R, var15)
                    let var17 := addmod(a_4, var16, R)
                    let var18 := mulmod(var9, var17, R)
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), var18, r)
                }
                {
                    let f_20 := calldataload(0x0ea4)
                    let var0 := 0x1
                    let var1 := sub(R, f_20)
                    let var2 := addmod(var0, var1, R)
                    let var3 := mulmod(f_20, var2, R)
                    let var4 := 0x2
                    let var5 := addmod(var4, var1, R)
                    let var6 := mulmod(var3, var5, R)
                    let var7 := 0x3
                    let var8 := addmod(var7, var1, R)
                    let var9 := mulmod(var6, var8, R)
                    let a_4 := calldataload(0x0b64)
                    let var10 := 0x0
                    let a_0 := calldataload(0x0ae4)
                    let a_2 := calldataload(0x0b24)
                    let var11 := mulmod(a_0, a_2, R)
                    let var12 := addmod(var10, var11, R)
                    let a_1 := calldataload(0x0b04)
                    let a_3 := calldataload(0x0b44)
                    let var13 := mulmod(a_1, a_3, R)
                    let var14 := addmod(var12, var13, R)
                    let var15 := sub(R, var14)
                    let var16 := addmod(a_4, var15, R)
                    let var17 := mulmod(var9, var16, R)
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), var17, r)
                }
                {
                    let f_22 := calldataload(0x0ee4)
                    let var0 := 0x1
                    let var1 := sub(R, f_22)
                    let var2 := addmod(var0, var1, R)
                    let var3 := mulmod(f_22, var2, R)
                    let var4 := 0x3
                    let var5 := addmod(var4, var1, R)
                    let var6 := mulmod(var3, var5, R)
                    let a_4 := calldataload(0x0b64)
                    let a_2 := calldataload(0x0b24)
                    let var7 := mulmod(var0, a_2, R)
                    let a_3 := calldataload(0x0b44)
                    let var8 := mulmod(var7, a_3, R)
                    let var9 := sub(R, var8)
                    let var10 := addmod(a_4, var9, R)
                    let var11 := mulmod(var6, var10, R)
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), var11, r)
                }
                {
                    let f_22 := calldataload(0x0ee4)
                    let var0 := 0x2
                    let var1 := sub(R, f_22)
                    let var2 := addmod(var0, var1, R)
                    let var3 := mulmod(f_22, var2, R)
                    let var4 := 0x3
                    let var5 := addmod(var4, var1, R)
                    let var6 := mulmod(var3, var5, R)
                    let a_4 := calldataload(0x0b64)
                    let a_4_prev_1 := calldataload(0x0c04)
                    let var7 := 0x1
                    let a_2 := calldataload(0x0b24)
                    let var8 := mulmod(var7, a_2, R)
                    let a_3 := calldataload(0x0b44)
                    let var9 := mulmod(var8, a_3, R)
                    let var10 := mulmod(a_4_prev_1, var9, R)
                    let var11 := sub(R, var10)
                    let var12 := addmod(a_4, var11, R)
                    let var13 := mulmod(var6, var12, R)
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), var13, r)
                }
                {
                    let f_23 := calldataload(0x0f04)
                    let a_4 := calldataload(0x0b64)
                    let var0 := 0x0
                    let a_2 := calldataload(0x0b24)
                    let var1 := addmod(var0, a_2, R)
                    let a_3 := calldataload(0x0b44)
                    let var2 := addmod(var1, a_3, R)
                    let var3 := sub(R, var2)
                    let var4 := addmod(a_4, var3, R)
                    let var5 := mulmod(f_23, var4, R)
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), var5, r)
                }
                {
                    let f_22 := calldataload(0x0ee4)
                    let var0 := 0x1
                    let var1 := sub(R, f_22)
                    let var2 := addmod(var0, var1, R)
                    let var3 := mulmod(f_22, var2, R)
                    let var4 := 0x2
                    let var5 := addmod(var4, var1, R)
                    let var6 := mulmod(var3, var5, R)
                    let a_4 := calldataload(0x0b64)
                    let a_4_prev_1 := calldataload(0x0c04)
                    let var7 := 0x0
                    let a_2 := calldataload(0x0b24)
                    let var8 := addmod(var7, a_2, R)
                    let a_3 := calldataload(0x0b44)
                    let var9 := addmod(var8, a_3, R)
                    let var10 := addmod(a_4_prev_1, var9, R)
                    let var11 := sub(R, var10)
                    let var12 := addmod(a_4, var11, R)
                    let var13 := mulmod(var6, var12, R)
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), var13, r)
                }
                {
                    let f_7 := calldataload(0x0d04)
                    let var0 := 0x0
                    let var1 := mulmod(f_7, var0, R)
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), var1, r)
                }
                {
                    let f_8 := calldataload(0x0d24)
                    let var0 := 0x0
                    let var1 := mulmod(f_8, var0, R)
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), var1, r)
                }
                {
                    let f_9 := calldataload(0x0d44)
                    let var0 := 0x0
                    let var1 := mulmod(f_9, var0, R)
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), var1, r)
                }
                {
                    let f_10 := calldataload(0x0d64)
                    let var0 := 0x0
                    let var1 := mulmod(f_10, var0, R)
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), var1, r)
                }
                {
                    let f_11 := calldataload(0x0d84)
                    let var0 := 0x0
                    let var1 := mulmod(f_11, var0, R)
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), var1, r)
                }
                {
                    let f_12 := calldataload(0x0da4)
                    let var0 := 0x0
                    let var1 := mulmod(f_12, var0, R)
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), var1, r)
                }
                {
                    let f_13 := calldataload(0x0dc4)
                    let var0 := 0x0
                    let var1 := mulmod(f_13, var0, R)
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), var1, r)
                }
                {
                    let f_14 := calldataload(0x0de4)
                    let var0 := 0x0
                    let var1 := mulmod(f_14, var0, R)
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), var1, r)
                }
                {
                    let f_15 := calldataload(0x0e04)
                    let var0 := 0x0
                    let var1 := mulmod(f_15, var0, R)
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), var1, r)
                }
                {
                    let f_16 := calldataload(0x0e24)
                    let var0 := 0x0
                    let var1 := mulmod(f_16, var0, R)
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), var1, r)
                }
                {
                    let l_0 := mload(L_0_MPTR)
                    let eval := addmod(l_0, sub(R, mulmod(l_0, calldataload(0x10a4), R)), R)
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r)
                }
                {
                    let perm_z_last := calldataload(0x1164)
                    let eval :=
                        mulmod(mload(L_LAST_MPTR), addmod(mulmod(perm_z_last, perm_z_last, R), sub(R, perm_z_last), R), R)
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r)
                }
                {
                    let eval :=
                        mulmod(mload(L_0_MPTR), addmod(calldataload(0x1104), sub(R, calldataload(0x10e4)), R), R)
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r)
                }
                {
                    let eval :=
                        mulmod(mload(L_0_MPTR), addmod(calldataload(0x1164), sub(R, calldataload(0x1144)), R), R)
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r)
                }
                {
                    let gamma := mload(GAMMA_MPTR)
                    let beta := mload(BETA_MPTR)
                    let lhs := calldataload(0x10c4)
                    let rhs := calldataload(0x10a4)
                    lhs :=
                        mulmod(
                            lhs, addmod(addmod(calldataload(0x0ae4), mulmod(beta, calldataload(0x0f44), R), R), gamma, R), R
                        )
                    lhs :=
                        mulmod(
                            lhs, addmod(addmod(calldataload(0x0b04), mulmod(beta, calldataload(0x0f64), R), R), gamma, R), R
                        )
                    lhs :=
                        mulmod(
                            lhs, addmod(addmod(calldataload(0x0b24), mulmod(beta, calldataload(0x0f84), R), R), gamma, R), R
                        )
                    lhs :=
                        mulmod(
                            lhs, addmod(addmod(calldataload(0x0b44), mulmod(beta, calldataload(0x0fa4), R), R), gamma, R), R
                        )
                    mstore(0x00, mulmod(beta, mload(X_MPTR), R))
                    rhs := mulmod(rhs, addmod(addmod(calldataload(0x0ae4), mload(0x00), R), gamma, R), R)
                    mstore(0x00, mulmod(mload(0x00), DELTA, R))
                    rhs := mulmod(rhs, addmod(addmod(calldataload(0x0b04), mload(0x00), R), gamma, R), R)
                    mstore(0x00, mulmod(mload(0x00), DELTA, R))
                    rhs := mulmod(rhs, addmod(addmod(calldataload(0x0b24), mload(0x00), R), gamma, R), R)
                    mstore(0x00, mulmod(mload(0x00), DELTA, R))
                    rhs := mulmod(rhs, addmod(addmod(calldataload(0x0b44), mload(0x00), R), gamma, R), R)
                    mstore(0x00, mulmod(mload(0x00), DELTA, R))
                    let left_sub_right := addmod(lhs, sub(R, rhs), R)
                    let eval :=
                        addmod(
                            left_sub_right,
                            sub(R, mulmod(left_sub_right, addmod(mload(L_LAST_MPTR), mload(L_BLIND_MPTR), R), R)),
                            R
                        )
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r)
                }
                {
                    let gamma := mload(GAMMA_MPTR)
                    let beta := mload(BETA_MPTR)
                    let lhs := calldataload(0x1124)
                    let rhs := calldataload(0x1104)
                    lhs :=
                        mulmod(
                            lhs, addmod(addmod(calldataload(0x0b64), mulmod(beta, calldataload(0x0fc4), R), R), gamma, R), R
                        )
                    lhs :=
                        mulmod(
                            lhs, addmod(addmod(calldataload(0x0b84), mulmod(beta, calldataload(0x0fe4), R), R), gamma, R), R
                        )
                    lhs :=
                        mulmod(
                            lhs, addmod(addmod(calldataload(0x0ba4), mulmod(beta, calldataload(0x1004), R), R), gamma, R), R
                        )
                    lhs :=
                        mulmod(
                            lhs, addmod(addmod(calldataload(0x0bc4), mulmod(beta, calldataload(0x1024), R), R), gamma, R), R
                        )
                    rhs := mulmod(rhs, addmod(addmod(calldataload(0x0b64), mload(0x00), R), gamma, R), R)
                    mstore(0x00, mulmod(mload(0x00), DELTA, R))
                    rhs := mulmod(rhs, addmod(addmod(calldataload(0x0b84), mload(0x00), R), gamma, R), R)
                    mstore(0x00, mulmod(mload(0x00), DELTA, R))
                    rhs := mulmod(rhs, addmod(addmod(calldataload(0x0ba4), mload(0x00), R), gamma, R), R)
                    mstore(0x00, mulmod(mload(0x00), DELTA, R))
                    rhs := mulmod(rhs, addmod(addmod(calldataload(0x0bc4), mload(0x00), R), gamma, R), R)
                    mstore(0x00, mulmod(mload(0x00), DELTA, R))
                    let left_sub_right := addmod(lhs, sub(R, rhs), R)
                    let eval :=
                        addmod(
                            left_sub_right,
                            sub(R, mulmod(left_sub_right, addmod(mload(L_LAST_MPTR), mload(L_BLIND_MPTR), R), R)),
                            R
                        )
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r)
                }
                {
                    let gamma := mload(GAMMA_MPTR)
                    let beta := mload(BETA_MPTR)
                    let lhs := calldataload(0x1184)
                    let rhs := calldataload(0x1164)
                    lhs :=
                        mulmod(
                            lhs, addmod(addmod(calldataload(0x0be4), mulmod(beta, calldataload(0x1044), R), R), gamma, R), R
                        )
                    lhs :=
                        mulmod(
                            lhs, addmod(addmod(calldataload(0x0c24), mulmod(beta, calldataload(0x1064), R), R), gamma, R), R
                        )
                    lhs :=
                        mulmod(
                            lhs,
                            addmod(addmod(mload(INSTANCE_EVAL_MPTR), mulmod(beta, calldataload(0x1084), R), R), gamma, R),
                            R
                        )
                    rhs := mulmod(rhs, addmod(addmod(calldataload(0x0be4), mload(0x00), R), gamma, R), R)
                    mstore(0x00, mulmod(mload(0x00), DELTA, R))
                    rhs := mulmod(rhs, addmod(addmod(calldataload(0x0c24), mload(0x00), R), gamma, R), R)
                    mstore(0x00, mulmod(mload(0x00), DELTA, R))
                    rhs := mulmod(rhs, addmod(addmod(mload(INSTANCE_EVAL_MPTR), mload(0x00), R), gamma, R), R)
                    let left_sub_right := addmod(lhs, sub(R, rhs), R)
                    let eval :=
                        addmod(
                            left_sub_right,
                            sub(R, mulmod(left_sub_right, addmod(mload(L_LAST_MPTR), mload(L_BLIND_MPTR), R), R)),
                            R
                        )
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r)
                }
                {
                    let l_0 := mload(L_0_MPTR)
                    let eval := mulmod(l_0, calldataload(0x11a4), R)
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r)
                }
                {
                    let l_last := mload(L_LAST_MPTR)
                    let eval := mulmod(l_last, calldataload(0x11a4), R)
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r)
                }
                {
                    let theta := mload(THETA_MPTR)
                    let beta := mload(BETA_MPTR)
                    let table
                    {
                        let var0 := 0x1
                        let f_17 := calldataload(0x0e44)
                        let var1 := mulmod(var0, f_17, R)
                        let a_6 := calldataload(0x0ba4)
                        let var2 := mulmod(a_6, f_17, R)
                        let a_7 := calldataload(0x0bc4)
                        let var3 := mulmod(a_7, f_17, R)
                        let a_8 := calldataload(0x0be4)
                        let var4 := mulmod(a_8, f_17, R)
                        table := var1
                        table := addmod(mulmod(table, theta, R), var2, R)
                        table := addmod(mulmod(table, theta, R), var3, R)
                        table := addmod(mulmod(table, theta, R), var4, R)
                        table := addmod(table, beta, R)
                    }
                    let input_0
                    {
                        let var0 := 0x1
                        let f_18 := calldataload(0x0e64)
                        let var1 := mulmod(var0, f_18, R)
                        let a_0 := calldataload(0x0ae4)
                        let var2 := mulmod(a_0, f_18, R)
                        let a_2 := calldataload(0x0b24)
                        let var3 := mulmod(a_2, f_18, R)
                        let a_4 := calldataload(0x0b64)
                        let var4 := mulmod(a_4, f_18, R)
                        input_0 := var1
                        input_0 := addmod(mulmod(input_0, theta, R), var2, R)
                        input_0 := addmod(mulmod(input_0, theta, R), var3, R)
                        input_0 := addmod(mulmod(input_0, theta, R), var4, R)
                        input_0 := addmod(input_0, beta, R)
                    }
                    let lhs
                    let rhs
                    rhs := table
                    {
                        let tmp := input_0
                        rhs := addmod(rhs, sub(R, mulmod(calldataload(0x11e4), tmp, R)), R)
                        lhs :=
                            mulmod(mulmod(table, tmp, R), addmod(calldataload(0x11c4), sub(R, calldataload(0x11a4)), R), R)
                    }
                    let eval :=
                        mulmod(
                            addmod(1, sub(R, addmod(mload(L_BLIND_MPTR), mload(L_LAST_MPTR), R)), R),
                            addmod(lhs, sub(R, rhs), R),
                            R
                        )
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r)
                }
                {
                    let l_0 := mload(L_0_MPTR)
                    let eval := mulmod(l_0, calldataload(0x1204), R)
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r)
                }
                {
                    let l_last := mload(L_LAST_MPTR)
                    let eval := mulmod(l_last, calldataload(0x1204), R)
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r)
                }
                {
                    let theta := mload(THETA_MPTR)
                    let beta := mload(BETA_MPTR)
                    let table
                    {
                        let var0 := 0x1
                        let f_17 := calldataload(0x0e44)
                        let var1 := mulmod(var0, f_17, R)
                        let a_6 := calldataload(0x0ba4)
                        let var2 := mulmod(a_6, f_17, R)
                        let a_7 := calldataload(0x0bc4)
                        let var3 := mulmod(a_7, f_17, R)
                        let a_8 := calldataload(0x0be4)
                        let var4 := mulmod(a_8, f_17, R)
                        table := var1
                        table := addmod(mulmod(table, theta, R), var2, R)
                        table := addmod(mulmod(table, theta, R), var3, R)
                        table := addmod(mulmod(table, theta, R), var4, R)
                        table := addmod(table, beta, R)
                    }
                    let input_0
                    {
                        let var0 := 0x1
                        let f_19 := calldataload(0x0e84)
                        let var1 := mulmod(var0, f_19, R)
                        let a_1 := calldataload(0x0b04)
                        let var2 := mulmod(a_1, f_19, R)
                        let a_3 := calldataload(0x0b44)
                        let var3 := mulmod(a_3, f_19, R)
                        let a_5 := calldataload(0x0b84)
                        let var4 := mulmod(a_5, f_19, R)
                        input_0 := var1
                        input_0 := addmod(mulmod(input_0, theta, R), var2, R)
                        input_0 := addmod(mulmod(input_0, theta, R), var3, R)
                        input_0 := addmod(mulmod(input_0, theta, R), var4, R)
                        input_0 := addmod(input_0, beta, R)
                    }
                    let lhs
                    let rhs
                    rhs := table
                    {
                        let tmp := input_0
                        rhs := addmod(rhs, sub(R, mulmod(calldataload(0x1244), tmp, R)), R)
                        lhs :=
                            mulmod(mulmod(table, tmp, R), addmod(calldataload(0x1224), sub(R, calldataload(0x1204)), R), R)
                    }
                    let eval :=
                        mulmod(
                            addmod(1, sub(R, addmod(mload(L_BLIND_MPTR), mload(L_LAST_MPTR), R)), R),
                            addmod(lhs, sub(R, rhs), R),
                            R
                        )
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r)
                }
                {
                    let l_0 := mload(L_0_MPTR)
                    let eval := mulmod(l_0, calldataload(0x1264), R)
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r)
                }
                {
                    let l_last := mload(L_LAST_MPTR)
                    let eval := mulmod(l_last, calldataload(0x1264), R)
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r)
                }
                {
                    let theta := mload(THETA_MPTR)
                    let beta := mload(BETA_MPTR)
                    let table
                    {
                        let f_1 := calldataload(0x0c44)
                        let f_2 := calldataload(0x0c64)
                        table := f_1
                        table := addmod(mulmod(table, theta, R), f_2, R)
                        table := addmod(table, beta, R)
                    }
                    let input_0
                    {
                        let f_7 := calldataload(0x0d04)
                        let var0 := 0x1
                        let var1 := mulmod(f_7, var0, R)
                        let a_0 := calldataload(0x0ae4)
                        let var2 := mulmod(var1, a_0, R)
                        let var3 := sub(R, var1)
                        let var4 := addmod(var0, var3, R)
                        let var5 := 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593ef4333c9
                        let var6 := mulmod(var4, var5, R)
                        let var7 := addmod(var2, var6, R)
                        let a_4 := calldataload(0x0b64)
                        let var8 := mulmod(var1, a_4, R)
                        let var9 := 0x8
                        let var10 := mulmod(var4, var9, R)
                        let var11 := addmod(var8, var10, R)
                        input_0 := var7
                        input_0 := addmod(mulmod(input_0, theta, R), var11, R)
                        input_0 := addmod(input_0, beta, R)
                    }
                    let lhs
                    let rhs
                    rhs := table
                    {
                        let tmp := input_0
                        rhs := addmod(rhs, sub(R, mulmod(calldataload(0x12a4), tmp, R)), R)
                        lhs :=
                            mulmod(mulmod(table, tmp, R), addmod(calldataload(0x1284), sub(R, calldataload(0x1264)), R), R)
                    }
                    let eval :=
                        mulmod(
                            addmod(1, sub(R, addmod(mload(L_BLIND_MPTR), mload(L_LAST_MPTR), R)), R),
                            addmod(lhs, sub(R, rhs), R),
                            R
                        )
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r)
                }
                {
                    let l_0 := mload(L_0_MPTR)
                    let eval := mulmod(l_0, calldataload(0x12c4), R)
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r)
                }
                {
                    let l_last := mload(L_LAST_MPTR)
                    let eval := mulmod(l_last, calldataload(0x12c4), R)
                    quotient_eval_numer := addmod(mulmod(quotient_eval_numer, y, r), eval, r)
                }
                {
                    let theta := mload(THETA_MPTR)
                    let beta := mload(BETA_MPTR)
                    let table
                    {
                        let f_1 := calldataload(0x0c44)
                        let f_2 := calldataload(0x0c64)
                        table := f_1
                        table := addmod(mulmod(table, theta, R), f_2, R)
                        table := addmod(table, beta, R)
                    }
                    let input_0
                    {
                        let f_8 := calldataload(0x0d24)
                        let var0 := 0x1
                        let var1 := mulmod(f_8, var0, R)
                        let a_1 := calldataload(0x0b04)
                        let var2 := mulmod(var1, a_1, R)
                        let var3 := sub(R, var1)
                        let var4 := addmod(var0, var3, R)
                        let var5 := 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593ef4333c9
                        let var6 := mulmod(var4, var5, R)
                        let var7 := addmod(var2, var6, R)
                        let a_5 := calldataload(0x0b84)
                        let var8 := mulmod(var1, a_5, R)
                        let var9 := 0x8
                        let var10 := mulmod(var4, var9, R)
                        let var11 := addmod(var8, var10, R)
                        input_0 := var7
                        input_0 := addmod(mulmod(input_0, theta, R), var11, R)
                        input_0 := addmod(input_0, beta, R)
                    }
                    let lhs
                    let rhs
                    rhs := table
                    {
                        let tmp := input_0
                        rhs := addmod(rhs, sub(R, mulmod(calldataload(0x1304), tmp, R)), R)
                        lhs :=
                            mulmod(mulmod(table, tmp, R), addmod(calldataload(0x12e

Tags:
Factory|addr:0xe47f07cc96b269c68e4a2a5b9b3bd0e02c6ae698|verified:true|block:23527110|tx:0xb8115d9e9e9bc812142ec6f8877f1205a32e43712af3dc1b0d40e62317d20b1b|first_check:1759854984

Submitted on: 2025-10-07 18:36:24

Comments

Log in to comment.

No comments yet.