/** * Poseidon2-Mersenne31 (width 16) round constants. * * Mirror of [poseidon31_constants.rs](https://github.com/permissionless-technologies/universal-private-pool/blob/main/stwo-prover/src/poseidon31_constants.rs) * — these are the Plonky3 v0.5.2 `default_mersenne31_poseidon2_16()` * constants reduced into M31. The Rust file is the single source of truth; * this TS table was generated by running its * `print_canonical_constants` test (with `--nocapture`) and is verified * round-by-round against the canonical hash test vectors. * * Configuration (frozen 2026-04-30): * - WIDTH = 16 * - 4 initial full rounds + 14 partial rounds + 4 terminal full rounds * - S-box = x^5 * - Internal diagonal V_16 = [-2, 1, 2, 4, 8, 16, 32, 64, 128, 256, * 1024, 4096, 8192, 16384, 32768, 65536] * encoded as left-shifts [0,1,2,3,4,5,6,7,8,10,12,13,14,15,16] for * indices 1..16. */ /** Permutation width. */ export const WIDTH = 16 /** Sponge rate. */ export const RATE = 8 /** Sponge capacity. */ export const CAPACITY = WIDTH - RATE /** Digest size in M31 elements. */ export const DIGEST_SIZE = 4 /** Number of full rounds at the start. */ export const N_FULL_ROUNDS_INITIAL = 4 /** Number of full rounds at the end. */ export const N_FULL_ROUNDS_TERMINAL = 4 /** Number of partial (internal) rounds. */ export const N_PARTIAL_ROUNDS = 14 /** Owner secret limb count. Matches the Rust `SECRET_LIMBS = 8`. */ export const SECRET_LIMBS = 8 /** * Internal diffusion shifts. The diagonal of (1 + diag(V_16)) is given by * V[0] = -2, V[i] = 2^DIAG_SHIFTS[i-1] for i in 1..16. */ export const INTERNAL_DIAG_SHIFTS: readonly number[] = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 13, 14, 15, 16, ] /** Initial full-round constants — [round][state_index]. */ export const RC_EXTERNAL_INITIAL: readonly (readonly bigint[])[] = [ [ 0x768bab52n, 0x70e0ab7dn, 0x3d266c8an, 0x6da42045n, 0x600fef22n, 0x41dace6bn, 0x64f9bdd4n, 0x5d42d4fen, 0x76b1516dn, 0x6fc9a717n, 0x70ac4fb6n, 0x00194ef6n, 0x22b644e2n, 0x1f7916d5n, 0x47581be2n, 0x2710a123n, ], [ 0x6284e867n, 0x018d3afen, 0x5df99ef3n, 0x4c1e467bn, 0x566f6abcn, 0x2994e427n, 0x538a6d42n, 0x5d7bf2cfn, 0x7fda2dabn, 0x0fd854c4n, 0x46922fcan, 0x3d7763a1n, 0x19fd05can, 0x0a4bbb43n, 0x15075851n, 0x3d903d76n, ], [ 0x2d290ff7n, 0x40809fa0n, 0x59dac6ecn, 0x127927a2n, 0x6bbf0ea0n, 0x0294140fn, 0x24742976n, 0x6e84c081n, 0x22484f4an, 0x354cae59n, 0x0453ffe1n, 0x3f47a3ccn, 0x0088204en, 0x6066e109n, 0x3b7c4b80n, 0x6b55665dn, ], [ 0x3bc4b897n, 0x735bf378n, 0x508daf42n, 0x1884fc2bn, 0x7214f24cn, 0x7498be0an, 0x1a60e640n, 0x3303f928n, 0x29b46376n, 0x5c96bb68n, 0x65d097a5n, 0x1d358e9fn, 0x4a9a9017n, 0x4724cf76n, 0x347af70fn, 0x1e77e59an, ], ] as const /** Internal (partial) round constants — added to state[0] only. */ export const RC_INTERNAL: readonly bigint[] = [ 0x7f7ec4bfn, 0x0421926fn, 0x5198e669n, 0x34db3148n, 0x4368bafdn, 0x66685c7fn, 0x78d3249an, 0x60187881n, 0x76dad67an, 0x0690b437n, 0x1ea95311n, 0x40e5369an, 0x38f103fcn, 0x1d226a21n, ] as const /** Terminal full-round constants — [round][state_index]. */ export const RC_EXTERNAL_TERMINAL: readonly (readonly bigint[])[] = [ [ 0x57090613n, 0x1fa42108n, 0x17bbef50n, 0x1ff7e11cn, 0x047b24can, 0x4e140275n, 0x4fa086f5n, 0x079b309cn, 0x1159bd47n, 0x6d37e4e5n, 0x075d8dcen, 0x12121ca0n, 0x7f6a7c40n, 0x68e182ban, 0x5493201bn, 0x0444a80en, ], [ 0x0064f4c6n, 0x6467abe6n, 0x66975762n, 0x2af68f9bn, 0x345b33ben, 0x1b70d47fn, 0x053db717n, 0x381189cbn, 0x43b915f8n, 0x20df3694n, 0x0f459d26n, 0x77a0e97bn, 0x2f73e739n, 0x1876c2f9n, 0x65a0e29an, 0x4cabefben, ], [ 0x5abd1268n, 0x4d34a760n, 0x12771799n, 0x69a0c9acn, 0x39091e55n, 0x7f611cd0n, 0x3af055dan, 0x7ac0bbdfn, 0x6e0f3a24n, 0x41e3b6f7n, 0x49b3756dn, 0x568bc538n, 0x20c079d8n, 0x1701c72cn, 0x7670dc6cn, 0x5a439035n, ], [ 0x7c93e00en, 0x561fbb4dn, 0x1178907bn, 0x02737406n, 0x32fb24f1n, 0x6323b60an, 0x6ab12418n, 0x42c99cean, 0x155a0b97n, 0x53d1c6aan, 0x2bd20347n, 0x279b3d73n, 0x4f5f3c70n, 0x0245af6cn, 0x238359d3n, 0x49966a59n, ], ] as const