ivc/poseidon_8_56_5_3_2/bn254/
mod.rs

1//! Poseidon parameters that can be used by [crate::poseidon_8_56_5_3_2] over
2//! the scalar field of BN254, for a security level of 128 bits.
3
4use 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
10/// The number of field elements in the state
11pub const STATE_SIZE: usize = 3;
12
13/// Number of full rounds
14pub const NB_FULL_ROUND: usize = 8;
15
16/// Number of partial rounds
17pub const NB_PARTIAL_ROUND: usize = 56;
18
19/// Total number of rounds, including partial and full.
20pub const NB_TOTAL_ROUND: usize = NB_FULL_ROUND + NB_PARTIAL_ROUND;
21
22/// Number of round constants
23pub const NB_ROUND_CONSTANTS: usize = NB_TOTAL_ROUND * STATE_SIZE;
24
25/// The number of constraints required by this gadget
26pub const NB_CONSTRAINTS: usize = 432;
27
28/// The maximum degree of a constraint
29pub const MAX_DEGREE: u64 = 2;
30
31pub type Column = PoseidonColumn<STATE_SIZE, NB_FULL_ROUND, NB_PARTIAL_ROUND>;
32
33/// The number of columns in the poseidon permutation
34// This is an alias to ease the reference to it in the code.
35pub const NB_COLUMNS: usize = Column::N_COL;
36
37// FIXME: move into mina_poseidon when this code is ready to go into production.
38/* Generated by the following command:
39```shell
40sage params.sage --rounds 64 rust 3 bn254 > bn254_poseidon.rs
41```
42with the commit 85cbccd4266cdb567fd47ffc54c3fa52543c2c51
43where the curves have been changed in the script params.sage to use bn254
44 */
45
46use 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/// Constants used by the IVC circuit used by the folding scheme
1003/// This is meant to be only used for the IVC circuit, with the BN254 curve
1004/// It has not been tested with/for other curves.
1005// This must be moved into mina_poseidon later.
1006#[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    // Regression tests. Test vectors have been generated using the same
1045    // code, commit cdca35851ff27bdaf9277388ea08d83c8a0a75fc
1046    // This does not mean that the implementation is correct.
1047    #[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}