ivc/
poseidon_params_55_0_7_3.rs

1//! Poseidon parameters that can be used by [crate::poseidon_55_0_7_3_2] and
2//! [crate::poseidon_55_0_7_3_7] over the scalar field of BN254
3
4use ark_bn254::Fr as Fp;
5use mina_poseidon::{constants::SpongeConstants, poseidon::ArithmeticSpongeParams};
6use once_cell::sync::Lazy;
7
8// FIXME: move into mina_poseidon when this code is ready to go into production.
9/* Generated by the following command:
10```shell
11sage params.sage --rounds 55 rust 3 bn254 > bn254_poseidon.rs
12```
13with the commit 85cbccd4266cdb567fd47ffc54c3fa52543c2c51
14where the curves have been changed in the script params.sage to use bn254
15*/
16
17use core::str::FromStr;
18
19fn params() -> ArithmeticSpongeParams<Fp> {
20    ArithmeticSpongeParams {
21        mds: vec![
22            vec![
23                Fp::from_str(
24                    "18254759465961548724473677898900554279129333700345398792534035897544813417380",
25                )
26                .unwrap(),
27                Fp::from_str(
28                    "9701727079493493822153587075727161870060130406601968554920630310837077525782",
29                )
30                .unwrap(),
31                Fp::from_str(
32                    "6448075384674872988709285295252735647564764677180219427814076333498731944341",
33                )
34                .unwrap(),
35            ],
36            vec![
37                Fp::from_str(
38                    "10582678689390677133753881397356982896844997242148790399395649637165847896125",
39                )
40                .unwrap(),
41                Fp::from_str(
42                    "14953878658754362056567950679445798963011901944940518481654524320703963311366",
43                )
44                .unwrap(),
45                Fp::from_str(
46                    "2769559556749664962636128855242028623701912278738796979170458933982658616355",
47                )
48                .unwrap(),
49            ],
50            vec![
51                Fp::from_str(
52                    "11085432328429990699367643357327464988188253029150852680916595311968413759302",
53                )
54                .unwrap(),
55                Fp::from_str(
56                    "6616328759095010539674576883698535512612418243442338373652055842385579197823",
57                )
58                .unwrap(),
59                Fp::from_str(
60                    "1788173826467567565151305865636675972489937758217944451266517527454717587391",
61                )
62                .unwrap(),
63            ],
64        ],
65        round_constants: vec![
66            vec![
67                Fp::from_str(
68                    "464317818058904040455944620932325370057318211982758073789794737262512069860",
69                )
70                .unwrap(),
71                Fp::from_str(
72                    "3462163333362550903390325785926437039762839525013511939547720766741499409856",
73                )
74                .unwrap(),
75                Fp::from_str(
76                    "12308193519164615772431903590941145851045953550307364845912877146027882177970",
77                )
78                .unwrap(),
79            ],
80            vec![
81                Fp::from_str(
82                    "2714591816949287658718284157908523280274340884728966119095559324137312851163",
83                )
84                .unwrap(),
85                Fp::from_str(
86                    "16384206429233192859678459425673999470857159372638200975562270773516251379588",
87                )
88                .unwrap(),
89                Fp::from_str(
90                    "19416611223573031732302519381697999456593181436167069017836818060955725864200",
91                )
92                .unwrap(),
93            ],
94            vec![
95                Fp::from_str(
96                    "17603455420764872031698321921973319158461544396609704072026904164018868607752",
97                )
98                .unwrap(),
99                Fp::from_str(
100                    "11238098416885388471337306072943475212729724613485264776842071924751017567771",
101                )
102                .unwrap(),
103                Fp::from_str(
104                    "20115085162632036284496420664439046277270577640351232755593699800626568913281",
105                )
106                .unwrap(),
107            ],
108            vec![
109                Fp::from_str(
110                    "13522402812268713007260660858020591835416325370361256561462576999381232564525",
111                )
112                .unwrap(),
113                Fp::from_str(
114                    "17993297334719348473740719243191272244929728431491444848946396448123051191677",
115                )
116                .unwrap(),
117                Fp::from_str(
118                    "14266894438972358618281326760350513234022317540856366683582613440301108328203",
119                )
120                .unwrap(),
121            ],
122            vec![
123                Fp::from_str(
124                    "15544565783214950187472074309645319815959207946976778588709413987755227716658",
125                )
126                .unwrap(),
127                Fp::from_str(
128                    "11459281677950411823472431204851572448489387232119046190993717723024935465646",
129                )
130                .unwrap(),
131                Fp::from_str(
132                    "3175427723782491063823141004980187933184665826684252846205862234135139398026",
133                )
134                .unwrap(),
135            ],
136            vec![
137                Fp::from_str(
138                    "18104087100840279413272173524166428384373648597907924300377376914338365801413",
139                )
140                .unwrap(),
141                Fp::from_str(
142                    "11059348970814019325544810642103429754398805409212413029570905399054361253560",
143                )
144                .unwrap(),
145                Fp::from_str(
146                    "9723694385274179134284666123116305587583263720877786033125569799811141709147",
147                )
148                .unwrap(),
149            ],
150            vec![
151                Fp::from_str(
152                    "21334124835555176052046135550571447667154056413650326169040093998967534013839",
153                )
154                .unwrap(),
155                Fp::from_str(
156                    "13186187149295477383503606350078912331255804347098276303051944780008615958248",
157                )
158                .unwrap(),
159                Fp::from_str(
160                    "1470033952086888296713916393108192307114009370637357884278948695504654950262",
161                )
162                .unwrap(),
163            ],
164            vec![
165                Fp::from_str(
166                    "7525745512005637899980788850937553026084357875660084470654426987818115307169",
167                )
168                .unwrap(),
169                Fp::from_str(
170                    "11196989505533608046175719825672890499899138989727925138952469167443760521626",
171                )
172                .unwrap(),
173                Fp::from_str(
174                    "9101167944054900479650446113089291293767218643046467434823338481469624077969",
175                )
176                .unwrap(),
177            ],
178            vec![
179                Fp::from_str(
180                    "746152031855445071661969786731764979416640168084300832548286844362915267733",
181                )
182                .unwrap(),
183                Fp::from_str(
184                    "14500783258490511332342759610086566441467851535274198353685874901881586203920",
185                )
186                .unwrap(),
187                Fp::from_str(
188                    "12586553744079534087671160799108871165444925427796015728451282191808004632029",
189                )
190                .unwrap(),
191            ],
192            vec![
193                Fp::from_str(
194                    "2658978799169405016067965116007625196452718808329137140199842584938385590196",
195                )
196                .unwrap(),
197                Fp::from_str(
198                    "14945177760821130319202365009462588707535813273905143480365649428853002471274",
199                )
200                .unwrap(),
201                Fp::from_str(
202                    "17059544527948691563140405641038225702602878092594471881549757285581285907208",
203                )
204                .unwrap(),
205            ],
206            vec![
207                Fp::from_str(
208                    "20191280011693017888798491354094094243127547574655352220297687980090230216",
209                )
210                .unwrap(),
211                Fp::from_str(
212                    "18502499034030581022389564056073081062360187604161458073890564428974602584477",
213                )
214                .unwrap(),
215                Fp::from_str(
216                    "8264062626605956514525302888463961111763485965406820048999276299668892074923",
217                )
218                .unwrap(),
219            ],
220            vec![
221                Fp::from_str(
222                    "10792209418985110179364134772680195398048938179898831723416765403620730620462",
223                )
224                .unwrap(),
225                Fp::from_str(
226                    "11664556276797417846866489492418594702491171278433997565894976597592370230667",
227                )
228                .unwrap(),
229                Fp::from_str(
230                    "12270771377697756787250169216048909236321853168489305289596185098410215090484",
231                )
232                .unwrap(),
233            ],
234            vec![
235                Fp::from_str(
236                    "8811136672424023763408452444568991590125177469609096631745680177504609711487",
237                )
238                .unwrap(),
239                Fp::from_str(
240                    "20237676190929489436588870470052869226876887618934149899920104260655948094739",
241                )
242                .unwrap(),
243                Fp::from_str(
244                    "20062974513054622329783259390735561568588514582980747668306658460292592667248",
245                )
246                .unwrap(),
247            ],
248            vec![
249                Fp::from_str(
250                    "798776603612212418444623010074034446472782213575824096964910597458981693714",
251                )
252                .unwrap(),
253                Fp::from_str(
254                    "8758094627630360838980606896109464566485363275799929171438278126952202465833",
255                )
256                .unwrap(),
257                Fp::from_str(
258                    "707487852423957926868336579455035906997963205205141270331975346408432067044",
259                )
260                .unwrap(),
261            ],
262            vec![
263                Fp::from_str(
264                    "202779927146339323474786313977213080711135813758190854284590663556011706836",
265                )
266                .unwrap(),
267                Fp::from_str(
268                    "20391231297043803259194308176992776361609861855662006565804325535077866583400",
269                )
270                .unwrap(),
271                Fp::from_str(
272                    "13103971641300442794695006804822894722919592148173662271765398624597649213516",
273                )
274                .unwrap(),
275            ],
276            vec![
277                Fp::from_str(
278                    "11887088560178314335635682366268022017575768082106271832073442174179560940002",
279                )
280                .unwrap(),
281                Fp::from_str(
282                    "9497730497365106303373876625863922615426121795921218372965815099779016166015",
283                )
284                .unwrap(),
285                Fp::from_str(
286                    "13255889376415173861282249540978269441170571583954046228817145377643690062643",
287                )
288                .unwrap(),
289            ],
290            vec![
291                Fp::from_str(
292                    "21797601683155849424606801821462621112628210830522816165936272187765788522806",
293                )
294                .unwrap(),
295                Fp::from_str(
296                    "13791904812004141351280616602806766268926714029237345281809436730651246516674",
297                )
298                .unwrap(),
299                Fp::from_str(
300                    "3541295787421703076701812027030126532836938797821201403520460081703194798007",
301                )
302                .unwrap(),
303            ],
304            vec![
305                Fp::from_str(
306                    "6772295061598565998757352284489337907928739308702535748450215960170676319556",
307                )
308                .unwrap(),
309                Fp::from_str(
310                    "19608658591798530616680061208581311706541541564609366646372793300896320095218",
311                )
312                .unwrap(),
313                Fp::from_str(
314                    "15108470522637839917783948187626705626608074131603801620229663133367773769409",
315                )
316                .unwrap(),
317            ],
318            vec![
319                Fp::from_str(
320                    "6982167525494887125745884237873629770460477859443352710958203128353080003941",
321                )
322                .unwrap(),
323                Fp::from_str(
324                    "7877853416249147253292651939679543007752875545630493492558173940354891685347",
325                )
326                .unwrap(),
327                Fp::from_str(
328                    "16723886233609641431662771575929234875591162154288587674425439500724219825212",
329                )
330                .unwrap(),
331            ],
332            vec![
333                Fp::from_str(
334                    "2671311012893846775573899497331547132295274951055892772678260375558714942406",
335                )
336                .unwrap(),
337                Fp::from_str(
338                    "10473922685305341900412641696196941263307819634043185788067854748950602802383",
339                )
340                .unwrap(),
341                Fp::from_str(
342                    "5111630741260296655990184310611375231177307348451724203930709456972805973880",
343                )
344                .unwrap(),
345            ],
346            vec![
347                Fp::from_str(
348                    "4992057345914438551815056581049158703461724962129889522457212594798779955393",
349                )
350                .unwrap(),
351                Fp::from_str(
352                    "21183229986193453383825269196190741932488867108677665668392098260004852050858",
353                )
354                .unwrap(),
355                Fp::from_str(
356                    "17083812614758825262603118558173710997332640429545889370504202808090339572857",
357                )
358                .unwrap(),
359            ],
360            vec![
361                Fp::from_str(
362                    "18125355879021821849041167225185950892076210587475775745349215815478764407922",
363                )
364                .unwrap(),
365                Fp::from_str(
366                    "8733966472516018163838600897336665253176449185681528084604422362542186741640",
367                )
368                .unwrap(),
369                Fp::from_str(
370                    "12872170036700590319474830060138441606481805188061693688276584984859227049202",
371                )
372                .unwrap(),
373            ],
374            vec![
375                Fp::from_str(
376                    "4477722790415428221489180851061526086953856916136558152290587660464310195129",
377                )
378                .unwrap(),
379                Fp::from_str(
380                    "15013641992838646488575621859957900283128972996570425739867595472354843675113",
381                )
382                .unwrap(),
383                Fp::from_str(
384                    "11110048915932820585149019832900719558018746589803602931460479672600239301992",
385                )
386                .unwrap(),
387            ],
388            vec![
389                Fp::from_str(
390                    "6386524788949068680243545386229548182250656575626566757865736117588702942149",
391                )
392                .unwrap(),
393                Fp::from_str(
394                    "10817607938125396761228235991828983933462215897289776505148575850147631400593",
395                )
396                .unwrap(),
397                Fp::from_str(
398                    "17865086662065068946652014543896618689007438069494510844490187921781045033543",
399                )
400                .unwrap(),
401            ],
402            vec![
403                Fp::from_str(
404                    "21842035812228593226084835552836653742808044145939024628842446854237127923353",
405                )
406                .unwrap(),
407                Fp::from_str(
408                    "2471068742343144756503096572812849495213874183856231809598640313621938630669",
409                )
410                .unwrap(),
411                Fp::from_str(
412                    "6547073217674180994961882255834734219166276822047545566909303528752619346965",
413                )
414                .unwrap(),
415            ],
416            vec![
417                Fp::from_str(
418                    "9562418092642273301602927692306423921540755207933680809887955184175060412865",
419                )
420                .unwrap(),
421                Fp::from_str(
422                    "5728419725627720701717078886669712201564103341166911632619636881997293379662",
423                )
424                .unwrap(),
425                Fp::from_str(
426                    "9577751993330236726740958969117670757888267786661142736615315540557935073808",
427                )
428                .unwrap(),
429            ],
430            vec![
431                Fp::from_str(
432                    "18485877910552384007717083804696131794323032392196584185820990234315883649039",
433                )
434                .unwrap(),
435                Fp::from_str(
436                    "1769516528997465058766917692166940530540162775010485894812511264651123420964",
437                )
438                .unwrap(),
439                Fp::from_str(
440                    "386757200774461941643538807053842280717539800465562760112828539321993775241",
441                )
442                .unwrap(),
443            ],
444            vec![
445                Fp::from_str(
446                    "3316509296104361799525651631938052468498330218596415774527777363167138087617",
447                )
448                .unwrap(),
449                Fp::from_str(
450                    "13729336006888298565425261097968915916390598196131379830434588594171666569512",
451                )
452                .unwrap(),
453                Fp::from_str(
454                    "16148239410408669906403652096870758949643310812745307334909798696471189947927",
455                )
456                .unwrap(),
457            ],
458            vec![
459                Fp::from_str(
460                    "21823520381432477314141727574561655219860240640515827154913290917309686356497",
461                )
462                .unwrap(),
463                Fp::from_str(
464                    "4578651555280644323637866316527376720986123056791528481862274310799615790675",
465                )
466                .unwrap(),
467                Fp::from_str(
468                    "5091226074924237835610573037013208388130454756337337471122368918009398753447",
469                )
470                .unwrap(),
471            ],
472            vec![
473                Fp::from_str(
474                    "6515120964938381342071855012952056094433032260551298595194434149594056652176",
475                )
476                .unwrap(),
477                Fp::from_str(
478                    "2340842607486511800425610472421888578518367747461866490788654350550767741883",
479                )
480                .unwrap(),
481                Fp::from_str(
482                    "14503247487728138668651412383800848326991400373338038830652551371427345571441",
483                )
484                .unwrap(),
485            ],
486            vec![
487                Fp::from_str(
488                    "3712612816523606936094514234541515605991691986951168127960369409943944902903",
489                )
490                .unwrap(),
491                Fp::from_str(
492                    "1152766033584194531070871869834974085415579739949782153652057784926343256899",
493                )
494                .unwrap(),
495                Fp::from_str(
496                    "8765049913334393206963752695629450392338936491569237833753514286462581790561",
497                )
498                .unwrap(),
499            ],
500            vec![
501                Fp::from_str(
502                    "1601627912182619663670418257843886466719103377571015176803695116602531025179",
503                )
504                .unwrap(),
505                Fp::from_str(
506                    "18098024103033142368624034583201165961009040474643655548434700066455514231331",
507                )
508                .unwrap(),
509                Fp::from_str(
510                    "11268744383531850444109289654319779756413360261210505934077738062212630536901",
511                )
512                .unwrap(),
513            ],
514            vec![
515                Fp::from_str(
516                    "13295211045409383825433911169815486079945004241473963274225158733643991813121",
517                )
518                .unwrap(),
519                Fp::from_str(
520                    "10102619007330980171750476017504785290001093245315837544464105419145430593293",
521                )
522                .unwrap(),
523                Fp::from_str(
524                    "209066254001010781273163283043011468251658035504800687498237342325693440716",
525                )
526                .unwrap(),
527            ],
528            vec![
529                Fp::from_str(
530                    "10569794888394925789900696666438098928482919555802848731145904974932210713381",
531                )
532                .unwrap(),
533                Fp::from_str(
534                    "3479060041588228962773080916545344859794556889989789923050334615578110393377",
535                )
536                .unwrap(),
537                Fp::from_str(
538                    "8177920417424677597775227574376448009357347539898615178798501628859714007479",
539                )
540                .unwrap(),
541            ],
542            vec![
543                Fp::from_str(
544                    "12067616893727942346831314147294036302857666398663726324584342747296065928710",
545                )
546                .unwrap(),
547                Fp::from_str(
548                    "16971111464439978238379247781540292780056241741803063434856766170743124461469",
549                )
550                .unwrap(),
551                Fp::from_str(
552                    "19754437344667989781187357721513315145328407420825515279265102170857620051268",
553                )
554                .unwrap(),
555            ],
556            vec![
557                Fp::from_str(
558                    "3975594217367336645402283024719769072885792075344511606692741601510641156311",
559                )
560                .unwrap(),
561                Fp::from_str(
562                    "19040197452680989990741508256669934716515775259429067120683774529031109727966",
563                )
564                .unwrap(),
565                Fp::from_str(
566                    "5634578132978895965594894841292458192813357921721236220653749372316851034659",
567                )
568                .unwrap(),
569            ],
570            vec![
571                Fp::from_str(
572                    "18016203270230065093894089716032049117997200515456531317821733896468154005026",
573                )
574                .unwrap(),
575                Fp::from_str(
576                    "2432210503610876869795949218217418458948353953591635398452243060116570483824",
577                )
578                .unwrap(),
579                Fp::from_str(
580                    "13732529162121190544870742850789344400294092206745459683809641438775485491009",
581                )
582                .unwrap(),
583            ],
584            vec![
585                Fp::from_str(
586                    "14451766174292343678890357279454517773013585124369849119851032684103228653072",
587                )
588                .unwrap(),
589                Fp::from_str(
590                    "12181367175079876176988175575030826371836485595254655739186027469233503901695",
591                )
592                .unwrap(),
593                Fp::from_str(
594                    "10991645916339084020684503132290495819766466380987797648576877855177656702574",
595                )
596                .unwrap(),
597            ],
598            vec![
599                Fp::from_str(
600                    "21313503925572929158381750262537945058966279485804307864340280517601895617812",
601                )
602                .unwrap(),
603                Fp::from_str(
604                    "1550527311092834162328201290652099251984068161341884726521396319041776382263",
605                )
606                .unwrap(),
607                Fp::from_str(
608                    "12003435213367105899404267897476505638234793525266930670911913539817221417924",
609                )
610                .unwrap(),
611            ],
612            vec![
613                Fp::from_str(
614                    "8914436165324002549401721460186086215484314929358430322367050538121529812441",
615                )
616                .unwrap(),
617                Fp::from_str(
618                    "5912060284310139977854439979850774712081952153779342442587915555451388976602",
619                )
620                .unwrap(),
621                Fp::from_str(
622                    "18562577306045458592699989513868153553084370626914798022460227144415813035912",
623                )
624                .unwrap(),
625            ],
626            vec![
627                Fp::from_str(
628                    "3121108818032693608292705100552135299104657945137655223341160358361023747970",
629                )
630                .unwrap(),
631                Fp::from_str(
632                    "17009269623907524632744383402475624293106226516559465345873667100464648970276",
633                )
634                .unwrap(),
635                Fp::from_str(
636                    "16002511017673785381646235433633055570232704209925362749110958022614294680393",
637                )
638                .unwrap(),
639            ],
640            vec![
641                Fp::from_str(
642                    "9391205603129777266623979897548135033992809302803677537718465809304634939535",
643                )
644                .unwrap(),
645                Fp::from_str(
646                    "18388689572534660670130774712714127815208938853203887656653830866982720723174",
647                )
648                .unwrap(),
649                Fp::from_str(
650                    "5541548341946936547043936820389981449139467811019058131623682269330484215783",
651                )
652                .unwrap(),
653            ],
654            vec![
655                Fp::from_str(
656                    "7190170322642292762509602175876149041297305605840922902837779590457938918669",
657                )
658                .unwrap(),
659                Fp::from_str(
660                    "2027727849652978298961694136962688734430323753419089111303416976388312626148",
661                )
662                .unwrap(),
663                Fp::from_str(
664                    "402427768909234974448400451691124558802645007494232545425431267044631491274",
665                )
666                .unwrap(),
667            ],
668            vec![
669                Fp::from_str(
670                    "12797987239774923416407369376953974586493255155241527032821517134381740228905",
671                )
672                .unwrap(),
673                Fp::from_str(
674                    "13333249780205062899642181453873590081512016926206507817605750877019442371089",
675                )
676                .unwrap(),
677                Fp::from_str(
678                    "18589810567518770657334682134081256712119747946842941531219734231027968237759",
679                )
680                .unwrap(),
681            ],
682            vec![
683                Fp::from_str(
684                    "14776177603689091833670811465610858113310593319381602563122002687195119058247",
685                )
686                .unwrap(),
687                Fp::from_str(
688                    "8091773219661648644611506313794854881311037176009459530767471191252204309868",
689                )
690                .unwrap(),
691                Fp::from_str(
692                    "11572415535524327542083010017274275840592842320730873456621979565559067913733",
693                )
694                .unwrap(),
695            ],
696            vec![
697                Fp::from_str(
698                    "20923164127054504021838810951918321616973675807578349217848643497149066166007",
699                )
700                .unwrap(),
701                Fp::from_str(
702                    "13778673838153545444828783204107784921806288587132367999597554094415915790790",
703                )
704                .unwrap(),
705                Fp::from_str(
706                    "15824998809651622678290890820327874961632638426240138370022501121781103446259",
707                )
708                .unwrap(),
709            ],
710            vec![
711                Fp::from_str(
712                    "4090916114781784760754024121473951637398586212781078739533487486471895169595",
713                )
714                .unwrap(),
715                Fp::from_str(
716                    "960857870893264392654072242483170132703826969766439993624797963496069781505",
717                )
718                .unwrap(),
719                Fp::from_str(
720                    "20907571141369581631669592493277131511110363500792783458107745525298320150137",
721                )
722                .unwrap(),
723            ],
724            vec![
725                Fp::from_str(
726                    "12109635595469802832249294970134397092397779126665661972278751053960740447966",
727                )
728                .unwrap(),
729                Fp::from_str(
730                    "4824844368626589074800225473359998312724599509010698030845972726192270761413",
731                )
732                .unwrap(),
733                Fp::from_str(
734                    "1279633418489206280063439936145640252901253476940505080338091886704297503137",
735                )
736                .unwrap(),
737            ],
738            vec![
739                Fp::from_str(
740                    "13710991567078829309950552225511825775559273430088991705888338422645023107567",
741                )
742                .unwrap(),
743                Fp::from_str(
744                    "21744331847293235251226457402120455816051177980544192245842389157344912734176",
745                )
746                .unwrap(),
747                Fp::from_str(
748                    "13750456500419553884447154012886160987332428475286924998031161614878499276461",
749                )
750                .unwrap(),
751            ],
752            vec![
753                Fp::from_str(
754                    "7897870706671989949903359523135485593775134275719857967175422051001928288650",
755                )
756                .unwrap(),
757                Fp::from_str(
758                    "11530512859482871748707639867674853723860540856854102438746375696832108722419",
759                )
760                .unwrap(),
761                Fp::from_str(
762                    "15102320430753094455411262873908179792479117498565463936483853362951093377404",
763                )
764                .unwrap(),
765            ],
766            vec![
767                Fp::from_str(
768                    "20684012922073862986880613075424856809319565915848039596293835293542621074230",
769                )
770                .unwrap(),
771                Fp::from_str(
772                    "11143754623250183108051550852169137897571161411757151918630704123953225725876",
773                )
774                .unwrap(),
775                Fp::from_str(
776                    "21515833961121090836372549249533024521086358011705741464637998484545867651639",
777                )
778                .unwrap(),
779            ],
780            vec![
781                Fp::from_str(
782                    "14927367861301244473471972423309886137778884679987552642033604382283866452496",
783                )
784                .unwrap(),
785                Fp::from_str(
786                    "2234445563530370737450306710054836240206601416475326119659514396778117223266",
787                )
788                .unwrap(),
789                Fp::from_str(
790                    "7320243644229576716977260850447281726825012665363843781486677636270396893993",
791                )
792                .unwrap(),
793            ],
794            vec![
795                Fp::from_str(
796                    "3648709991731171089283528046834957511485556517829186374119154464357293936649",
797                )
798                .unwrap(),
799                Fp::from_str(
800                    "8431771340355225974834111903440269408389608143822442356390982704086190421477",
801                )
802                .unwrap(),
803                Fp::from_str(
804                    "850707530944871742730572985296454989068982533587676445405227892149682249460",
805                )
806                .unwrap(),
807            ],
808            vec![
809                Fp::from_str(
810                    "12770330711881918473357359607046064327068283622530828696564875920105463050911",
811                )
812                .unwrap(),
813                Fp::from_str(
814                    "18309438953837613260356082733742847603856465956586832431344593061564231402706",
815                )
816                .unwrap(),
817                Fp::from_str(
818                    "7558769148417330857693721923631008074203529622851527561622447590521963662006",
819                )
820                .unwrap(),
821            ],
822            vec![
823                Fp::from_str(
824                    "3817411164684956972519434296876841710387488302709712662164166985673595410943",
825                )
826                .unwrap(),
827                Fp::from_str(
828                    "14529667139169881031943219432572774573785882712681678612418006263967413092263",
829                )
830                .unwrap(),
831                Fp::from_str(
832                    "5591068111468958432601398487692727664831870363727501013569466045034798523918",
833                )
834                .unwrap(),
835            ],
836        ],
837    }
838}
839
840pub fn static_params() -> &'static ArithmeticSpongeParams<Fp> {
841    static PARAMS: Lazy<ArithmeticSpongeParams<Fp>> = Lazy::new(params);
842    &PARAMS
843}
844
845/// Constants used by the IVC circuit used by the folding scheme
846/// This is meant to be only used for the IVC circuit, with the BN254 curve
847/// It has not been tested with/for other curves.
848// This must be moved into mina_poseidon later.
849#[derive(Clone)]
850pub struct PlonkSpongeConstantsIVC {}
851
852impl SpongeConstants for PlonkSpongeConstantsIVC {
853    const SPONGE_CAPACITY: usize = 1;
854    const SPONGE_WIDTH: usize = 3;
855    const SPONGE_RATE: usize = 2;
856    const PERM_ROUNDS_FULL: usize = 55;
857    const PERM_ROUNDS_PARTIAL: usize = 0;
858    const PERM_HALF_ROUNDS_FULL: usize = 0;
859    const PERM_SBOX: u32 = 7;
860    const PERM_FULL_MDS: bool = true;
861    const PERM_INITIAL_ARK: bool = false;
862}
863
864#[cfg(test)]
865mod tests {
866    use core::str::FromStr;
867
868    use super::{static_params, PlonkSpongeConstantsIVC};
869    use ark_bn254::Fr as Fp;
870    use kimchi::o1_utils::FieldHelpers;
871    use mina_poseidon::poseidon::{ArithmeticSponge as Poseidon, Sponge as _};
872
873    // Regression tests. Test vectors have been generated using the same
874    // code, commit a1ad3f17b12baff62bc7fab6c0c4bacb704518d5
875    // This does not mean that the implementation is correct.
876    #[test]
877    fn test_poseidon() {
878        let mut hash = Poseidon::<Fp, PlonkSpongeConstantsIVC>::new(static_params());
879        let input: [Fp; 3] = [
880            Fp::from_str("1").unwrap(),
881            Fp::from_str("1").unwrap(),
882            Fp::from_str("1").unwrap(),
883        ];
884        let exp_output_str = [
885            "62838cdb9e91f1e85b450c1c45ccd220da17896083479d4879d520dc51ca390c",
886            "1dcb5390c0c61fc6c461043e5b1ae385faedb3d5a87c95f488bb851faca61f0a",
887            "fc0388532e2e38ec1e1402fbcf016a7954cf8fb6b6ba5739c7666aea7af42c29",
888        ];
889        let exp_output = exp_output_str.map(|x| Fp::from_hex(x).unwrap());
890        hash.absorb(&input);
891        assert_eq!(hash.state, exp_output);
892    }
893}