use ark_bn254::Fr as Fp;
use mina_poseidon::{constants::SpongeConstants, poseidon::ArithmeticSpongeParams};
use once_cell::sync::Lazy;
use std::str::FromStr;
fn params() -> ArithmeticSpongeParams<Fp> {
ArithmeticSpongeParams {
mds: vec![
vec![
Fp::from_str(
"18254759465961548724473677898900554279129333700345398792534035897544813417380",
)
.unwrap(),
Fp::from_str(
"9701727079493493822153587075727161870060130406601968554920630310837077525782",
)
.unwrap(),
Fp::from_str(
"6448075384674872988709285295252735647564764677180219427814076333498731944341",
)
.unwrap(),
],
vec![
Fp::from_str(
"10582678689390677133753881397356982896844997242148790399395649637165847896125",
)
.unwrap(),
Fp::from_str(
"14953878658754362056567950679445798963011901944940518481654524320703963311366",
)
.unwrap(),
Fp::from_str(
"2769559556749664962636128855242028623701912278738796979170458933982658616355",
)
.unwrap(),
],
vec![
Fp::from_str(
"11085432328429990699367643357327464988188253029150852680916595311968413759302",
)
.unwrap(),
Fp::from_str(
"6616328759095010539674576883698535512612418243442338373652055842385579197823",
)
.unwrap(),
Fp::from_str(
"1788173826467567565151305865636675972489937758217944451266517527454717587391",
)
.unwrap(),
],
],
round_constants: vec![
vec![
Fp::from_str(
"464317818058904040455944620932325370057318211982758073789794737262512069860",
)
.unwrap(),
Fp::from_str(
"3462163333362550903390325785926437039762839525013511939547720766741499409856",
)
.unwrap(),
Fp::from_str(
"12308193519164615772431903590941145851045953550307364845912877146027882177970",
)
.unwrap(),
],
vec![
Fp::from_str(
"2714591816949287658718284157908523280274340884728966119095559324137312851163",
)
.unwrap(),
Fp::from_str(
"16384206429233192859678459425673999470857159372638200975562270773516251379588",
)
.unwrap(),
Fp::from_str(
"19416611223573031732302519381697999456593181436167069017836818060955725864200",
)
.unwrap(),
],
vec![
Fp::from_str(
"17603455420764872031698321921973319158461544396609704072026904164018868607752",
)
.unwrap(),
Fp::from_str(
"11238098416885388471337306072943475212729724613485264776842071924751017567771",
)
.unwrap(),
Fp::from_str(
"20115085162632036284496420664439046277270577640351232755593699800626568913281",
)
.unwrap(),
],
vec![
Fp::from_str(
"13522402812268713007260660858020591835416325370361256561462576999381232564525",
)
.unwrap(),
Fp::from_str(
"17993297334719348473740719243191272244929728431491444848946396448123051191677",
)
.unwrap(),
Fp::from_str(
"14266894438972358618281326760350513234022317540856366683582613440301108328203",
)
.unwrap(),
],
vec![
Fp::from_str(
"15544565783214950187472074309645319815959207946976778588709413987755227716658",
)
.unwrap(),
Fp::from_str(
"11459281677950411823472431204851572448489387232119046190993717723024935465646",
)
.unwrap(),
Fp::from_str(
"3175427723782491063823141004980187933184665826684252846205862234135139398026",
)
.unwrap(),
],
vec![
Fp::from_str(
"18104087100840279413272173524166428384373648597907924300377376914338365801413",
)
.unwrap(),
Fp::from_str(
"11059348970814019325544810642103429754398805409212413029570905399054361253560",
)
.unwrap(),
Fp::from_str(
"9723694385274179134284666123116305587583263720877786033125569799811141709147",
)
.unwrap(),
],
vec![
Fp::from_str(
"21334124835555176052046135550571447667154056413650326169040093998967534013839",
)
.unwrap(),
Fp::from_str(
"13186187149295477383503606350078912331255804347098276303051944780008615958248",
)
.unwrap(),
Fp::from_str(
"1470033952086888296713916393108192307114009370637357884278948695504654950262",
)
.unwrap(),
],
vec![
Fp::from_str(
"7525745512005637899980788850937553026084357875660084470654426987818115307169",
)
.unwrap(),
Fp::from_str(
"11196989505533608046175719825672890499899138989727925138952469167443760521626",
)
.unwrap(),
Fp::from_str(
"9101167944054900479650446113089291293767218643046467434823338481469624077969",
)
.unwrap(),
],
vec![
Fp::from_str(
"746152031855445071661969786731764979416640168084300832548286844362915267733",
)
.unwrap(),
Fp::from_str(
"14500783258490511332342759610086566441467851535274198353685874901881586203920",
)
.unwrap(),
Fp::from_str(
"12586553744079534087671160799108871165444925427796015728451282191808004632029",
)
.unwrap(),
],
vec![
Fp::from_str(
"2658978799169405016067965116007625196452718808329137140199842584938385590196",
)
.unwrap(),
Fp::from_str(
"14945177760821130319202365009462588707535813273905143480365649428853002471274",
)
.unwrap(),
Fp::from_str(
"17059544527948691563140405641038225702602878092594471881549757285581285907208",
)
.unwrap(),
],
vec![
Fp::from_str(
"20191280011693017888798491354094094243127547574655352220297687980090230216",
)
.unwrap(),
Fp::from_str(
"18502499034030581022389564056073081062360187604161458073890564428974602584477",
)
.unwrap(),
Fp::from_str(
"8264062626605956514525302888463961111763485965406820048999276299668892074923",
)
.unwrap(),
],
vec![
Fp::from_str(
"10792209418985110179364134772680195398048938179898831723416765403620730620462",
)
.unwrap(),
Fp::from_str(
"11664556276797417846866489492418594702491171278433997565894976597592370230667",
)
.unwrap(),
Fp::from_str(
"12270771377697756787250169216048909236321853168489305289596185098410215090484",
)
.unwrap(),
],
vec![
Fp::from_str(
"8811136672424023763408452444568991590125177469609096631745680177504609711487",
)
.unwrap(),
Fp::from_str(
"20237676190929489436588870470052869226876887618934149899920104260655948094739",
)
.unwrap(),
Fp::from_str(
"20062974513054622329783259390735561568588514582980747668306658460292592667248",
)
.unwrap(),
],
vec![
Fp::from_str(
"798776603612212418444623010074034446472782213575824096964910597458981693714",
)
.unwrap(),
Fp::from_str(
"8758094627630360838980606896109464566485363275799929171438278126952202465833",
)
.unwrap(),
Fp::from_str(
"707487852423957926868336579455035906997963205205141270331975346408432067044",
)
.unwrap(),
],
vec![
Fp::from_str(
"202779927146339323474786313977213080711135813758190854284590663556011706836",
)
.unwrap(),
Fp::from_str(
"20391231297043803259194308176992776361609861855662006565804325535077866583400",
)
.unwrap(),
Fp::from_str(
"13103971641300442794695006804822894722919592148173662271765398624597649213516",
)
.unwrap(),
],
vec![
Fp::from_str(
"11887088560178314335635682366268022017575768082106271832073442174179560940002",
)
.unwrap(),
Fp::from_str(
"9497730497365106303373876625863922615426121795921218372965815099779016166015",
)
.unwrap(),
Fp::from_str(
"13255889376415173861282249540978269441170571583954046228817145377643690062643",
)
.unwrap(),
],
vec![
Fp::from_str(
"21797601683155849424606801821462621112628210830522816165936272187765788522806",
)
.unwrap(),
Fp::from_str(
"13791904812004141351280616602806766268926714029237345281809436730651246516674",
)
.unwrap(),
Fp::from_str(
"3541295787421703076701812027030126532836938797821201403520460081703194798007",
)
.unwrap(),
],
vec![
Fp::from_str(
"6772295061598565998757352284489337907928739308702535748450215960170676319556",
)
.unwrap(),
Fp::from_str(
"19608658591798530616680061208581311706541541564609366646372793300896320095218",
)
.unwrap(),
Fp::from_str(
"15108470522637839917783948187626705626608074131603801620229663133367773769409",
)
.unwrap(),
],
vec![
Fp::from_str(
"6982167525494887125745884237873629770460477859443352710958203128353080003941",
)
.unwrap(),
Fp::from_str(
"7877853416249147253292651939679543007752875545630493492558173940354891685347",
)
.unwrap(),
Fp::from_str(
"16723886233609641431662771575929234875591162154288587674425439500724219825212",
)
.unwrap(),
],
vec![
Fp::from_str(
"2671311012893846775573899497331547132295274951055892772678260375558714942406",
)
.unwrap(),
Fp::from_str(
"10473922685305341900412641696196941263307819634043185788067854748950602802383",
)
.unwrap(),
Fp::from_str(
"5111630741260296655990184310611375231177307348451724203930709456972805973880",
)
.unwrap(),
],
vec![
Fp::from_str(
"4992057345914438551815056581049158703461724962129889522457212594798779955393",
)
.unwrap(),
Fp::from_str(
"21183229986193453383825269196190741932488867108677665668392098260004852050858",
)
.unwrap(),
Fp::from_str(
"17083812614758825262603118558173710997332640429545889370504202808090339572857",
)
.unwrap(),
],
vec![
Fp::from_str(
"18125355879021821849041167225185950892076210587475775745349215815478764407922",
)
.unwrap(),
Fp::from_str(
"8733966472516018163838600897336665253176449185681528084604422362542186741640",
)
.unwrap(),
Fp::from_str(
"12872170036700590319474830060138441606481805188061693688276584984859227049202",
)
.unwrap(),
],
vec![
Fp::from_str(
"4477722790415428221489180851061526086953856916136558152290587660464310195129",
)
.unwrap(),
Fp::from_str(
"15013641992838646488575621859957900283128972996570425739867595472354843675113",
)
.unwrap(),
Fp::from_str(
"11110048915932820585149019832900719558018746589803602931460479672600239301992",
)
.unwrap(),
],
vec![
Fp::from_str(
"6386524788949068680243545386229548182250656575626566757865736117588702942149",
)
.unwrap(),
Fp::from_str(
"10817607938125396761228235991828983933462215897289776505148575850147631400593",
)
.unwrap(),
Fp::from_str(
"17865086662065068946652014543896618689007438069494510844490187921781045033543",
)
.unwrap(),
],
vec![
Fp::from_str(
"21842035812228593226084835552836653742808044145939024628842446854237127923353",
)
.unwrap(),
Fp::from_str(
"2471068742343144756503096572812849495213874183856231809598640313621938630669",
)
.unwrap(),
Fp::from_str(
"6547073217674180994961882255834734219166276822047545566909303528752619346965",
)
.unwrap(),
],
vec![
Fp::from_str(
"9562418092642273301602927692306423921540755207933680809887955184175060412865",
)
.unwrap(),
Fp::from_str(
"5728419725627720701717078886669712201564103341166911632619636881997293379662",
)
.unwrap(),
Fp::from_str(
"9577751993330236726740958969117670757888267786661142736615315540557935073808",
)
.unwrap(),
],
vec![
Fp::from_str(
"18485877910552384007717083804696131794323032392196584185820990234315883649039",
)
.unwrap(),
Fp::from_str(
"1769516528997465058766917692166940530540162775010485894812511264651123420964",
)
.unwrap(),
Fp::from_str(
"386757200774461941643538807053842280717539800465562760112828539321993775241",
)
.unwrap(),
],
vec![
Fp::from_str(
"3316509296104361799525651631938052468498330218596415774527777363167138087617",
)
.unwrap(),
Fp::from_str(
"13729336006888298565425261097968915916390598196131379830434588594171666569512",
)
.unwrap(),
Fp::from_str(
"16148239410408669906403652096870758949643310812745307334909798696471189947927",
)
.unwrap(),
],
vec![
Fp::from_str(
"21823520381432477314141727574561655219860240640515827154913290917309686356497",
)
.unwrap(),
Fp::from_str(
"4578651555280644323637866316527376720986123056791528481862274310799615790675",
)
.unwrap(),
Fp::from_str(
"5091226074924237835610573037013208388130454756337337471122368918009398753447",
)
.unwrap(),
],
vec![
Fp::from_str(
"6515120964938381342071855012952056094433032260551298595194434149594056652176",
)
.unwrap(),
Fp::from_str(
"2340842607486511800425610472421888578518367747461866490788654350550767741883",
)
.unwrap(),
Fp::from_str(
"14503247487728138668651412383800848326991400373338038830652551371427345571441",
)
.unwrap(),
],
vec![
Fp::from_str(
"3712612816523606936094514234541515605991691986951168127960369409943944902903",
)
.unwrap(),
Fp::from_str(
"1152766033584194531070871869834974085415579739949782153652057784926343256899",
)
.unwrap(),
Fp::from_str(
"8765049913334393206963752695629450392338936491569237833753514286462581790561",
)
.unwrap(),
],
vec![
Fp::from_str(
"1601627912182619663670418257843886466719103377571015176803695116602531025179",
)
.unwrap(),
Fp::from_str(
"18098024103033142368624034583201165961009040474643655548434700066455514231331",
)
.unwrap(),
Fp::from_str(
"11268744383531850444109289654319779756413360261210505934077738062212630536901",
)
.unwrap(),
],
vec![
Fp::from_str(
"13295211045409383825433911169815486079945004241473963274225158733643991813121",
)
.unwrap(),
Fp::from_str(
"10102619007330980171750476017504785290001093245315837544464105419145430593293",
)
.unwrap(),
Fp::from_str(
"209066254001010781273163283043011468251658035504800687498237342325693440716",
)
.unwrap(),
],
vec![
Fp::from_str(
"10569794888394925789900696666438098928482919555802848731145904974932210713381",
)
.unwrap(),
Fp::from_str(
"3479060041588228962773080916545344859794556889989789923050334615578110393377",
)
.unwrap(),
Fp::from_str(
"8177920417424677597775227574376448009357347539898615178798501628859714007479",
)
.unwrap(),
],
vec![
Fp::from_str(
"12067616893727942346831314147294036302857666398663726324584342747296065928710",
)
.unwrap(),
Fp::from_str(
"16971111464439978238379247781540292780056241741803063434856766170743124461469",
)
.unwrap(),
Fp::from_str(
"19754437344667989781187357721513315145328407420825515279265102170857620051268",
)
.unwrap(),
],
vec![
Fp::from_str(
"3975594217367336645402283024719769072885792075344511606692741601510641156311",
)
.unwrap(),
Fp::from_str(
"19040197452680989990741508256669934716515775259429067120683774529031109727966",
)
.unwrap(),
Fp::from_str(
"5634578132978895965594894841292458192813357921721236220653749372316851034659",
)
.unwrap(),
],
vec![
Fp::from_str(
"18016203270230065093894089716032049117997200515456531317821733896468154005026",
)
.unwrap(),
Fp::from_str(
"2432210503610876869795949218217418458948353953591635398452243060116570483824",
)
.unwrap(),
Fp::from_str(
"13732529162121190544870742850789344400294092206745459683809641438775485491009",
)
.unwrap(),
],
vec![
Fp::from_str(
"14451766174292343678890357279454517773013585124369849119851032684103228653072",
)
.unwrap(),
Fp::from_str(
"12181367175079876176988175575030826371836485595254655739186027469233503901695",
)
.unwrap(),
Fp::from_str(
"10991645916339084020684503132290495819766466380987797648576877855177656702574",
)
.unwrap(),
],
vec![
Fp::from_str(
"21313503925572929158381750262537945058966279485804307864340280517601895617812",
)
.unwrap(),
Fp::from_str(
"1550527311092834162328201290652099251984068161341884726521396319041776382263",
)
.unwrap(),
Fp::from_str(
"12003435213367105899404267897476505638234793525266930670911913539817221417924",
)
.unwrap(),
],
vec![
Fp::from_str(
"8914436165324002549401721460186086215484314929358430322367050538121529812441",
)
.unwrap(),
Fp::from_str(
"5912060284310139977854439979850774712081952153779342442587915555451388976602",
)
.unwrap(),
Fp::from_str(
"18562577306045458592699989513868153553084370626914798022460227144415813035912",
)
.unwrap(),
],
vec![
Fp::from_str(
"3121108818032693608292705100552135299104657945137655223341160358361023747970",
)
.unwrap(),
Fp::from_str(
"17009269623907524632744383402475624293106226516559465345873667100464648970276",
)
.unwrap(),
Fp::from_str(
"16002511017673785381646235433633055570232704209925362749110958022614294680393",
)
.unwrap(),
],
vec![
Fp::from_str(
"9391205603129777266623979897548135033992809302803677537718465809304634939535",
)
.unwrap(),
Fp::from_str(
"18388689572534660670130774712714127815208938853203887656653830866982720723174",
)
.unwrap(),
Fp::from_str(
"5541548341946936547043936820389981449139467811019058131623682269330484215783",
)
.unwrap(),
],
vec![
Fp::from_str(
"7190170322642292762509602175876149041297305605840922902837779590457938918669",
)
.unwrap(),
Fp::from_str(
"2027727849652978298961694136962688734430323753419089111303416976388312626148",
)
.unwrap(),
Fp::from_str(
"402427768909234974448400451691124558802645007494232545425431267044631491274",
)
.unwrap(),
],
vec![
Fp::from_str(
"12797987239774923416407369376953974586493255155241527032821517134381740228905",
)
.unwrap(),
Fp::from_str(
"13333249780205062899642181453873590081512016926206507817605750877019442371089",
)
.unwrap(),
Fp::from_str(
"18589810567518770657334682134081256712119747946842941531219734231027968237759",
)
.unwrap(),
],
vec![
Fp::from_str(
"14776177603689091833670811465610858113310593319381602563122002687195119058247",
)
.unwrap(),
Fp::from_str(
"8091773219661648644611506313794854881311037176009459530767471191252204309868",
)
.unwrap(),
Fp::from_str(
"11572415535524327542083010017274275840592842320730873456621979565559067913733",
)
.unwrap(),
],
vec![
Fp::from_str(
"20923164127054504021838810951918321616973675807578349217848643497149066166007",
)
.unwrap(),
Fp::from_str(
"13778673838153545444828783204107784921806288587132367999597554094415915790790",
)
.unwrap(),
Fp::from_str(
"15824998809651622678290890820327874961632638426240138370022501121781103446259",
)
.unwrap(),
],
vec![
Fp::from_str(
"4090916114781784760754024121473951637398586212781078739533487486471895169595",
)
.unwrap(),
Fp::from_str(
"960857870893264392654072242483170132703826969766439993624797963496069781505",
)
.unwrap(),
Fp::from_str(
"20907571141369581631669592493277131511110363500792783458107745525298320150137",
)
.unwrap(),
],
vec![
Fp::from_str(
"12109635595469802832249294970134397092397779126665661972278751053960740447966",
)
.unwrap(),
Fp::from_str(
"4824844368626589074800225473359998312724599509010698030845972726192270761413",
)
.unwrap(),
Fp::from_str(
"1279633418489206280063439936145640252901253476940505080338091886704297503137",
)
.unwrap(),
],
vec![
Fp::from_str(
"13710991567078829309950552225511825775559273430088991705888338422645023107567",
)
.unwrap(),
Fp::from_str(
"21744331847293235251226457402120455816051177980544192245842389157344912734176",
)
.unwrap(),
Fp::from_str(
"13750456500419553884447154012886160987332428475286924998031161614878499276461",
)
.unwrap(),
],
vec![
Fp::from_str(
"7897870706671989949903359523135485593775134275719857967175422051001928288650",
)
.unwrap(),
Fp::from_str(
"11530512859482871748707639867674853723860540856854102438746375696832108722419",
)
.unwrap(),
Fp::from_str(
"15102320430753094455411262873908179792479117498565463936483853362951093377404",
)
.unwrap(),
],
vec![
Fp::from_str(
"20684012922073862986880613075424856809319565915848039596293835293542621074230",
)
.unwrap(),
Fp::from_str(
"11143754623250183108051550852169137897571161411757151918630704123953225725876",
)
.unwrap(),
Fp::from_str(
"21515833961121090836372549249533024521086358011705741464637998484545867651639",
)
.unwrap(),
],
vec![
Fp::from_str(
"14927367861301244473471972423309886137778884679987552642033604382283866452496",
)
.unwrap(),
Fp::from_str(
"2234445563530370737450306710054836240206601416475326119659514396778117223266",
)
.unwrap(),
Fp::from_str(
"7320243644229576716977260850447281726825012665363843781486677636270396893993",
)
.unwrap(),
],
vec![
Fp::from_str(
"3648709991731171089283528046834957511485556517829186374119154464357293936649",
)
.unwrap(),
Fp::from_str(
"8431771340355225974834111903440269408389608143822442356390982704086190421477",
)
.unwrap(),
Fp::from_str(
"850707530944871742730572985296454989068982533587676445405227892149682249460",
)
.unwrap(),
],
vec![
Fp::from_str(
"12770330711881918473357359607046064327068283622530828696564875920105463050911",
)
.unwrap(),
Fp::from_str(
"18309438953837613260356082733742847603856465956586832431344593061564231402706",
)
.unwrap(),
Fp::from_str(
"7558769148417330857693721923631008074203529622851527561622447590521963662006",
)
.unwrap(),
],
vec![
Fp::from_str(
"3817411164684956972519434296876841710387488302709712662164166985673595410943",
)
.unwrap(),
Fp::from_str(
"14529667139169881031943219432572774573785882712681678612418006263967413092263",
)
.unwrap(),
Fp::from_str(
"5591068111468958432601398487692727664831870363727501013569466045034798523918",
)
.unwrap(),
],
],
}
}
pub fn static_params() -> &'static ArithmeticSpongeParams<Fp> {
static PARAMS: Lazy<ArithmeticSpongeParams<Fp>> = 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 = 55;
const PERM_ROUNDS_PARTIAL: usize = 0;
const PERM_HALF_ROUNDS_FULL: usize = 0;
const PERM_SBOX: u32 = 7;
const PERM_FULL_MDS: bool = true;
const PERM_INITIAL_ARK: bool = false;
}
#[cfg(test)]
mod tests {
use std::str::FromStr;
use super::{static_params, PlonkSpongeConstantsIVC};
use ark_bn254::Fr as Fp;
use kimchi::o1_utils::FieldHelpers;
use mina_poseidon::poseidon::{ArithmeticSponge as Poseidon, Sponge as _};
#[test]
fn test_poseidon() {
let mut hash = Poseidon::<Fp, PlonkSpongeConstantsIVC>::new(static_params());
let input: [Fp; 3] = [
Fp::from_str("1").unwrap(),
Fp::from_str("1").unwrap(),
Fp::from_str("1").unwrap(),
];
let exp_output_str = [
"62838cdb9e91f1e85b450c1c45ccd220da17896083479d4879d520dc51ca390c",
"1dcb5390c0c61fc6c461043e5b1ae385faedb3d5a87c95f488bb851faca61f0a",
"fc0388532e2e38ec1e1402fbcf016a7954cf8fb6b6ba5739c7666aea7af42c29",
];
let exp_output = exp_output_str.map(|x| Fp::from_hex(x).unwrap());
hash.absorb(&input);
assert_eq!(hash.state, exp_output);
}
}