// ---
// tags: hemera, rust
// crystal-type: source
// crystal-domain: comp
// ---
//! Pre-computed Hemera round constants.
//!
//! 144 Goldilocks field elements self-bootstrapped from genesis seed
//! `[0x63, 0x79, 0x62, 0x65, 0x72]` ("cyber") via Hemeraβ‚€ (zero-constant
//! Poseidon2 sponge). See `bootstrap.rs` for the derivation algorithm.
//!
//! Layout: 128 external (8 full rounds Γ— 16 elements) followed by
//! 16 internal (partial round) constants.

use crate::field::Goldilocks;
use crate::params::{ROUNDS_F, ROUNDS_P, WIDTH};

/// Total number of round constants.
pub const NUM_CONSTANTS: usize = ROUNDS_F * WIDTH + ROUNDS_P; // 144

/// Round constants as raw u64 values (used by bootstrap verification and GPU).
pub const ROUND_CONSTANTS_U64: [u64; NUM_CONSTANTS] = [
    // ── External round 0 (16 elements) ────────────────────────────
    0x7E6EF67C13BC8100, 0x3A658EE0B11555F9, 0x42F4F5D6BE505B01, 0x8D6E969951FEA22C,
    0x533E1EED0F2B887C, 0x8236CF939B5E8007, 0xBA227D8421244C78, 0x9FC47472DAD402EF,
    0x5F7692B95C7F43E3, 0x3EC473E1CB681E91, 0x0AC11840549AF522, 0x668B69075828D9A5,
    0xB48F65809D7F3E78, 0xAA794A8BEE357E66, 0x4A4E37EB0C2AC779, 0x96FC3FB244AE1D65,
    // ── External round 1 ──────────────────────────────────────────
    0x84C368F3B5BF2820, 0x1EC6FB5FF3838032, 0xF8C1924D601A8277, 0xCA4A2E589AFA0C90,
    0xB058B152205F27F2, 0xC6FCB05FD64EBB21, 0xA91E996752BD83BD, 0x8EF890328274DFB1,
    0xB5572F24758746A9, 0xADAF7ED9A874EBC7, 0xA62D94B4525509F9, 0xD93E37690C33BF4A,
    0x0917331B64B3918E, 0x0BF16036DE74C275, 0xEAC11F9EBCE138F3, 0x926142BB5115A911,
    // ── External round 2 ──────────────────────────────────────────
    0x9EB1DDEEA0AFB953, 0xB564890EF6E7B4A7, 0x1106802D2381272E, 0x3AF6B13CDECFECC6,
    0x3BFB3BFF6399FE08, 0x0FBD22233C7FF193, 0x194A2C302A7F00F3, 0x7A8CD8FC20313B40,
    0x320DD200D8A2EAFC, 0x3C9A2A86D3D0A5C1, 0x268D9CD6B9560870, 0xD6B2C1F33C2CBB34,
    0x7DFBC7540CCBC91B, 0x4CAC7772D90C7EF2, 0xDB97D8D76267E95F, 0xF136CE6F5C9EB4F1,
    // ── External round 3 ──────────────────────────────────────────
    0x586939D9FF191630, 0xEC15D6F6F81DDBC7, 0xFB46C39A99996794, 0x1D1816FCA3FAB313,
    0xF2637820A088A973, 0x06A3BA683853A85D, 0xEC58257363D650C5, 0xB4A91673CEEA6086,
    0xC81AE7203FC95AE8, 0x1535032D312A687D, 0x3E2C5CFC841198A9, 0x178FB3CF99036931,
    0xA3E8DE69AC768DEC, 0x694A88260A6CC7E0, 0xC378535DC3854078, 0x4DC2B86D6692275A,
    // ── External round 4 ──────────────────────────────────────────
    0x96AD08CF20193273, 0x9DF124AF5A374198, 0x833149BFDFA8AE60, 0x31EFDA6CD1484543,
    0x43B2F0842FB3714B, 0xC6BB86AD84A77F5F, 0x8964541CF450E588, 0x0DA1B6F6D6F14A4F,
    0xE72862B68E18BC89, 0x10B07C9857F73F34, 0x371D3F76CC583943, 0x07E97CF84627649B,
    0xEEB50A7CE2DF1CC4, 0x108FDD4A57E033D6, 0x16F5C821A31E9966, 0xBB9B313537B0021C,
    // ── External round 5 ──────────────────────────────────────────
    0xBB81FFEEDF6F39F6, 0xE11DC86E2C3365C5, 0xF65FD37AD0655BC7, 0xC8ADC96DA4303235,
    0x1BB5027F5BFB68C7, 0xA3BCA3F991212021, 0x96D31C8A1D86B96C, 0x7C1F524227785407,
    0x2584A6A2B787F69D, 0x93BF086014C4C74D, 0x3E0309A55D227679, 0x1E1C4FD4CCFF2AC1,
    0xDBDC46C77E67CC00, 0x467E7D5C023307D8, 0x5BF3A4515EFF73EA, 0x8548D228DB4EC3E6,
    // ── External round 6 ──────────────────────────────────────────
    0xCDA9C4225DEEFD6D, 0x712F330A1D4FC861, 0x1FF0E8601F0CBE90, 0x0C9845FCF92311E5,
    0x96F85D86B463E860, 0x0CEAE6A1DEABF2EF, 0x2856B08B1F2C8E0A, 0x685950B529313C61,
    0x72A4683F75AA8802, 0xE57D4C658E303BFC, 0x179D9F1A754F3D65, 0xCFD34EBBFD42C1B0,
    0xFB6DE754BFD4C7A1, 0xDA881BF5001E67B8, 0xEAB494B9FDF4B534, 0xE87C44892F095416,
    // ── External round 7 ──────────────────────────────────────────
    0x1041D0742A1DCCD9, 0x24F2DF654BA37B8F, 0x04F709BF31859E5A, 0xED4B80ADB75C302F,
    0x243F18917DA5518D, 0xA4F930B5FF8903AB, 0x3C06F401A282C4BB, 0xB95CEC7BCB8856E5,
    0x84EDF516B7A2E9DC, 0xC03481FAE955433B, 0xF920E0DA5CE7A937, 0x7D644C20F1D4FE21,
    0x8976239ECFE2C7BB, 0xF2C131FFAABDFC57, 0x1B8FD118FFC54833, 0x29415A61860444AE,
    // ── Internal (partial) rounds 0–15 ────────────────────────────
    0x9FB420B604D1EF1A, 0xB2D5DD13C01373DD, 0xB2663B57811E63CB, 0xEC85A5ADA6BB2282,
    0x735D50E8146501CB, 0x76B2DE8FCD95D272, 0x41344AAEB2FBA5AA, 0xB8A921F2067FF00A,
    0x30A71752FC82B72C, 0x2A63762DA4F8C5C0, 0x7132145659E4F118, 0xD2A7AF982176FD4F,
    0x546B454C381AD7C9, 0x269F493C6D3A89F2, 0x99B0DB1D67FCCBB5, 0xD235ADB74B698D72,
];

/// Round constants as Goldilocks field elements (used by the permutation).
pub const ROUND_CONSTANTS: [Goldilocks; NUM_CONSTANTS] = {
    let mut out = [Goldilocks::ZERO; NUM_CONSTANTS];
    let mut i = 0;
    while i < NUM_CONSTANTS {
        out[i] = Goldilocks::new(ROUND_CONSTANTS_U64[i]);
        i += 1;
    }
    out
};

Local Graph