1use crate::poseidon_8_56_5_3_2::columns::PoseidonColumn;
5use ark_bn254::Fr;
6use kimchi_msm::columns::ColumnIndexer;
7use mina_poseidon::{constants::SpongeConstants, poseidon::ArithmeticSpongeParams};
8use once_cell::sync::Lazy;
9
10pub const STATE_SIZE: usize = 3;
12
13pub const NB_FULL_ROUND: usize = 8;
15
16pub const NB_PARTIAL_ROUND: usize = 56;
18
19pub const NB_TOTAL_ROUND: usize = NB_FULL_ROUND + NB_PARTIAL_ROUND;
21
22pub const NB_ROUND_CONSTANTS: usize = NB_TOTAL_ROUND * STATE_SIZE;
24
25pub const NB_CONSTRAINTS: usize = 432;
27
28pub const MAX_DEGREE: u64 = 2;
30
31pub type Column = PoseidonColumn<STATE_SIZE, NB_FULL_ROUND, NB_PARTIAL_ROUND>;
32
33pub const NB_COLUMNS: usize = Column::N_COL;
36
37use core::str::FromStr;
47
48use super::interpreter::PoseidonParams;
49
50fn params() -> ArithmeticSpongeParams<Fr> {
51 ArithmeticSpongeParams {
52 mds: vec![
53 vec![
54 Fr::from_str(
55 "1891083243990574305685895570197511851713934835398236923905694056149924753068",
56 )
57 .unwrap(),
58 Fr::from_str(
59 "12425575093536208349525223497695086347893624421418924655002789600937388509542",
60 )
61 .unwrap(),
62 Fr::from_str(
63 "21738922686690608832323816580123167366266110538717945605098093992702895344376",
64 )
65 .unwrap(),
66 ],
67 vec![
68 Fr::from_str(
69 "27684418222856506172738658695423428482598065952308803192811766786876275297242",
70 )
71 .unwrap(),
72 Fr::from_str(
73 "15829269591837939027267285551701704696044414402373072091502623580282737399890",
74 )
75 .unwrap(),
76 Fr::from_str(
77 "19252639924245456560245438416349235444106039029142654756933998759642658686319",
78 )
79 .unwrap(),
80 ],
81 vec![
82 Fr::from_str(
83 "13569069999110563102763825881967666333546046803842950209911791358856018301650",
84 )
85 .unwrap(),
86 Fr::from_str(
87 "27981915092643975197764375502939826253878858038100319462170032597200154977862",
88 )
89 .unwrap(),
90 Fr::from_str(
91 "8885190793627186923687683451640133227063861709370969757580340555722307526098",
92 )
93 .unwrap(),
94 ],
95 ],
96 round_constants: vec![
97 vec![
98 Fr::from_str(
99 "22979498492811028599388207262497610781398114192113450876459774028198681978580",
100 )
101 .unwrap(),
102 Fr::from_str(
103 "3462163333362550903390325785926437039762839525013511939547720766741499409856",
104 )
105 .unwrap(),
106 Fr::from_str(
107 "12308193519164615772431903590941145851045953550307364845912877146027882177970",
108 )
109 .unwrap(),
110 ],
111 vec![
112 Fr::from_str(
113 "26635724949260230089658132165964484272715279452239432758187323659534196378572",
114 )
115 .unwrap(),
116 Fr::from_str(
117 "16384206429233192859678459425673999470857159372638200975562270773516251379588",
118 )
119 .unwrap(),
120 Fr::from_str(
121 "19416611223573031732302519381697999456593181436167069017836818060955725864200",
122 )
123 .unwrap(),
124 ],
125 vec![
126 Fr::from_str(
127 "27016929334480358351753199307567711107921448016886807295662950322547508172113",
128 )
129 .unwrap(),
130 Fr::from_str(
131 "11238098416885388471337306072943475212729724613485264776842071924751017567771",
132 )
133 .unwrap(),
134 Fr::from_str(
135 "26357617544526716389824924588303395055989615117170456588197310726656210667591",
136 )
137 .unwrap(),
138 ],
139 vec![
140 Fr::from_str(
141 "13522402812268713007260660858020591835416325370361256561462576999381232564525",
142 )
143 .unwrap(),
144 Fr::from_str(
145 "17993297334719348473740719243191272244929728431491444848946396448123051191677",
146 )
147 .unwrap(),
148 Fr::from_str(
149 "14266894438972358618281326760350513234022317540856366683582613440301108328203",
150 )
151 .unwrap(),
152 ],
153 vec![
154 Fr::from_str(
155 "15544565783214950187472074309645319815959207946976778588709413987755227716658",
156 )
157 .unwrap(),
158 Fr::from_str(
159 "11459281677950411823472431204851572448489387232119046190993717723024935465646",
160 )
161 .unwrap(),
162 Fr::from_str(
163 "21931774631910775084872817505478355551260333558147704485801041562136825822689",
164 )
165 .unwrap(),
166 ],
167 vec![
168 Fr::from_str(
169 "23930462756185355677176913878440535939755511465091906422358167934102141974413",
170 )
171 .unwrap(),
172 Fr::from_str(
173 "24777337052169818536181344215824603464067642843117484360747523672092746770770",
174 )
175 .unwrap(),
176 Fr::from_str(
177 "9723694385274179134284666123116305587583263720877786033125569799811141709147",
178 )
179 .unwrap(),
180 ],
181 vec![
182 Fr::from_str(
183 "21334124835555176052046135550571447667154056413650326169040093998967534013839",
184 )
185 .unwrap(),
186 Fr::from_str(
187 "28178412293035677936519661468561659327776642473949161402580740126141114716595",
188 )
189 .unwrap(),
190 Fr::from_str(
191 "23261949722991482098067992934452303478826592879142057585426055746184730329977",
192 )
193 .unwrap(),
194 ],
195 vec![
196 Fr::from_str(
197 "7525745512005637899980788850937553026084357875660084470654426987818115307169",
198 )
199 .unwrap(),
200 Fr::from_str(
201 "11196989505533608046175719825672890499899138989727925138952469167443760521626",
202 )
203 .unwrap(),
204 Fr::from_str(
205 "25069470445604580535270406510013059947440356347927688567873255716571855782556",
206 )
207 .unwrap(),
208 ],
209 vec![
210 Fr::from_str(
211 "746152031855445071661969786731764979416640168084300832548286844362915267733",
212 )
213 .unwrap(),
214 Fr::from_str(
215 "14500783258490511332342759610086566441467851535274198353685874901881586203920",
216 )
217 .unwrap(),
218 Fr::from_str(
219 "12586553744079534087671160799108871165444925427796015728451282191808004632029",
220 )
221 .unwrap(),
222 ],
223 vec![
224 Fr::from_str(
225 "2658978799169405016067965116007625196452718808329137140199842584938385590196",
226 )
227 .unwrap(),
228 Fr::from_str(
229 "25980326596677328357808416201926774899770147152776274221261358547719778020156",
230 )
231 .unwrap(),
232 Fr::from_str(
233 "24508235842219447789227397734868597077124899664487104942155698316761683262563",
234 )
235 .unwrap(),
236 ],
237 vec![
238 Fr::from_str(
239 "20191280011693017888798491354094094243127547574655352220297687980090230216",
240 )
241 .unwrap(),
242 Fr::from_str(
243 "27372133858594248121174511881254229698687209419322362469155503967311874023911",
244 )
245 .unwrap(),
246 Fr::from_str(
247 "24479529308646273673625530554247818183967069980890544961747034465992605211812",
248 )
249 .unwrap(),
250 ],
251 vec![
252 Fr::from_str(
253 "23978441594464348354765134391283311312307598042652828493772997453014454901206",
254 )
255 .unwrap(),
256 Fr::from_str(
257 "11664556276797417846866489492418594702491171278433997565894976597592370230667",
258 )
259 .unwrap(),
260 Fr::from_str(
261 "12270771377697756787250169216048909236321853168489305289596185098410215090484",
262 )
263 .unwrap(),
264 ],
265 vec![
266 Fr::from_str(
267 "8811136672424023763408452444568991590125177469609096631745680177504609711487",
268 )
269 .unwrap(),
270 Fr::from_str(
271 "20237676190929489436588870470052869226876887618934149899920104260655948094739",
272 )
273 .unwrap(),
274 Fr::from_str(
275 "20062974513054622329783259390735561568588514582980747668306658460292592667248",
276 )
277 .unwrap(),
278 ],
279 vec![
280 Fr::from_str(
281 "798776603612212418444623010074034446472782213575824096964910597458981693714",
282 )
283 .unwrap(),
284 Fr::from_str(
285 "8758094627630360838980606896109464566485363275799929171438278126952202465833",
286 )
287 .unwrap(),
288 Fr::from_str(
289 "707487852423957926868336579455035906997963205205141270331975346408432067044",
290 )
291 .unwrap(),
292 ],
293 vec![
294 Fr::from_str(
295 "202779927146339323474786313977213080711135813758190854284590663556011706836",
296 )
297 .unwrap(),
298 Fr::from_str(
299 "20391231297043803259194308176992776361609861855662006565804325535077866583400",
300 )
301 .unwrap(),
302 Fr::from_str(
303 "13103971641300442794695006804822894722919592148173662271765398624597649213516",
304 )
305 .unwrap(),
306 ],
307 vec![
308 Fr::from_str(
309 "11887088560178314335635682366268022017575768082106271832073442174179560940002",
310 )
311 .unwrap(),
312 Fr::from_str(
313 "9497730497365106303373876625863922615426121795921218372965815099779016166015",
314 )
315 .unwrap(),
316 Fr::from_str(
317 "13255889376415173861282249540978269441170571583954046228817145377643690062643",
318 )
319 .unwrap(),
320 ],
321 vec![
322 Fr::from_str(
323 "21797601683155849424606801821462621112628210830522816165936272187765788522806",
324 )
325 .unwrap(),
326 Fr::from_str(
327 "24581830980057907171669975479232671391615633395687956862981481636043684252818",
328 )
329 .unwrap(),
330 Fr::from_str(
331 "3541295787421703076701812027030126532836938797821201403520460081703194798007",
332 )
333 .unwrap(),
334 ],
335 vec![
336 Fr::from_str(
337 "26648315008823981808527573963042312855617262185318718006368079643838521696342",
338 )
339 .unwrap(),
340 Fr::from_str(
341 "25709698375978466998813029191490908445909426399743598850530240905007542181236",
342 )
343 .unwrap(),
344 Fr::from_str(
345 "15108470522637839917783948187626705626608074131603801620229663133367773769409",
346 )
347 .unwrap(),
348 ],
349 vec![
350 Fr::from_str(
351 "28021329994881905447188243064573681540852456674731988825066269508526569461230",
352 )
353 .unwrap(),
354 Fr::from_str(
355 "23931699377713654292108411755172835281506863304630736051021853367123546501725",
356 )
357 .unwrap(),
358 Fr::from_str(
359 "16723886233609641431662771575929234875591162154288587674425439500724219825212",
360 )
361 .unwrap(),
362 ],
363 vec![
364 Fr::from_str(
365 "2671311012893846775573899497331547132295274951055892772678260375558714942406",
366 )
367 .unwrap(),
368 Fr::from_str(
369 "10473922685305341900412641696196941263307819634043185788067854748950602802383",
370 )
371 .unwrap(),
372 Fr::from_str(
373 "5111630741260296655990184310611375231177307348451724203930709456972805973880",
374 )
375 .unwrap(),
376 ],
377 vec![
378 Fr::from_str(
379 "4992057345914438551815056581049158703461724962129889522457212594798779955393",
380 )
381 .unwrap(),
382 Fr::from_str(
383 "21183229986193453383825269196190741932488867108677665668392098260004852050858",
384 )
385 .unwrap(),
386 Fr::from_str(
387 "17083812614758825262603118558173710997332640429545889370504202808090339572857",
388 )
389 .unwrap(),
390 ],
391 vec![
392 Fr::from_str(
393 "26920976402012774776865974353864956131500106517245044898291304474770065076213",
394 )
395 .unwrap(),
396 Fr::from_str(
397 "8733966472516018163838600897336665253176449185681528084604422362542186741640",
398 )
399 .unwrap(),
400 Fr::from_str(
401 "12872170036700590319474830060138441606481805188061693688276584984859227049202",
402 )
403 .unwrap(),
404 ],
405 vec![
406 Fr::from_str(
407 "4477722790415428221489180851061526086953856916136558152290587660464310195129",
408 )
409 .unwrap(),
410 Fr::from_str(
411 "15013641992838646488575621859957900283128972996570425739867595472354843675113",
412 )
413 .unwrap(),
414 Fr::from_str(
415 "11110048915932820585149019832900719558018746589803602931460479672600239301992",
416 )
417 .unwrap(),
418 ],
419 vec![
420 Fr::from_str(
421 "6386524788949068680243545386229548182250656575626566757865736117588702942149",
422 )
423 .unwrap(),
424 Fr::from_str(
425 "10817607938125396761228235991828983933462215897289776505148575850147631400593",
426 )
427 .unwrap(),
428 Fr::from_str(
429 "17865086662065068946652014543896618689007438069494510844490187921781045033543",
430 )
431 .unwrap(),
432 ],
433 vec![
434 Fr::from_str(
435 "26739078526540815991525797409513121042395926527702073499652548281297625028042",
436 )
437 .unwrap(),
438 Fr::from_str(
439 "22105063856923216930774038075969680004134092465525615222672386192561909491643",
440 )
441 .unwrap(),
442 Fr::from_str(
443 "6547073217674180994961882255834734219166276822047545566909303528752619346965",
444 )
445 .unwrap(),
446 ],
447 vec![
448 Fr::from_str(
449 "25888791229334359634310626508983935867495449391423881771352427385021616079608",
450 )
451 .unwrap(),
452 Fr::from_str(
453 "5728419725627720701717078886669712201564103341166911632619636881997293379662",
454 )
455 .unwrap(),
456 Fr::from_str(
457 "9577751993330236726740958969117670757888267786661142736615315540557935073808",
458 )
459 .unwrap(),
460 ],
461 vec![
462 Fr::from_str(
463 "18485877910552384007717083804696131794323032392196584185820990234315883649039",
464 )
465 .unwrap(),
466 Fr::from_str(
467 "1769516528997465058766917692166940530540162775010485894812511264651123420964",
468 )
469 .unwrap(),
470 Fr::from_str(
471 "386757200774461941643538807053842280717539800465562760112828539321993775241",
472 )
473 .unwrap(),
474 ],
475 vec![
476 Fr::from_str(
477 "3316509296104361799525651631938052468498330218596415774527777363167138087617",
478 )
479 .unwrap(),
480 Fr::from_str(
481 "13729336006888298565425261097968915916390598196131379830434588594171666569512",
482 )
483 .unwrap(),
484 Fr::from_str(
485 "16148239410408669906403652096870758949643310812745307334909798696471189947927",
486 )
487 .unwrap(),
488 ],
489 vec![
490 Fr::from_str(
491 "21823520381432477314141727574561655219860240640515827154913290917309686356497",
492 )
493 .unwrap(),
494 Fr::from_str(
495 "28068200504050762109788374571880725807356066145249496235193375357140395644419",
496 )
497 .unwrap(),
498 Fr::from_str(
499 "5091226074924237835610573037013208388130454756337337471122368918009398753447",
500 )
501 .unwrap(),
502 ],
503 vec![
504 Fr::from_str(
505 "6515120964938381342071855012952056094433032260551298595194434149594056652176",
506 )
507 .unwrap(),
508 Fr::from_str(
509 "2340842607486511800425610472421888578518367747461866490788654350550767741883",
510 )
511 .unwrap(),
512 Fr::from_str(
513 "28166492224976583257960903700053982900186421019635512376218580362545306276709",
514 )
515 .unwrap(),
516 ],
517 vec![
518 Fr::from_str(
519 "3712612816523606936094514234541515605991691986951168127960369409943944902903",
520 )
521 .unwrap(),
522 Fr::from_str(
523 "1152766033584194531070871869834974085415579739949782153652057784926343256899",
524 )
525 .unwrap(),
526 Fr::from_str(
527 "8765049913334393206963752695629450392338936491569237833753514286462581790561",
528 )
529 .unwrap(),
530 ],
531 vec![
532 Fr::from_str(
533 "1601627912182619663670418257843886466719103377571015176803695116602531025179",
534 )
535 .unwrap(),
536 Fr::from_str(
537 "18098024103033142368624034583201165961009040474643655548434700066455514231331",
538 )
539 .unwrap(),
540 Fr::from_str(
541 "21928220871250005366949251966887490261658471717243624436236070782233710958193",
542 )
543 .unwrap(),
544 ],
545 vec![
546 Fr::from_str(
547 "13295211045409383825433911169815486079945004241473963274225158733643991813121",
548 )
549 .unwrap(),
550 Fr::from_str(
551 "10102619007330980171750476017504785290001093245315837544464105419145430593293",
552 )
553 .unwrap(),
554 Fr::from_str(
555 "209066254001010781273163283043011468251658035504800687498237342325693440716",
556 )
557 .unwrap(),
558 ],
559 vec![
560 Fr::from_str(
561 "10569794888394925789900696666438098928482919555802848731145904974932210713381",
562 )
563 .unwrap(),
564 Fr::from_str(
565 "24519507563490032456526532812360147850362262124850480124499654753387364654494",
566 )
567 .unwrap(),
568 Fr::from_str(
569 "8177920417424677597775227574376448009357347539898615178798501628859714007479",
570 )
571 .unwrap(),
572 ],
573 vec![
574 Fr::from_str(
575 "12067616893727942346831314147294036302857666398663726324584342747296065928710",
576 )
577 .unwrap(),
578 Fr::from_str(
579 "16971111464439978238379247781540292780056241741803063434856766170743124461469",
580 )
581 .unwrap(),
582 Fr::from_str(
583 "19754437344667989781187357721513315145328407420825515279265102170857620051268",
584 )
585 .unwrap(),
586 ],
587 vec![
588 Fr::from_str(
589 "3975594217367336645402283024719769072885792075344511606692741601510641156311",
590 )
591 .unwrap(),
592 Fr::from_str(
593 "19040197452680989990741508256669934716515775259429067120683774529031109727966",
594 )
595 .unwrap(),
596 Fr::from_str(
597 "5634578132978895965594894841292458192813357921721236220653749372316851034659",
598 )
599 .unwrap(),
600 ],
601 vec![
602 Fr::from_str(
603 "24312649336217150643502647288233882695985124865143983808786503810476675628308",
604 )
605 .unwrap(),
606 Fr::from_str(
607 "26190380549799665209932387790089553938565301230293821415792947418738438572475",
608 )
609 .unwrap(),
610 Fr::from_str(
611 "28207972947754207739680139011960703172165585550947706768480292386338937193745",
612 )
613 .unwrap(),
614 ],
615 vec![
616 Fr::from_str(
617 "14451766174292343678890357279454517773013585124369849119851032684103228653072",
618 )
619 .unwrap(),
620 Fr::from_str(
621 "12181367175079876176988175575030826371836485595254655739186027469233503901695",
622 )
623 .unwrap(),
624 Fr::from_str(
625 "10991645916339084020684503132290495819766466380987797648576877855177656702574",
626 )
627 .unwrap(),
628 ],
629 vec![
630 Fr::from_str(
631 "21313503925572929158381750262537945058966279485804307864340280517601895617812",
632 )
633 .unwrap(),
634 Fr::from_str(
635 "1550527311092834162328201290652099251984068161341884726521396319041776382263",
636 )
637 .unwrap(),
638 Fr::from_str(
639 "12003435213367105899404267897476505638234793525266930670911913539817221417924",
640 )
641 .unwrap(),
642 ],
643 vec![
644 Fr::from_str(
645 "8914436165324002549401721460186086215484314929358430322367050538121529812441",
646 )
647 .unwrap(),
648 Fr::from_str(
649 "27832471390260088958712195064264693263013262224866234154815027609517686567070",
650 )
651 .unwrap(),
652 Fr::from_str(
653 "21985130074442575837699661478687045882883906445505825293630722207419298642563",
654 )
655 .unwrap(),
656 ],
657 vec![
658 Fr::from_str(
659 "3121108818032693608292705100552135299104657945137655223341160358361023747970",
660 )
661 .unwrap(),
662 Fr::from_str(
663 "27854040945265461368879245943811705519815133202941163906839617464472048050107",
664 )
665 .unwrap(),
666 Fr::from_str(
667 "16002511017673785381646235433633055570232704209925362749110958022614294680393",
668 )
669 .unwrap(),
670 ],
671 vec![
672 Fr::from_str(
673 "9391205603129777266623979897548135033992809302803677537718465809304634939535",
674 )
675 .unwrap(),
676 Fr::from_str(
677 "24297079789956858850141557550669917040800093660605463170583536807967359376943",
678 )
679 .unwrap(),
680 Fr::from_str(
681 "5541548341946936547043936820389981449139467811019058131623682269330484215783",
682 )
683 .unwrap(),
684 ],
685 vec![
686 Fr::from_str(
687 "7190170322642292762509602175876149041297305605840922902837779590457938918669",
688 )
689 .unwrap(),
690 Fr::from_str(
691 "2027727849652978298961694136962688734430323753419089111303416976388312626148",
692 )
693 .unwrap(),
694 Fr::from_str(
695 "402427768909234974448400451691124558802645007494232545425431267044631491274",
696 )
697 .unwrap(),
698 ],
699 vec![
700 Fr::from_str(
701 "12797987239774923416407369376953974586493255155241527032821517134381740228905",
702 )
703 .unwrap(),
704 Fr::from_str(
705 "13333249780205062899642181453873590081512016926206507817605750877019442371089",
706 )
707 .unwrap(),
708 Fr::from_str(
709 "22188565325128643960736450273241242961083822226450593824571763485758109842353",
710 )
711 .unwrap(),
712 ],
713 vec![
714 Fr::from_str(
715 "14776177603689091833670811465610858113310593319381602563122002687195119058247",
716 )
717 .unwrap(),
718 Fr::from_str(
719 "8091773219661648644611506313794854881311037176009459530767471191252204309868",
720 )
721 .unwrap(),
722 Fr::from_str(
723 "11572415535524327542083010017274275840592842320730873456621979565559067913733",
724 )
725 .unwrap(),
726 ],
727 vec![
728 Fr::from_str(
729 "20923164127054504021838810951918321616973675807578349217848643497149066166007",
730 )
731 .unwrap(),
732 Fr::from_str(
733 "23916764349365855067645867029751406599241457684665189633084153863091374186634",
734 )
735 .unwrap(),
736 Fr::from_str(
737 "15824998809651622678290890820327874961632638426240138370022501121781103446259",
738 )
739 .unwrap(),
740 ],
741 vec![
742 Fr::from_str(
743 "24637783239914661001463701818528140355269066399069119799243934837974141806351",
744 )
745 .unwrap(),
746 Fr::from_str(
747 "960857870893264392654072242483170132703826969766439993624797963496069781505",
748 )
749 .unwrap(),
750 Fr::from_str(
751 "26437805484456742255124383441148924774337202744224954418128369699282030985816",
752 )
753 .unwrap(),
754 ],
755 vec![
756 Fr::from_str(
757 "26578738662896906130683946198236194771349279034514315009985381494637755178012",
758 )
759 .unwrap(),
760 Fr::from_str(
761 "4824844368626589074800225473359998312724599509010698030845972726192270761413",
762 )
763 .unwrap(),
764 Fr::from_str(
765 "1279633418489206280063439936145640252901253476940505080338091886704297503137",
766 )
767 .unwrap(),
768 ],
769 vec![
770 Fr::from_str(
771 "13710991567078829309950552225511825775559273430088991705888338422645023107567",
772 )
773 .unwrap(),
774 Fr::from_str(
775 "24668872485331698368369872321174853677667368883929365377153552889902839876059",
776 )
777 .unwrap(),
778 Fr::from_str(
779 "13750456500419553884447154012886160987332428475286924998031161614878499276461",
780 )
781 .unwrap(),
782 ],
783 vec![
784 Fr::from_str(
785 "7897870706671989949903359523135485593775134275719857967175422051001928288650",
786 )
787 .unwrap(),
788 Fr::from_str(
789 "24837463715854409438259925936940667100471584776258950891486907118659586222782",
790 )
791 .unwrap(),
792 Fr::from_str(
793 "15102320430753094455411262873908179792479117498565463936483853362951093377404",
794 )
795 .unwrap(),
796 ],
797 vec![
798 Fr::from_str(
799 "20684012922073862986880613075424856809319565915848039596293835293542621074230",
800 )
801 .unwrap(),
802 Fr::from_str(
803 "27853137663239148089212917142958191707337132972791514344244938292818076156215",
804 )
805 .unwrap(),
806 Fr::from_str(
807 "21515833961121090836372549249533024521086358011705741464637998484545867651639",
808 )
809 .unwrap(),
810 ],
811 vec![
812 Fr::from_str(
813 "14927367861301244473471972423309886137778884679987552642033604382283866452496",
814 )
815 .unwrap(),
816 Fr::from_str(
817 "2234445563530370737450306710054836240206601416475326119659514396778117223266",
818 )
819 .unwrap(),
820 Fr::from_str(
821 "7320243644229576716977260850447281726825012665363843781486677636270396893993",
822 )
823 .unwrap(),
824 ],
825 vec![
826 Fr::from_str(
827 "3648709991731171089283528046834957511485556517829186374119154464357293936649",
828 )
829 .unwrap(),
830 Fr::from_str(
831 "8431771340355225974834111903440269408389608143822442356390982704086190421477",
832 )
833 .unwrap(),
834 Fr::from_str(
835 "850707530944871742730572985296454989068982533587676445405227892149682249460",
836 )
837 .unwrap(),
838 ],
839 vec![
840 Fr::from_str(
841 "27968558232222653455324053739339866927384509292992637407525622495221665748064",
842 )
843 .unwrap(),
844 Fr::from_str(
845 "18309438953837613260356082733742847603856465956586832431344593061564231402706",
846 )
847 .unwrap(),
848 Fr::from_str(
849 "7558769148417330857693721923631008074203529622851527561622447590521963662006",
850 )
851 .unwrap(),
852 ],
853 vec![
854 Fr::from_str(
855 "3817411164684956972519434296876841710387488302709712662164166985673595410943",
856 )
857 .unwrap(),
858 Fr::from_str(
859 "14529667139169881031943219432572774573785882712681678612418006263967413092263",
860 )
861 .unwrap(),
862 Fr::from_str(
863 "23218827447973479235173323744034317336035671404247548580906272331188785389688",
864 )
865 .unwrap(),
866 ],
867 vec![
868 Fr::from_str(
869 "8651801510810146025412974160945288620309458551124978671355372318440299892446",
870 )
871 .unwrap(),
872 Fr::from_str(
873 "22421908295524355984007285617835206887162355421815299667252838830702546015133",
874 )
875 .unwrap(),
876 Fr::from_str(
877 "7160018919593574320964537152208736524155714355508700340218764463887638143455",
878 )
879 .unwrap(),
880 ],
881 vec![
882 Fr::from_str(
883 "723350002648579254243598219836182385851624402483518972524433485600657018308",
884 )
885 .unwrap(),
886 Fr::from_str(
887 "1424479715330663945471022437902357236141169107604243794548089122048400883402",
888 )
889 .unwrap(),
890 Fr::from_str(
891 "12380316486623809861878214203281027877179803297952235333898818121693577083127",
892 )
893 .unwrap(),
894 ],
895 vec![
896 Fr::from_str(
897 "13300264762908838749047406324479200233395191915779570411502803795135456010503",
898 )
899 .unwrap(),
900 Fr::from_str(
901 "7182708579311809518589613836995895145881239038123095258480613105900991785981",
902 )
903 .unwrap(),
904 Fr::from_str(
905 "3399116840288437658533170746195011940616209443265644590911430680876206950690",
906 )
907 .unwrap(),
908 ],
909 vec![
910 Fr::from_str(
911 "18075677167539342788969842697404710734192919515624038738684304089341638962797",
912 )
913 .unwrap(),
914 Fr::from_str(
915 "774916241389256067817357617190556955727339372170470123567430330174958764878",
916 )
917 .unwrap(),
918 Fr::from_str(
919 "23911159648093593276293911909659625889333565386584216455353262739940352889672",
920 )
921 .unwrap(),
922 ],
923 vec![
924 Fr::from_str(
925 "7861494016510010234313534888968189516898452462977986982488816163397319727747",
926 )
927 .unwrap(),
928 Fr::from_str(
929 "15072759186032286031690480130876158018121236234681552923585561011002205274233",
930 )
931 .unwrap(),
932 Fr::from_str(
933 "13329814760549908430040494615924435617177143177522675259969178808824256694834",
934 )
935 .unwrap(),
936 ],
937 vec![
938 Fr::from_str(
939 "7468723007810503327553686337411634190912418400882277241712552524430599692675",
940 )
941 .unwrap(),
942 Fr::from_str(
943 "11304437011528059451078980881777692033687950145258622992372151025965772625841",
944 )
945 .unwrap(),
946 Fr::from_str(
947 "24455414907879354554658170783358918522990892444576704866381766190660412826213",
948 )
949 .unwrap(),
950 ],
951 vec![
952 Fr::from_str(
953 "4123473255827760339537832283192656514249000347603384170048044945751397547862",
954 )
955 .unwrap(),
956 Fr::from_str(
957 "13177230660974899915401210507892129885856976090284825863072745642109312338203",
958 )
959 .unwrap(),
960 Fr::from_str(
961 "28859805634412811444238562480326194712347893192568982315953124889109926907412",
962 )
963 .unwrap(),
964 ],
965 vec![
966 Fr::from_str(
967 "7803019375719168318963557398085369618684087162676370220706203244371827257508",
968 )
969 .unwrap(),
970 Fr::from_str(
971 "4029922906086312393665000628450269927106443351493821364980763691551262280792",
972 )
973 .unwrap(),
974 Fr::from_str(
975 "11158633081229897821908038161319320155864649742858460176817619070002508020544",
976 )
977 .unwrap(),
978 ],
979 vec![
980 Fr::from_str(
981 "18052059944752105394121061539214545921115313064660268801792496020636120990680",
982 )
983 .unwrap(),
984 Fr::from_str(
985 "28815470454875236045606443537792333795118166510830397224364317235056781483845",
986 )
987 .unwrap(),
988 Fr::from_str(
989 "8678824483470329866907826063438633160791886719100084683778994189652170993635",
990 )
991 .unwrap(),
992 ],
993 ],
994 }
995}
996
997pub fn static_params() -> &'static ArithmeticSpongeParams<Fr> {
998 static PARAMS: Lazy<ArithmeticSpongeParams<Fr>> = Lazy::new(params);
999 &PARAMS
1000}
1001
1002#[derive(Clone)]
1007pub struct PlonkSpongeConstantsIVC {}
1008
1009impl SpongeConstants for PlonkSpongeConstantsIVC {
1010 const SPONGE_CAPACITY: usize = 1;
1011 const SPONGE_WIDTH: usize = 3;
1012 const SPONGE_RATE: usize = 2;
1013 const PERM_ROUNDS_FULL: usize = 0;
1014 const PERM_ROUNDS_PARTIAL: usize = 56;
1015 const PERM_HALF_ROUNDS_FULL: usize = 4;
1016 const PERM_SBOX: u32 = 5;
1017 const PERM_FULL_MDS: bool = true;
1018 const PERM_INITIAL_ARK: bool = false;
1019}
1020
1021pub struct PoseidonBN254Parameters;
1022
1023impl PoseidonParams<Fr, STATE_SIZE, NB_TOTAL_ROUND> for PoseidonBN254Parameters {
1024 fn constants(&self) -> [[Fr; STATE_SIZE]; NB_TOTAL_ROUND] {
1025 let rc = &static_params().round_constants;
1026 core::array::from_fn(|i| core::array::from_fn(|j| Fr::from(rc[i][j])))
1027 }
1028
1029 fn mds(&self) -> [[Fr; STATE_SIZE]; STATE_SIZE] {
1030 let mds = &static_params().mds;
1031 core::array::from_fn(|i| core::array::from_fn(|j| Fr::from(mds[i][j])))
1032 }
1033}
1034
1035#[cfg(test)]
1036mod tests {
1037 use core::str::FromStr;
1038
1039 use super::{static_params, PlonkSpongeConstantsIVC};
1040 use ark_bn254::Fr;
1041 use kimchi::o1_utils::FieldHelpers;
1042 use mina_poseidon::poseidon::{ArithmeticSponge as Poseidon, Sponge as _};
1043
1044 #[test]
1048 fn test_poseidon() {
1049 let mut hash = Poseidon::<Fr, PlonkSpongeConstantsIVC>::new(static_params());
1050 let input: [Fr; 3] = [
1051 Fr::from_str("1").unwrap(),
1052 Fr::from_str("1").unwrap(),
1053 Fr::from_str("1").unwrap(),
1054 ];
1055 let exp_output_str = [
1056 "05c09e2e5cf67833f4987c3011ae8c754b70dd8c28cbb619b421e012fad87c16",
1057 "14b598974e69d9cbee4c6b809256152552ec6c008e59f5fe54f60491d8286c23",
1058 "54e82d762fe2994c85fb4d4e1b22cb060b005327bba4265e486e82ae0c2a7125",
1059 ];
1060 let exp_output = exp_output_str.map(|x| Fr::from_hex(x).unwrap());
1061 hash.absorb(&input);
1062 assert_eq!(hash.state, exp_output);
1063 }
1064}