use crate::poseidon_8_56_5_3_2::columns::PoseidonColumn;
use ark_bn254::Fr;
use kimchi_msm::columns::ColumnIndexer;
use mina_poseidon::{constants::SpongeConstants, poseidon::ArithmeticSpongeParams};
use once_cell::sync::Lazy;
pub const STATE_SIZE: usize = 3;
pub const NB_FULL_ROUND: usize = 8;
pub const NB_PARTIAL_ROUND: usize = 56;
pub const NB_TOTAL_ROUND: usize = NB_FULL_ROUND + NB_PARTIAL_ROUND;
pub const NB_ROUND_CONSTANTS: usize = NB_TOTAL_ROUND * STATE_SIZE;
pub const NB_CONSTRAINTS: usize = 432;
pub const MAX_DEGREE: u64 = 2;
pub type Column = PoseidonColumn<STATE_SIZE, NB_FULL_ROUND, NB_PARTIAL_ROUND>;
pub const NB_COLUMNS: usize = Column::N_COL;
use std::str::FromStr;
use super::interpreter::PoseidonParams;
fn params() -> ArithmeticSpongeParams<Fr> {
ArithmeticSpongeParams {
mds: vec![
vec![
Fr::from_str(
"1891083243990574305685895570197511851713934835398236923905694056149924753068",
)
.unwrap(),
Fr::from_str(
"12425575093536208349525223497695086347893624421418924655002789600937388509542",
)
.unwrap(),
Fr::from_str(
"21738922686690608832323816580123167366266110538717945605098093992702895344376",
)
.unwrap(),
],
vec![
Fr::from_str(
"27684418222856506172738658695423428482598065952308803192811766786876275297242",
)
.unwrap(),
Fr::from_str(
"15829269591837939027267285551701704696044414402373072091502623580282737399890",
)
.unwrap(),
Fr::from_str(
"19252639924245456560245438416349235444106039029142654756933998759642658686319",
)
.unwrap(),
],
vec![
Fr::from_str(
"13569069999110563102763825881967666333546046803842950209911791358856018301650",
)
.unwrap(),
Fr::from_str(
"27981915092643975197764375502939826253878858038100319462170032597200154977862",
)
.unwrap(),
Fr::from_str(
"8885190793627186923687683451640133227063861709370969757580340555722307526098",
)
.unwrap(),
],
],
round_constants: vec![
vec![
Fr::from_str(
"22979498492811028599388207262497610781398114192113450876459774028198681978580",
)
.unwrap(),
Fr::from_str(
"3462163333362550903390325785926437039762839525013511939547720766741499409856",
)
.unwrap(),
Fr::from_str(
"12308193519164615772431903590941145851045953550307364845912877146027882177970",
)
.unwrap(),
],
vec![
Fr::from_str(
"26635724949260230089658132165964484272715279452239432758187323659534196378572",
)
.unwrap(),
Fr::from_str(
"16384206429233192859678459425673999470857159372638200975562270773516251379588",
)
.unwrap(),
Fr::from_str(
"19416611223573031732302519381697999456593181436167069017836818060955725864200",
)
.unwrap(),
],
vec![
Fr::from_str(
"27016929334480358351753199307567711107921448016886807295662950322547508172113",
)
.unwrap(),
Fr::from_str(
"11238098416885388471337306072943475212729724613485264776842071924751017567771",
)
.unwrap(),
Fr::from_str(
"26357617544526716389824924588303395055989615117170456588197310726656210667591",
)
.unwrap(),
],
vec![
Fr::from_str(
"13522402812268713007260660858020591835416325370361256561462576999381232564525",
)
.unwrap(),
Fr::from_str(
"17993297334719348473740719243191272244929728431491444848946396448123051191677",
)
.unwrap(),
Fr::from_str(
"14266894438972358618281326760350513234022317540856366683582613440301108328203",
)
.unwrap(),
],
vec![
Fr::from_str(
"15544565783214950187472074309645319815959207946976778588709413987755227716658",
)
.unwrap(),
Fr::from_str(
"11459281677950411823472431204851572448489387232119046190993717723024935465646",
)
.unwrap(),
Fr::from_str(
"21931774631910775084872817505478355551260333558147704485801041562136825822689",
)
.unwrap(),
],
vec![
Fr::from_str(
"23930462756185355677176913878440535939755511465091906422358167934102141974413",
)
.unwrap(),
Fr::from_str(
"24777337052169818536181344215824603464067642843117484360747523672092746770770",
)
.unwrap(),
Fr::from_str(
"9723694385274179134284666123116305587583263720877786033125569799811141709147",
)
.unwrap(),
],
vec![
Fr::from_str(
"21334124835555176052046135550571447667154056413650326169040093998967534013839",
)
.unwrap(),
Fr::from_str(
"28178412293035677936519661468561659327776642473949161402580740126141114716595",
)
.unwrap(),
Fr::from_str(
"23261949722991482098067992934452303478826592879142057585426055746184730329977",
)
.unwrap(),
],
vec![
Fr::from_str(
"7525745512005637899980788850937553026084357875660084470654426987818115307169",
)
.unwrap(),
Fr::from_str(
"11196989505533608046175719825672890499899138989727925138952469167443760521626",
)
.unwrap(),
Fr::from_str(
"25069470445604580535270406510013059947440356347927688567873255716571855782556",
)
.unwrap(),
],
vec![
Fr::from_str(
"746152031855445071661969786731764979416640168084300832548286844362915267733",
)
.unwrap(),
Fr::from_str(
"14500783258490511332342759610086566441467851535274198353685874901881586203920",
)
.unwrap(),
Fr::from_str(
"12586553744079534087671160799108871165444925427796015728451282191808004632029",
)
.unwrap(),
],
vec![
Fr::from_str(
"2658978799169405016067965116007625196452718808329137140199842584938385590196",
)
.unwrap(),
Fr::from_str(
"25980326596677328357808416201926774899770147152776274221261358547719778020156",
)
.unwrap(),
Fr::from_str(
"24508235842219447789227397734868597077124899664487104942155698316761683262563",
)
.unwrap(),
],
vec![
Fr::from_str(
"20191280011693017888798491354094094243127547574655352220297687980090230216",
)
.unwrap(),
Fr::from_str(
"27372133858594248121174511881254229698687209419322362469155503967311874023911",
)
.unwrap(),
Fr::from_str(
"24479529308646273673625530554247818183967069980890544961747034465992605211812",
)
.unwrap(),
],
vec![
Fr::from_str(
"23978441594464348354765134391283311312307598042652828493772997453014454901206",
)
.unwrap(),
Fr::from_str(
"11664556276797417846866489492418594702491171278433997565894976597592370230667",
)
.unwrap(),
Fr::from_str(
"12270771377697756787250169216048909236321853168489305289596185098410215090484",
)
.unwrap(),
],
vec![
Fr::from_str(
"8811136672424023763408452444568991590125177469609096631745680177504609711487",
)
.unwrap(),
Fr::from_str(
"20237676190929489436588870470052869226876887618934149899920104260655948094739",
)
.unwrap(),
Fr::from_str(
"20062974513054622329783259390735561568588514582980747668306658460292592667248",
)
.unwrap(),
],
vec![
Fr::from_str(
"798776603612212418444623010074034446472782213575824096964910597458981693714",
)
.unwrap(),
Fr::from_str(
"8758094627630360838980606896109464566485363275799929171438278126952202465833",
)
.unwrap(),
Fr::from_str(
"707487852423957926868336579455035906997963205205141270331975346408432067044",
)
.unwrap(),
],
vec![
Fr::from_str(
"202779927146339323474786313977213080711135813758190854284590663556011706836",
)
.unwrap(),
Fr::from_str(
"20391231297043803259194308176992776361609861855662006565804325535077866583400",
)
.unwrap(),
Fr::from_str(
"13103971641300442794695006804822894722919592148173662271765398624597649213516",
)
.unwrap(),
],
vec![
Fr::from_str(
"11887088560178314335635682366268022017575768082106271832073442174179560940002",
)
.unwrap(),
Fr::from_str(
"9497730497365106303373876625863922615426121795921218372965815099779016166015",
)
.unwrap(),
Fr::from_str(
"13255889376415173861282249540978269441170571583954046228817145377643690062643",
)
.unwrap(),
],
vec![
Fr::from_str(
"21797601683155849424606801821462621112628210830522816165936272187765788522806",
)
.unwrap(),
Fr::from_str(
"24581830980057907171669975479232671391615633395687956862981481636043684252818",
)
.unwrap(),
Fr::from_str(
"3541295787421703076701812027030126532836938797821201403520460081703194798007",
)
.unwrap(),
],
vec![
Fr::from_str(
"26648315008823981808527573963042312855617262185318718006368079643838521696342",
)
.unwrap(),
Fr::from_str(
"25709698375978466998813029191490908445909426399743598850530240905007542181236",
)
.unwrap(),
Fr::from_str(
"15108470522637839917783948187626705626608074131603801620229663133367773769409",
)
.unwrap(),
],
vec![
Fr::from_str(
"28021329994881905447188243064573681540852456674731988825066269508526569461230",
)
.unwrap(),
Fr::from_str(
"23931699377713654292108411755172835281506863304630736051021853367123546501725",
)
.unwrap(),
Fr::from_str(
"16723886233609641431662771575929234875591162154288587674425439500724219825212",
)
.unwrap(),
],
vec![
Fr::from_str(
"2671311012893846775573899497331547132295274951055892772678260375558714942406",
)
.unwrap(),
Fr::from_str(
"10473922685305341900412641696196941263307819634043185788067854748950602802383",
)
.unwrap(),
Fr::from_str(
"5111630741260296655990184310611375231177307348451724203930709456972805973880",
)
.unwrap(),
],
vec![
Fr::from_str(
"4992057345914438551815056581049158703461724962129889522457212594798779955393",
)
.unwrap(),
Fr::from_str(
"21183229986193453383825269196190741932488867108677665668392098260004852050858",
)
.unwrap(),
Fr::from_str(
"17083812614758825262603118558173710997332640429545889370504202808090339572857",
)
.unwrap(),
],
vec![
Fr::from_str(
"26920976402012774776865974353864956131500106517245044898291304474770065076213",
)
.unwrap(),
Fr::from_str(
"8733966472516018163838600897336665253176449185681528084604422362542186741640",
)
.unwrap(),
Fr::from_str(
"12872170036700590319474830060138441606481805188061693688276584984859227049202",
)
.unwrap(),
],
vec![
Fr::from_str(
"4477722790415428221489180851061526086953856916136558152290587660464310195129",
)
.unwrap(),
Fr::from_str(
"15013641992838646488575621859957900283128972996570425739867595472354843675113",
)
.unwrap(),
Fr::from_str(
"11110048915932820585149019832900719558018746589803602931460479672600239301992",
)
.unwrap(),
],
vec![
Fr::from_str(
"6386524788949068680243545386229548182250656575626566757865736117588702942149",
)
.unwrap(),
Fr::from_str(
"10817607938125396761228235991828983933462215897289776505148575850147631400593",
)
.unwrap(),
Fr::from_str(
"17865086662065068946652014543896618689007438069494510844490187921781045033543",
)
.unwrap(),
],
vec![
Fr::from_str(
"26739078526540815991525797409513121042395926527702073499652548281297625028042",
)
.unwrap(),
Fr::from_str(
"22105063856923216930774038075969680004134092465525615222672386192561909491643",
)
.unwrap(),
Fr::from_str(
"6547073217674180994961882255834734219166276822047545566909303528752619346965",
)
.unwrap(),
],
vec![
Fr::from_str(
"25888791229334359634310626508983935867495449391423881771352427385021616079608",
)
.unwrap(),
Fr::from_str(
"5728419725627720701717078886669712201564103341166911632619636881997293379662",
)
.unwrap(),
Fr::from_str(
"9577751993330236726740958969117670757888267786661142736615315540557935073808",
)
.unwrap(),
],
vec![
Fr::from_str(
"18485877910552384007717083804696131794323032392196584185820990234315883649039",
)
.unwrap(),
Fr::from_str(
"1769516528997465058766917692166940530540162775010485894812511264651123420964",
)
.unwrap(),
Fr::from_str(
"386757200774461941643538807053842280717539800465562760112828539321993775241",
)
.unwrap(),
],
vec![
Fr::from_str(
"3316509296104361799525651631938052468498330218596415774527777363167138087617",
)
.unwrap(),
Fr::from_str(
"13729336006888298565425261097968915916390598196131379830434588594171666569512",
)
.unwrap(),
Fr::from_str(
"16148239410408669906403652096870758949643310812745307334909798696471189947927",
)
.unwrap(),
],
vec![
Fr::from_str(
"21823520381432477314141727574561655219860240640515827154913290917309686356497",
)
.unwrap(),
Fr::from_str(
"28068200504050762109788374571880725807356066145249496235193375357140395644419",
)
.unwrap(),
Fr::from_str(
"5091226074924237835610573037013208388130454756337337471122368918009398753447",
)
.unwrap(),
],
vec![
Fr::from_str(
"6515120964938381342071855012952056094433032260551298595194434149594056652176",
)
.unwrap(),
Fr::from_str(
"2340842607486511800425610472421888578518367747461866490788654350550767741883",
)
.unwrap(),
Fr::from_str(
"28166492224976583257960903700053982900186421019635512376218580362545306276709",
)
.unwrap(),
],
vec![
Fr::from_str(
"3712612816523606936094514234541515605991691986951168127960369409943944902903",
)
.unwrap(),
Fr::from_str(
"1152766033584194531070871869834974085415579739949782153652057784926343256899",
)
.unwrap(),
Fr::from_str(
"8765049913334393206963752695629450392338936491569237833753514286462581790561",
)
.unwrap(),
],
vec![
Fr::from_str(
"1601627912182619663670418257843886466719103377571015176803695116602531025179",
)
.unwrap(),
Fr::from_str(
"18098024103033142368624034583201165961009040474643655548434700066455514231331",
)
.unwrap(),
Fr::from_str(
"21928220871250005366949251966887490261658471717243624436236070782233710958193",
)
.unwrap(),
],
vec![
Fr::from_str(
"13295211045409383825433911169815486079945004241473963274225158733643991813121",
)
.unwrap(),
Fr::from_str(
"10102619007330980171750476017504785290001093245315837544464105419145430593293",
)
.unwrap(),
Fr::from_str(
"209066254001010781273163283043011468251658035504800687498237342325693440716",
)
.unwrap(),
],
vec![
Fr::from_str(
"10569794888394925789900696666438098928482919555802848731145904974932210713381",
)
.unwrap(),
Fr::from_str(
"24519507563490032456526532812360147850362262124850480124499654753387364654494",
)
.unwrap(),
Fr::from_str(
"8177920417424677597775227574376448009357347539898615178798501628859714007479",
)
.unwrap(),
],
vec![
Fr::from_str(
"12067616893727942346831314147294036302857666398663726324584342747296065928710",
)
.unwrap(),
Fr::from_str(
"16971111464439978238379247781540292780056241741803063434856766170743124461469",
)
.unwrap(),
Fr::from_str(
"19754437344667989781187357721513315145328407420825515279265102170857620051268",
)
.unwrap(),
],
vec![
Fr::from_str(
"3975594217367336645402283024719769072885792075344511606692741601510641156311",
)
.unwrap(),
Fr::from_str(
"19040197452680989990741508256669934716515775259429067120683774529031109727966",
)
.unwrap(),
Fr::from_str(
"5634578132978895965594894841292458192813357921721236220653749372316851034659",
)
.unwrap(),
],
vec![
Fr::from_str(
"24312649336217150643502647288233882695985124865143983808786503810476675628308",
)
.unwrap(),
Fr::from_str(
"26190380549799665209932387790089553938565301230293821415792947418738438572475",
)
.unwrap(),
Fr::from_str(
"28207972947754207739680139011960703172165585550947706768480292386338937193745",
)
.unwrap(),
],
vec![
Fr::from_str(
"14451766174292343678890357279454517773013585124369849119851032684103228653072",
)
.unwrap(),
Fr::from_str(
"12181367175079876176988175575030826371836485595254655739186027469233503901695",
)
.unwrap(),
Fr::from_str(
"10991645916339084020684503132290495819766466380987797648576877855177656702574",
)
.unwrap(),
],
vec![
Fr::from_str(
"21313503925572929158381750262537945058966279485804307864340280517601895617812",
)
.unwrap(),
Fr::from_str(
"1550527311092834162328201290652099251984068161341884726521396319041776382263",
)
.unwrap(),
Fr::from_str(
"12003435213367105899404267897476505638234793525266930670911913539817221417924",
)
.unwrap(),
],
vec![
Fr::from_str(
"8914436165324002549401721460186086215484314929358430322367050538121529812441",
)
.unwrap(),
Fr::from_str(
"27832471390260088958712195064264693263013262224866234154815027609517686567070",
)
.unwrap(),
Fr::from_str(
"21985130074442575837699661478687045882883906445505825293630722207419298642563",
)
.unwrap(),
],
vec![
Fr::from_str(
"3121108818032693608292705100552135299104657945137655223341160358361023747970",
)
.unwrap(),
Fr::from_str(
"27854040945265461368879245943811705519815133202941163906839617464472048050107",
)
.unwrap(),
Fr::from_str(
"16002511017673785381646235433633055570232704209925362749110958022614294680393",
)
.unwrap(),
],
vec![
Fr::from_str(
"9391205603129777266623979897548135033992809302803677537718465809304634939535",
)
.unwrap(),
Fr::from_str(
"24297079789956858850141557550669917040800093660605463170583536807967359376943",
)
.unwrap(),
Fr::from_str(
"5541548341946936547043936820389981449139467811019058131623682269330484215783",
)
.unwrap(),
],
vec![
Fr::from_str(
"7190170322642292762509602175876149041297305605840922902837779590457938918669",
)
.unwrap(),
Fr::from_str(
"2027727849652978298961694136962688734430323753419089111303416976388312626148",
)
.unwrap(),
Fr::from_str(
"402427768909234974448400451691124558802645007494232545425431267044631491274",
)
.unwrap(),
],
vec![
Fr::from_str(
"12797987239774923416407369376953974586493255155241527032821517134381740228905",
)
.unwrap(),
Fr::from_str(
"13333249780205062899642181453873590081512016926206507817605750877019442371089",
)
.unwrap(),
Fr::from_str(
"22188565325128643960736450273241242961083822226450593824571763485758109842353",
)
.unwrap(),
],
vec![
Fr::from_str(
"14776177603689091833670811465610858113310593319381602563122002687195119058247",
)
.unwrap(),
Fr::from_str(
"8091773219661648644611506313794854881311037176009459530767471191252204309868",
)
.unwrap(),
Fr::from_str(
"11572415535524327542083010017274275840592842320730873456621979565559067913733",
)
.unwrap(),
],
vec![
Fr::from_str(
"20923164127054504021838810951918321616973675807578349217848643497149066166007",
)
.unwrap(),
Fr::from_str(
"23916764349365855067645867029751406599241457684665189633084153863091374186634",
)
.unwrap(),
Fr::from_str(
"15824998809651622678290890820327874961632638426240138370022501121781103446259",
)
.unwrap(),
],
vec![
Fr::from_str(
"24637783239914661001463701818528140355269066399069119799243934837974141806351",
)
.unwrap(),
Fr::from_str(
"960857870893264392654072242483170132703826969766439993624797963496069781505",
)
.unwrap(),
Fr::from_str(
"26437805484456742255124383441148924774337202744224954418128369699282030985816",
)
.unwrap(),
],
vec![
Fr::from_str(
"26578738662896906130683946198236194771349279034514315009985381494637755178012",
)
.unwrap(),
Fr::from_str(
"4824844368626589074800225473359998312724599509010698030845972726192270761413",
)
.unwrap(),
Fr::from_str(
"1279633418489206280063439936145640252901253476940505080338091886704297503137",
)
.unwrap(),
],
vec![
Fr::from_str(
"13710991567078829309950552225511825775559273430088991705888338422645023107567",
)
.unwrap(),
Fr::from_str(
"24668872485331698368369872321174853677667368883929365377153552889902839876059",
)
.unwrap(),
Fr::from_str(
"13750456500419553884447154012886160987332428475286924998031161614878499276461",
)
.unwrap(),
],
vec![
Fr::from_str(
"7897870706671989949903359523135485593775134275719857967175422051001928288650",
)
.unwrap(),
Fr::from_str(
"24837463715854409438259925936940667100471584776258950891486907118659586222782",
)
.unwrap(),
Fr::from_str(
"15102320430753094455411262873908179792479117498565463936483853362951093377404",
)
.unwrap(),
],
vec![
Fr::from_str(
"20684012922073862986880613075424856809319565915848039596293835293542621074230",
)
.unwrap(),
Fr::from_str(
"27853137663239148089212917142958191707337132972791514344244938292818076156215",
)
.unwrap(),
Fr::from_str(
"21515833961121090836372549249533024521086358011705741464637998484545867651639",
)
.unwrap(),
],
vec![
Fr::from_str(
"14927367861301244473471972423309886137778884679987552642033604382283866452496",
)
.unwrap(),
Fr::from_str(
"2234445563530370737450306710054836240206601416475326119659514396778117223266",
)
.unwrap(),
Fr::from_str(
"7320243644229576716977260850447281726825012665363843781486677636270396893993",
)
.unwrap(),
],
vec![
Fr::from_str(
"3648709991731171089283528046834957511485556517829186374119154464357293936649",
)
.unwrap(),
Fr::from_str(
"8431771340355225974834111903440269408389608143822442356390982704086190421477",
)
.unwrap(),
Fr::from_str(
"850707530944871742730572985296454989068982533587676445405227892149682249460",
)
.unwrap(),
],
vec![
Fr::from_str(
"27968558232222653455324053739339866927384509292992637407525622495221665748064",
)
.unwrap(),
Fr::from_str(
"18309438953837613260356082733742847603856465956586832431344593061564231402706",
)
.unwrap(),
Fr::from_str(
"7558769148417330857693721923631008074203529622851527561622447590521963662006",
)
.unwrap(),
],
vec![
Fr::from_str(
"3817411164684956972519434296876841710387488302709712662164166985673595410943",
)
.unwrap(),
Fr::from_str(
"14529667139169881031943219432572774573785882712681678612418006263967413092263",
)
.unwrap(),
Fr::from_str(
"23218827447973479235173323744034317336035671404247548580906272331188785389688",
)
.unwrap(),
],
vec![
Fr::from_str(
"8651801510810146025412974160945288620309458551124978671355372318440299892446",
)
.unwrap(),
Fr::from_str(
"22421908295524355984007285617835206887162355421815299667252838830702546015133",
)
.unwrap(),
Fr::from_str(
"7160018919593574320964537152208736524155714355508700340218764463887638143455",
)
.unwrap(),
],
vec![
Fr::from_str(
"723350002648579254243598219836182385851624402483518972524433485600657018308",
)
.unwrap(),
Fr::from_str(
"1424479715330663945471022437902357236141169107604243794548089122048400883402",
)
.unwrap(),
Fr::from_str(
"12380316486623809861878214203281027877179803297952235333898818121693577083127",
)
.unwrap(),
],
vec![
Fr::from_str(
"13300264762908838749047406324479200233395191915779570411502803795135456010503",
)
.unwrap(),
Fr::from_str(
"7182708579311809518589613836995895145881239038123095258480613105900991785981",
)
.unwrap(),
Fr::from_str(
"3399116840288437658533170746195011940616209443265644590911430680876206950690",
)
.unwrap(),
],
vec![
Fr::from_str(
"18075677167539342788969842697404710734192919515624038738684304089341638962797",
)
.unwrap(),
Fr::from_str(
"774916241389256067817357617190556955727339372170470123567430330174958764878",
)
.unwrap(),
Fr::from_str(
"23911159648093593276293911909659625889333565386584216455353262739940352889672",
)
.unwrap(),
],
vec![
Fr::from_str(
"7861494016510010234313534888968189516898452462977986982488816163397319727747",
)
.unwrap(),
Fr::from_str(
"15072759186032286031690480130876158018121236234681552923585561011002205274233",
)
.unwrap(),
Fr::from_str(
"13329814760549908430040494615924435617177143177522675259969178808824256694834",
)
.unwrap(),
],
vec![
Fr::from_str(
"7468723007810503327553686337411634190912418400882277241712552524430599692675",
)
.unwrap(),
Fr::from_str(
"11304437011528059451078980881777692033687950145258622992372151025965772625841",
)
.unwrap(),
Fr::from_str(
"24455414907879354554658170783358918522990892444576704866381766190660412826213",
)
.unwrap(),
],
vec![
Fr::from_str(
"4123473255827760339537832283192656514249000347603384170048044945751397547862",
)
.unwrap(),
Fr::from_str(
"13177230660974899915401210507892129885856976090284825863072745642109312338203",
)
.unwrap(),
Fr::from_str(
"28859805634412811444238562480326194712347893192568982315953124889109926907412",
)
.unwrap(),
],
vec![
Fr::from_str(
"7803019375719168318963557398085369618684087162676370220706203244371827257508",
)
.unwrap(),
Fr::from_str(
"4029922906086312393665000628450269927106443351493821364980763691551262280792",
)
.unwrap(),
Fr::from_str(
"11158633081229897821908038161319320155864649742858460176817619070002508020544",
)
.unwrap(),
],
vec![
Fr::from_str(
"18052059944752105394121061539214545921115313064660268801792496020636120990680",
)
.unwrap(),
Fr::from_str(
"28815470454875236045606443537792333795118166510830397224364317235056781483845",
)
.unwrap(),
Fr::from_str(
"8678824483470329866907826063438633160791886719100084683778994189652170993635",
)
.unwrap(),
],
],
}
}
pub fn static_params() -> &'static ArithmeticSpongeParams<Fr> {
static PARAMS: Lazy<ArithmeticSpongeParams<Fr>> = Lazy::new(params);
&PARAMS
}
#[derive(Clone)]
pub struct PlonkSpongeConstantsIVC {}
impl SpongeConstants for PlonkSpongeConstantsIVC {
const SPONGE_CAPACITY: usize = 1;
const SPONGE_WIDTH: usize = 3;
const SPONGE_RATE: usize = 2;
const PERM_ROUNDS_FULL: usize = 0;
const PERM_ROUNDS_PARTIAL: usize = 56;
const PERM_HALF_ROUNDS_FULL: usize = 4;
const PERM_SBOX: u32 = 5;
const PERM_FULL_MDS: bool = true;
const PERM_INITIAL_ARK: bool = false;
}
pub struct PoseidonBN254Parameters;
impl PoseidonParams<Fr, STATE_SIZE, NB_TOTAL_ROUND> for PoseidonBN254Parameters {
fn constants(&self) -> [[Fr; STATE_SIZE]; NB_TOTAL_ROUND] {
let rc = &static_params().round_constants;
std::array::from_fn(|i| std::array::from_fn(|j| Fr::from(rc[i][j])))
}
fn mds(&self) -> [[Fr; STATE_SIZE]; STATE_SIZE] {
let mds = &static_params().mds;
std::array::from_fn(|i| std::array::from_fn(|j| Fr::from(mds[i][j])))
}
}
#[cfg(test)]
mod tests {
use std::str::FromStr;
use super::{static_params, PlonkSpongeConstantsIVC};
use ark_bn254::Fr;
use kimchi::o1_utils::FieldHelpers;
use mina_poseidon::poseidon::{ArithmeticSponge as Poseidon, Sponge as _};
#[test]
fn test_poseidon() {
let mut hash = Poseidon::<Fr, PlonkSpongeConstantsIVC>::new(static_params());
let input: [Fr; 3] = [
Fr::from_str("1").unwrap(),
Fr::from_str("1").unwrap(),
Fr::from_str("1").unwrap(),
];
let exp_output_str = [
"05c09e2e5cf67833f4987c3011ae8c754b70dd8c28cbb619b421e012fad87c16",
"14b598974e69d9cbee4c6b809256152552ec6c008e59f5fe54f60491d8286c23",
"54e82d762fe2994c85fb4d4e1b22cb060b005327bba4265e486e82ae0c2a7125",
];
let exp_output = exp_output_str.map(|x| Fr::from_hex(x).unwrap());
hash.absorb(&input);
assert_eq!(hash.state, exp_output);
}
}