bn254_blackbox_solver 0.43.0

Solvers for black box functions which are specific for the bn254 curve
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
use acir::FieldElement;
use acvm_blackbox_solver::BlackBoxResolutionError;
use num_bigint::BigUint;
use num_traits::Num;

pub(crate) struct Poseidon2 {
    t: u32,
    rounds_f: u32,
    rounds_p: u32,
    internal_matrix_diagonal: [FieldElement; 4],
    round_constant: [[FieldElement; 4]; 64],
}

impl Poseidon2 {
    pub(crate) fn new() -> Self {
        Poseidon2 {
            t: 4,
            rounds_f: 8,
            rounds_p: 56,
            internal_matrix_diagonal: [
                Poseidon2::field_from_hex(
                    "0x10dc6e9c006ea38b04b1e03b4bd9490c0d03f98929ca1d7fb56821fd19d3b6e7",
                ),
                Poseidon2::field_from_hex(
                    "0x0c28145b6a44df3e0149b3d0a30b3bb599df9756d4dd9b84a86b38cfb45a740b",
                ),
                Poseidon2::field_from_hex(
                    "0x00544b8338791518b2c7645a50392798b21f75bb60e3596170067d00141cac15",
                ),
                Poseidon2::field_from_hex(
                    "0x222c01175718386f2e2e82eb122789e352e105a3b8fa852613bc534433ee428b",
                ),
            ],
            round_constant: [
                [
                    Poseidon2::field_from_hex(
                        "0x19b849f69450b06848da1d39bd5e4a4302bb86744edc26238b0878e269ed23e5",
                    ),
                    Poseidon2::field_from_hex(
                        "0x265ddfe127dd51bd7239347b758f0a1320eb2cc7450acc1dad47f80c8dcf34d6",
                    ),
                    Poseidon2::field_from_hex(
                        "0x199750ec472f1809e0f66a545e1e51624108ac845015c2aa3dfc36bab497d8aa",
                    ),
                    Poseidon2::field_from_hex(
                        "0x157ff3fe65ac7208110f06a5f74302b14d743ea25067f0ffd032f787c7f1cdf8",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x2e49c43c4569dd9c5fd35ac45fca33f10b15c590692f8beefe18f4896ac94902",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0e35fb89981890520d4aef2b6d6506c3cb2f0b6973c24fa82731345ffa2d1f1e",
                    ),
                    Poseidon2::field_from_hex(
                        "0x251ad47cb15c4f1105f109ae5e944f1ba9d9e7806d667ffec6fe723002e0b996",
                    ),
                    Poseidon2::field_from_hex(
                        "0x13da07dc64d428369873e97160234641f8beb56fdd05e5f3563fa39d9c22df4e",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x0c009b84e650e6d23dc00c7dccef7483a553939689d350cd46e7b89055fd4738",
                    ),
                    Poseidon2::field_from_hex(
                        "0x011f16b1c63a854f01992e3956f42d8b04eb650c6d535eb0203dec74befdca06",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0ed69e5e383a688f209d9a561daa79612f3f78d0467ad45485df07093f367549",
                    ),
                    Poseidon2::field_from_hex(
                        "0x04dba94a7b0ce9e221acad41472b6bbe3aec507f5eb3d33f463672264c9f789b",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x0a3f2637d840f3a16eb094271c9d237b6036757d4bb50bf7ce732ff1d4fa28e8",
                    ),
                    Poseidon2::field_from_hex(
                        "0x259a666f129eea198f8a1c502fdb38fa39b1f075569564b6e54a485d1182323f",
                    ),
                    Poseidon2::field_from_hex(
                        "0x28bf7459c9b2f4c6d8e7d06a4ee3a47f7745d4271038e5157a32fdf7ede0d6a1",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0a1ca941f057037526ea200f489be8d4c37c85bbcce6a2aeec91bd6941432447",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x0c6f8f958be0e93053d7fd4fc54512855535ed1539f051dcb43a26fd926361cf",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x123106a93cd17578d426e8128ac9d90aa9e8a00708e296e084dd57e69caaf811",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x26e1ba52ad9285d97dd3ab52f8e840085e8fa83ff1e8f1877b074867cd2dee75",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x1cb55cad7bd133de18a64c5c47b9c97cbe4d8b7bf9e095864471537e6a4ae2c5",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x1dcd73e46acd8f8e0e2c7ce04bde7f6d2a53043d5060a41c7143f08e6e9055d0",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x011003e32f6d9c66f5852f05474a4def0cda294a0eb4e9b9b12b9bb4512e5574",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x2b1e809ac1d10ab29ad5f20d03a57dfebadfe5903f58bafed7c508dd2287ae8c",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x2539de1785b735999fb4dac35ee17ed0ef995d05ab2fc5faeaa69ae87bcec0a5",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x0c246c5a2ef8ee0126497f222b3e0a0ef4e1c3d41c86d46e43982cb11d77951d",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x192089c4974f68e95408148f7c0632edbb09e6a6ad1a1c2f3f0305f5d03b527b",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x1eae0ad8ab68b2f06a0ee36eeb0d0c058529097d91096b756d8fdc2fb5a60d85",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x179190e5d0e22179e46f8282872abc88db6e2fdc0dee99e69768bd98c5d06bfb",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x29bb9e2c9076732576e9a81c7ac4b83214528f7db00f31bf6cafe794a9b3cd1c",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x225d394e42207599403efd0c2464a90d52652645882aac35b10e590e6e691e08",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x064760623c25c8cf753d238055b444532be13557451c087de09efd454b23fd59",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x10ba3a0e01df92e87f301c4b716d8a394d67f4bf42a75c10922910a78f6b5b87",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x0e070bf53f8451b24f9c6e96b0c2a801cb511bc0c242eb9d361b77693f21471c",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x1b94cd61b051b04dd39755ff93821a73ccd6cb11d2491d8aa7f921014de252fb",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x1d7cb39bafb8c744e148787a2e70230f9d4e917d5713bb050487b5aa7d74070b",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x2ec93189bd1ab4f69117d0fe980c80ff8785c2961829f701bb74ac1f303b17db",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x2db366bfdd36d277a692bb825b86275beac404a19ae07a9082ea46bd83517926",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x062100eb485db06269655cf186a68532985275428450359adc99cec6960711b8",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x0761d33c66614aaa570e7f1e8244ca1120243f92fa59e4f900c567bf41f5a59b",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x20fc411a114d13992c2705aa034e3f315d78608a0f7de4ccf7a72e494855ad0d",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x25b5c004a4bdfcb5add9ec4e9ab219ba102c67e8b3effb5fc3a30f317250bc5a",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x23b1822d278ed632a494e58f6df6f5ed038b186d8474155ad87e7dff62b37f4b",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x22734b4c5c3f9493606c4ba9012499bf0f14d13bfcfcccaa16102a29cc2f69e0",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x26c0c8fe09eb30b7e27a74dc33492347e5bdff409aa3610254413d3fad795ce5",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x070dd0ccb6bd7bbae88eac03fa1fbb26196be3083a809829bbd626df348ccad9",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x12b6595bdb329b6fb043ba78bb28c3bec2c0a6de46d8c5ad6067c4ebfd4250da",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x248d97d7f76283d63bec30e7a5876c11c06fca9b275c671c5e33d95bb7e8d729",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x1a306d439d463b0816fc6fd64cc939318b45eb759ddde4aa106d15d9bd9baaaa",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x28a8f8372e3c38daced7c00421cb4621f4f1b54ddc27821b0d62d3d6ec7c56cf",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x0094975717f9a8a8bb35152f24d43294071ce320c829f388bc852183e1e2ce7e",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x04d5ee4c3aa78f7d80fde60d716480d3593f74d4f653ae83f4103246db2e8d65",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x2a6cf5e9aa03d4336349ad6fb8ed2269c7bef54b8822cc76d08495c12efde187",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x2304d31eaab960ba9274da43e19ddeb7f792180808fd6e43baae48d7efcba3f3",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x03fd9ac865a4b2a6d5e7009785817249bff08a7e0726fcb4e1c11d39d199f0b0",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x00b7258ded52bbda2248404d55ee5044798afc3a209193073f7954d4d63b0b64",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x159f81ada0771799ec38fca2d4bf65ebb13d3a74f3298db36272c5ca65e92d9a",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x1ef90e67437fbc8550237a75bc28e3bb9000130ea25f0c5471e144cf4264431f",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x1e65f838515e5ff0196b49aa41a2d2568df739bc176b08ec95a79ed82932e30d",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x2b1b045def3a166cec6ce768d079ba74b18c844e570e1f826575c1068c94c33f",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x0832e5753ceb0ff6402543b1109229c165dc2d73bef715e3f1c6e07c168bb173",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x02f614e9cedfb3dc6b762ae0a37d41bab1b841c2e8b6451bc5a8e3c390b6ad16",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x0e2427d38bd46a60dd640b8e362cad967370ebb777bedff40f6a0be27e7ed705",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x0493630b7c670b6deb7c84d414e7ce79049f0ec098c3c7c50768bbe29214a53a",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x22ead100e8e482674decdab17066c5a26bb1515355d5461a3dc06cc85327cea9",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x25b3e56e655b42cdaae2626ed2554d48583f1ae35626d04de5084e0b6d2a6f16",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x1e32752ada8836ef5837a6cde8ff13dbb599c336349e4c584b4fdc0a0cf6f9d0",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x2fa2a871c15a387cc50f68f6f3c3455b23c00995f05078f672a9864074d412e5",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x2f569b8a9a4424c9278e1db7311e889f54ccbf10661bab7fcd18e7c7a7d83505",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x044cb455110a8fdd531ade530234c518a7df93f7332ffd2144165374b246b43d",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x227808de93906d5d420246157f2e42b191fe8c90adfe118178ddc723a5319025",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x02fcca2934e046bc623adead873579865d03781ae090ad4a8579d2e7a6800355",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x0ef915f0ac120b876abccceb344a1d36bad3f3c5ab91a8ddcbec2e060d8befac",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0000000000000000000000000000000000000000000000000000000000000000",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x1797130f4b7a3e1777eb757bc6f287f6ab0fb85f6be63b09f3b16ef2b1405d38",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0a76225dc04170ae3306c85abab59e608c7f497c20156d4d36c668555decc6e5",
                    ),
                    Poseidon2::field_from_hex(
                        "0x1fffb9ec1992d66ba1e77a7b93209af6f8fa76d48acb664796174b5326a31a5c",
                    ),
                    Poseidon2::field_from_hex(
                        "0x25721c4fc15a3f2853b57c338fa538d85f8fbba6c6b9c6090611889b797b9c5f",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x0c817fd42d5f7a41215e3d07ba197216adb4c3790705da95eb63b982bfcaf75a",
                    ),
                    Poseidon2::field_from_hex(
                        "0x13abe3f5239915d39f7e13c2c24970b6df8cf86ce00a22002bc15866e52b5a96",
                    ),
                    Poseidon2::field_from_hex(
                        "0x2106feea546224ea12ef7f39987a46c85c1bc3dc29bdbd7a92cd60acb4d391ce",
                    ),
                    Poseidon2::field_from_hex(
                        "0x21ca859468a746b6aaa79474a37dab49f1ca5a28c748bc7157e1b3345bb0f959",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x05ccd6255c1e6f0c5cf1f0df934194c62911d14d0321662a8f1a48999e34185b",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0f0e34a64b70a626e464d846674c4c8816c4fb267fe44fe6ea28678cb09490a4",
                    ),
                    Poseidon2::field_from_hex(
                        "0x0558531a4e25470c6157794ca36d0e9647dbfcfe350d64838f5b1a8a2de0d4bf",
                    ),
                    Poseidon2::field_from_hex(
                        "0x09d3dca9173ed2faceea125157683d18924cadad3f655a60b72f5864961f1455",
                    ),
                ],
                [
                    Poseidon2::field_from_hex(
                        "0x0328cbd54e8c0913493f866ed03d218bf23f92d68aaec48617d4c722e5bd4335",
                    ),
                    Poseidon2::field_from_hex(
                        "0x2bf07216e2aff0a223a487b1a7094e07e79e7bcc9798c648ee3347dd5329d34b",
                    ),
                    Poseidon2::field_from_hex(
                        "0x1daf345a58006b736499c583cb76c316d6f78ed6a6dffc82111e11a63fe412df",
                    ),
                    Poseidon2::field_from_hex(
                        "0x176563472456aaa746b694c60e1823611ef39039b2edc7ff391e6f2293d2c404",
                    ),
                ],
            ],
        }
    }
    fn field_from_hex(hex: &str) -> FieldElement {
        let bigint = BigUint::from_str_radix(hex.strip_prefix("0x").unwrap(), 16).unwrap();
        FieldElement::from_be_bytes_reduce(&bigint.to_bytes_be())
    }

    fn single_box(x: FieldElement) -> FieldElement {
        let s = x * x;
        s * s * x
    }

    fn s_box(input: &mut [FieldElement]) {
        for i in input {
            *i = Self::single_box(*i);
        }
    }

    fn add_round_constants(&self, state: &mut [FieldElement], round: usize) {
        for (state_element, constant_element) in state.iter_mut().zip(self.round_constant[round]) {
            *state_element += constant_element;
        }
    }

    /// Algorithm is taken directly from the Poseidon2 implementation in Barretenberg crypto module.
    fn matrix_multiplication_4x4(input: &mut [FieldElement]) {
        assert!(input.len() == 4);
        let t0 = input[0] + input[1]; // A + B
        let t1 = input[2] + input[3]; // C + D
        let mut t2 = input[1] + input[1]; // 2B
        t2 += t1; // 2B + C + D
        let mut t3 = input[3] + input[3]; // 2D
        t3 += t0; // 2D + A + B
        let mut t4 = t1 + t1;
        t4 += t4;
        t4 += t3; // A + B + 4C + 6D
        let mut t5 = t0 + t0;
        t5 += t5;
        t5 += t2; // 4A + 6B + C + D
        let t6 = t3 + t5; // 5A + 7B + C + 3D
        let t7 = t2 + t4; // A + 3B + 5C + 7D
        input[0] = t6;
        input[1] = t5;
        input[2] = t7;
        input[3] = t4;
    }

    fn internal_m_multiplication(&self, input: &mut [FieldElement]) {
        let mut sum = FieldElement::zero();
        for i in input.iter() {
            sum += *i;
        }
        for (index, i) in input.iter_mut().enumerate() {
            *i = *i * self.internal_matrix_diagonal[index];
            *i += sum;
        }
    }

    pub(crate) fn permutation(
        &self,
        inputs: &[FieldElement],
        len: u32,
    ) -> Result<Vec<FieldElement>, BlackBoxResolutionError> {
        if len as usize != inputs.len() {
            return Err(BlackBoxResolutionError::Failed(
                acir::BlackBoxFunc::Poseidon2Permutation,
                format!(
                    "the number of inputs does not match specified length. {} > {}",
                    inputs.len(),
                    len
                ),
            ));
        }
        if len != self.t {
            return Err(BlackBoxResolutionError::Failed(
                acir::BlackBoxFunc::Poseidon2Permutation,
                format!("Expected {} values but encountered {}", self.t, len),
            ));
        }
        // Read witness assignments
        let mut state = [FieldElement::zero(); 4];
        for (index, input) in inputs.iter().enumerate() {
            state[index] = *input;
        }
        // Apply 1st linear layer
        Self::matrix_multiplication_4x4(&mut state);

        // First set of external rounds
        let rf_first = self.rounds_f / 2;
        for r in 0..rf_first {
            self.add_round_constants(&mut state, r as usize);
            Self::s_box(&mut state);
            Self::matrix_multiplication_4x4(&mut state);
        }
        // Internal rounds
        let p_end = rf_first + self.rounds_p;
        for r in rf_first..p_end {
            state[0] += self.round_constant[r as usize][0];
            state[0] = Self::single_box(state[0]);
            self.internal_m_multiplication(&mut state);
        }

        // Remaining external rounds
        let num_rounds = self.rounds_f + self.rounds_p;
        for i in p_end..num_rounds {
            self.add_round_constants(&mut state, i as usize);
            Self::s_box(&mut state);
            Self::matrix_multiplication_4x4(&mut state);
        }
        Ok(state.into())
    }
}