@voter-protocol/noir-prover 0.1.3 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/circuits/district_membership_14.json +1 -0
  2. package/circuits/district_membership_18.json +1 -0
  3. package/circuits/district_membership_20.json +1 -0
  4. package/circuits/district_membership_22.json +1 -0
  5. package/circuits/district_membership_24.json +1 -0
  6. package/circuits/two_tree_membership_18.json +1 -0
  7. package/circuits/two_tree_membership_20.json +1 -0
  8. package/circuits/two_tree_membership_22.json +1 -0
  9. package/circuits/two_tree_membership_24.json +1 -0
  10. package/dist/district_membership_18-Breq2tlt.js +128 -0
  11. package/dist/district_membership_18-DSj7IJGE.cjs +139 -0
  12. package/dist/district_membership_20-Bu0PWpWT.js +128 -0
  13. package/dist/district_membership_20-DKRyEvX4.cjs +139 -0
  14. package/dist/district_membership_22-DlrHPQtq.js +128 -0
  15. package/dist/district_membership_22-pal861Dz.cjs +139 -0
  16. package/dist/district_membership_24-BAJ-CEhq.cjs +139 -0
  17. package/dist/district_membership_24-CM66_Yd9.js +128 -0
  18. package/dist/index.cjs +1052 -123
  19. package/dist/index.js +1041 -124
  20. package/dist/noir-prover/src/cross-origin-isolation.d.ts +1 -0
  21. package/dist/noir-prover/src/cross-origin-isolation.d.ts.map +1 -0
  22. package/dist/noir-prover/src/fixtures.d.ts +82 -0
  23. package/dist/noir-prover/src/fixtures.d.ts.map +1 -0
  24. package/dist/noir-prover/src/hash.worker.d.ts +2 -0
  25. package/dist/noir-prover/src/hash.worker.d.ts.map +1 -0
  26. package/dist/noir-prover/src/index.d.ts +10 -2
  27. package/dist/noir-prover/src/index.d.ts.map +1 -0
  28. package/dist/noir-prover/src/profiler.d.ts +74 -0
  29. package/dist/noir-prover/src/profiler.d.ts.map +1 -0
  30. package/dist/noir-prover/src/prover-e2e.test.d.ts +1 -0
  31. package/dist/noir-prover/src/prover-e2e.test.d.ts.map +1 -0
  32. package/dist/noir-prover/src/prover-orchestrator.d.ts +104 -0
  33. package/dist/noir-prover/src/prover-orchestrator.d.ts.map +1 -0
  34. package/dist/noir-prover/src/prover.d.ts +43 -1
  35. package/dist/noir-prover/src/prover.d.ts.map +1 -0
  36. package/dist/noir-prover/src/prover.test.d.ts +1 -0
  37. package/dist/noir-prover/src/prover.test.d.ts.map +1 -0
  38. package/dist/noir-prover/src/two-tree-prover.d.ts +106 -0
  39. package/dist/noir-prover/src/two-tree-prover.d.ts.map +1 -0
  40. package/dist/noir-prover/src/two-tree-prover.test.d.ts +18 -0
  41. package/dist/noir-prover/src/two-tree-prover.test.d.ts.map +1 -0
  42. package/dist/noir-prover/src/types.d.ts +289 -20
  43. package/dist/noir-prover/src/types.d.ts.map +1 -0
  44. package/dist/noir-prover/src/worker-protocol.d.ts +75 -0
  45. package/dist/noir-prover/src/worker-protocol.d.ts.map +1 -0
  46. package/dist/two_tree_membership_18-Dfr1mYE-.cjs +195 -0
  47. package/dist/two_tree_membership_18-DufFLCM8.js +184 -0
  48. package/dist/two_tree_membership_20-DhrOeOFx.js +184 -0
  49. package/dist/two_tree_membership_20-jDMJJKIC.cjs +195 -0
  50. package/dist/two_tree_membership_22-CjwYhC_e.cjs +195 -0
  51. package/dist/two_tree_membership_22-iMLJVJEK.js +184 -0
  52. package/dist/two_tree_membership_24-Br8I-xLQ.cjs +195 -0
  53. package/dist/two_tree_membership_24-Df3SNDL0.js +184 -0
  54. package/package.json +12 -8
@@ -0,0 +1,139 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
+
5
+ const noir_version = "1.0.0-beta.18+99bb8b5cf33d7669adbdef096b12d80f30b4c0c9";
6
+ const hash = "766058119090432835";
7
+ const abi = {
8
+ parameters: [
9
+ {
10
+ name: "merkle_root",
11
+ type: {
12
+ kind: "field"
13
+ },
14
+ visibility: "private"
15
+ },
16
+ {
17
+ name: "nullifier",
18
+ type: {
19
+ kind: "field"
20
+ },
21
+ visibility: "private"
22
+ },
23
+ {
24
+ name: "authority_hash",
25
+ type: {
26
+ kind: "field"
27
+ },
28
+ visibility: "private"
29
+ },
30
+ {
31
+ name: "epoch_id",
32
+ type: {
33
+ kind: "field"
34
+ },
35
+ visibility: "private"
36
+ },
37
+ {
38
+ name: "campaign_id",
39
+ type: {
40
+ kind: "field"
41
+ },
42
+ visibility: "private"
43
+ },
44
+ {
45
+ name: "leaf",
46
+ type: {
47
+ kind: "field"
48
+ },
49
+ visibility: "private"
50
+ },
51
+ {
52
+ name: "merkle_path",
53
+ type: {
54
+ kind: "array",
55
+ length: 18,
56
+ type: {
57
+ kind: "field"
58
+ }
59
+ },
60
+ visibility: "private"
61
+ },
62
+ {
63
+ name: "leaf_index",
64
+ type: {
65
+ kind: "integer",
66
+ sign: "unsigned",
67
+ width: 32
68
+ },
69
+ visibility: "private"
70
+ },
71
+ {
72
+ name: "user_secret",
73
+ type: {
74
+ kind: "field"
75
+ },
76
+ visibility: "private"
77
+ }
78
+ ],
79
+ return_type: {
80
+ abi_type: {
81
+ kind: "tuple",
82
+ fields: [
83
+ {
84
+ kind: "field"
85
+ },
86
+ {
87
+ kind: "field"
88
+ },
89
+ {
90
+ kind: "field"
91
+ },
92
+ {
93
+ kind: "field"
94
+ },
95
+ {
96
+ kind: "field"
97
+ }
98
+ ]
99
+ },
100
+ visibility: "public"
101
+ },
102
+ error_types: {
103
+ }
104
+ };
105
+ const bytecode = "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";
106
+ const debug_symbols = "tVfBbts6EPwXnX3gLMnlsr/y8BA4iVMYMJzAtQs8BP33J3FnneYgo3DQC4eWvCvNaIaU3qfn3ePl+8P++PL6Y/r2z/v0eNofDvvvD4fXp+15/3qcj77/2kzx8+F82u3mQ9Nv5+eqt+1pdzxP346Xw2Ez/dweLuNPP962x4Hn7Wk+mzbT7vg849zwZX/YLbNfm4/qtF6K2huroaVdG1T51AHrHZp0Nmj1nnrTuH2zck99jetbz3fUd4QAPeOe+nqtt1X+ul6fLbM+r/O/UV8SWF+yrNXbjXpDjQZWPzqg//EdZIsG5Z4n2D8smGTdQviihrca/JGIyF9W8eY9fFFG0+BgTdfqby0Fek0i1OyeDk3iFtB6WuVww42Aho6QG4+i/9UWtcWj0NTXGgi+bocb96DXDiq452FYilDA8mdD/Tv/2j7tT592owkzp80kY8xjLGOsc6w2k46xjdHG2GdymwnJAQ5z+UwK2WFugOVoXTw1oxIb0Yh9NJTkAAdxyKOxFIfqoKO/NAfzy0j3djkRQRRiHh1zcXBe2YnlNhpnc3BuJY3+BQ7ilynZ25VCJLtCdsVFKq5ScW7VuVWXqYqDc6tl9K/VQf0ylSJVilTJTslOXSZ1mdS5qXNTl0nVwbmpjf7aB7Tkl2kUqVGkRnaN7JrL1Pj8nVtzbs1lMreAOTdzC5hbwGgBo0hGkYzsjOzMZeouU3du3bl1l6m7Bbpz626B7hbotECnSEgpJoiJxMSlQirESlRio7GNSKPD3QCASD8AlAwoMQnDXx0PFw4wovMFPQ+J/AgxE90bkEqkOyCRIYkQhf0R/kd2GZGFSOZMALJLiaxEMs/GFHfGmF5BCTFLiBlhQKQBhXIWysk4gHlAoZyVCwcjgcqlo3LtqNfFI8SsIWZEA5ENVMqplJPhANMBpZxaiGSu7iJoI9JH0BCzhZgRFERS0Chno5yMCpgVNMrZaCTGBUYjGY1kYSQLMS3EjNggcgOjnEY5GRwwOeiUs9NIDA86jdRppB5G6iFmv67G5C4RIklckhPXZEZIGCFJXJaTEhvRjSTJjSSgkQQUUyAxyTEpMancDpTYiEZ0OUUSEUQ3kkgm0kgiFFNEY9JiYjHhVpS5FzFCkmM34naUuR8xQpK5I2VuSTn2pBxilhAzQiQRIimUs1BORkgYISmUsxiRzKsbSSqINJIsGVq+a2QJkSy7+hIiWd4Cfm5P++3jYccP0JfL8em379Hzf29xJr5Y306vT7vny2m3vC2Mc/P7w/8=";
107
+ const file_map = {
108
+ "19": {
109
+ source: "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s<let N: u32>(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3<let N: u32>(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3<let N: u32>(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment<let N: u32>(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator<let N: u32>(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash<let N: u32>(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator<let N: u32>(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars, true)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators<let N: u32, let M: u32>(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators<let N: u32, let M: u32>(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Decompose the input 'bn254 scalar' into two 128 bits limbs.\n// It is called 'unsafe' because it does not assert the limbs are 128 bits\n// Assuming the limbs are 128 bits:\n// Assert the decomposition does not overflow the field size.\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n // Check that the decomposition does not overflow the field size\n let (a, b) = if xhi == crate::field::bn254::PHI {\n (xlo, crate::field::bn254::PLO)\n } else {\n (xhi, crate::field::bn254::PHI)\n };\n crate::field::bn254::assert_lt(a, b);\n\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn poseidon2_permutation<let N: u32>(input: [Field; N], state_len: u32) -> [Field; N] {\n assert_eq(input.len(), state_len);\n poseidon2_permutation_internal(input)\n}\n\n#[foreign(poseidon2_permutation)]\nfn poseidon2_permutation_internal<let N: u32>(input: [Field; N]) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash<H>(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault<H>;\n\nimpl<H> BuildHasher for BuildHasherDefault<H>\nwhere\n H: Hasher + Default,\n{\n type H = H;\n\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl<H> Default for BuildHasherDefault<H>\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as u8 as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as u16 as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as u32 as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as u64 as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash<H>(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl<T, let N: u32> Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl<T> Hash for [T]\nwhere\n T: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl<A, B> Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl<A, B, C> Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl<A, B, C, D> Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl<A, B, C, D, E> Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n",
110
+ path: "std/hash/mod.nr"
111
+ },
112
+ "52": {
113
+ source: "// District membership circuit (Barretenberg / Noir)\n// Mirrors Halo2 semantics with Poseidon hashing and domain-separated nullifier.\n\nuse dep::std::hash::poseidon2_permutation;\n\n// Default depth; build pipeline rewrites this per-class (14 / 20 / 22).\nglobal DEPTH: u32 = 18;\n\nfn poseidon2_hash2(left: Field, right: Field) -> Field {\n let mut state: [Field; 4] = [left, right, 0, 0];\n let out = poseidon2_permutation(state, 4);\n out[0]\n}\n\nfn poseidon2_hash4(a: Field, b: Field, c: Field, d: Field) -> Field {\n let mut state: [Field; 4] = [a, b, c, d];\n let out = poseidon2_permutation(state, 4);\n out[0]\n}\n\nfn compute_merkle_root(leaf: Field, merkle_path: [Field; DEPTH], leaf_index: u32) -> Field {\n assert(leaf_index < (1u32 << DEPTH)); // range-constrain index\n\n let mut node = leaf;\n for i in 0..DEPTH {\n let bit: bool = ((leaf_index >> i) & 1u32) == 1u32;\n let sibling = merkle_path[i];\n node = if bit { poseidon2_hash2(sibling, node) } else { poseidon2_hash2(node, sibling) };\n }\n node\n}\n\nfn compute_nullifier(user_secret: Field, campaign_id: Field, authority_hash: Field, epoch_id: Field) -> Field {\n poseidon2_hash4(user_secret, campaign_id, authority_hash, epoch_id)\n}\n\n// Public inputs are marked `pub`; private witnesses remain secret.\nfn main(\n merkle_root: Field,\n nullifier: Field,\n authority_hash: Field,\n epoch_id: Field,\n campaign_id: Field,\n leaf: Field,\n merkle_path: [Field; DEPTH],\n leaf_index: u32,\n user_secret: Field,\n) -> pub (Field, Field, Field, Field, Field) {\n let computed_root = compute_merkle_root(leaf, merkle_path, leaf_index);\n assert(computed_root == merkle_root);\n\n let computed_nullifier = compute_nullifier(user_secret, campaign_id, authority_hash, epoch_id);\n assert(computed_nullifier == nullifier);\n\n (merkle_root, nullifier, authority_hash, epoch_id, campaign_id)\n}\n",
114
+ path: "/home/noot/voter-protocol/packages/crypto/noir/district_membership/src/main.nr"
115
+ }
116
+ };
117
+ const expression_width = {
118
+ Bounded: {
119
+ width: 4
120
+ }
121
+ };
122
+ const district_membership_18 = {
123
+ noir_version: noir_version,
124
+ hash: hash,
125
+ abi: abi,
126
+ bytecode: bytecode,
127
+ debug_symbols: debug_symbols,
128
+ file_map: file_map,
129
+ expression_width: expression_width
130
+ };
131
+
132
+ exports.abi = abi;
133
+ exports.bytecode = bytecode;
134
+ exports.debug_symbols = debug_symbols;
135
+ exports.default = district_membership_18;
136
+ exports.expression_width = expression_width;
137
+ exports.file_map = file_map;
138
+ exports.hash = hash;
139
+ exports.noir_version = noir_version;
@@ -0,0 +1,128 @@
1
+ const noir_version = "1.0.0-beta.18+99bb8b5cf33d7669adbdef096b12d80f30b4c0c9";
2
+ const hash = "2656653086632005791";
3
+ const abi = {
4
+ parameters: [
5
+ {
6
+ name: "merkle_root",
7
+ type: {
8
+ kind: "field"
9
+ },
10
+ visibility: "private"
11
+ },
12
+ {
13
+ name: "nullifier",
14
+ type: {
15
+ kind: "field"
16
+ },
17
+ visibility: "private"
18
+ },
19
+ {
20
+ name: "authority_hash",
21
+ type: {
22
+ kind: "field"
23
+ },
24
+ visibility: "private"
25
+ },
26
+ {
27
+ name: "epoch_id",
28
+ type: {
29
+ kind: "field"
30
+ },
31
+ visibility: "private"
32
+ },
33
+ {
34
+ name: "campaign_id",
35
+ type: {
36
+ kind: "field"
37
+ },
38
+ visibility: "private"
39
+ },
40
+ {
41
+ name: "leaf",
42
+ type: {
43
+ kind: "field"
44
+ },
45
+ visibility: "private"
46
+ },
47
+ {
48
+ name: "merkle_path",
49
+ type: {
50
+ kind: "array",
51
+ length: 20,
52
+ type: {
53
+ kind: "field"
54
+ }
55
+ },
56
+ visibility: "private"
57
+ },
58
+ {
59
+ name: "leaf_index",
60
+ type: {
61
+ kind: "integer",
62
+ sign: "unsigned",
63
+ width: 32
64
+ },
65
+ visibility: "private"
66
+ },
67
+ {
68
+ name: "user_secret",
69
+ type: {
70
+ kind: "field"
71
+ },
72
+ visibility: "private"
73
+ }
74
+ ],
75
+ return_type: {
76
+ abi_type: {
77
+ kind: "tuple",
78
+ fields: [
79
+ {
80
+ kind: "field"
81
+ },
82
+ {
83
+ kind: "field"
84
+ },
85
+ {
86
+ kind: "field"
87
+ },
88
+ {
89
+ kind: "field"
90
+ },
91
+ {
92
+ kind: "field"
93
+ }
94
+ ]
95
+ },
96
+ visibility: "public"
97
+ },
98
+ error_types: {
99
+ }
100
+ };
101
+ const bytecode = "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";
102
+ const debug_symbols = "tZfBbuM4EET/RWcfWE2y2ZxfWSwCJ3EGBgwn8NgDLIL595XY1c7kIGPgYC4qxg7bqqcqyX6fnnePl+8P++PL64/p2z/v0+Npfzjsvz8cXp+25/3rcX71/ddmij8fzqfdbn5p+u39edfb9rQ7nqdvx8vhsJl+bg+X8U8/3rbHoeftaX43babd8XnWeeDL/rBbVr82H7vT+lbU3rgbWtp1QJVPE7A+oUnngFbv2W8ap29W7tlf4/Ot5zv2dwSAnnHP/nrdb6v+dX1/tsz9ed3/jf0lgftLlrX9dmO/ocYAqx8T0P/4DLLFgHLPFewfEUyyHiF8keGtAX8EEfnLFG+ewxcxmoYHa7q2/9atQK9NhJrdM6FJnAJaT6sebqQR0OAIuXEp+l8dUVtcCk19bYDg63G4cQ56naCCey6GpSgFLH8O1L/zX9un/enT02jC7GkzyTjmcSzjWOdabSYdxzaONo59NreZkFzgMm+fTSG7zAOwvFqXTM2q1EY1ah8DJbnARVzyGCzFpbromC/NxfxjpPu4nKigCjWPibm4uK/sxnIbg7O5uLeSxvwCF/GPKdnHlUKlu0J3xSEVp1TcW3Vv1TFVcXFvtYz5tbqof0wlpEpIle6U7tQxqWNS96buTR2Tqot7UxvztQ9pyT+mEVIjpEZ3je6aY2q8/u6tubfmmMwjYO7NPALmETBGwAjJCMnozujOHFN3TN29dffWHVP3CHT31j0C3SPQGYFOSEgpFoiFxMJRIRVqpSq1MdhGZdDhaQBAZR4AIgNKLCLw18TDwQFGdb9g5iHRH6FmqmcDUqlMByQ6JFGiiD8i/8iOEVmodM4GIDtKZKXSeTa2uLPGzApKwCwBM8qAaAMKcRbiZB3APqAQZ+WNg5VA5a2j8t5RrzePgFkDZlQD0Q1U4lTiZDnAdkCJUwuVztVTBG1U5ggaMFvAjKIgmoJGnI04WRWwK2jE2Rgk1gXGIBmDZBEkC5gWMKM2iN7AiNOIk8UBm4NOnJ1BYnnQGaTOIPUIUg+Y/Xo3pneJEkniLTnxnswKCSskibflpNRG9SBJ8iAJGCQBYQokFjkWJRaVjwOlNqpRHadIooLqQRLJVAZJhDBFNBYtFhYLPooyn0WskOR4GvFxlPk8YoUk84mU+UjK8UzKAbMEzCiRRImkEGchTlZIWCEpxFmMSufVgyQVVAZJasCsATNKJFEiqcRZiZMVElZIlDhVqHSuHiTRSmWQRAOmBswokUSJpBFnI05WSFghacTZGCRWSBqD1BgkiyAtHVp+wclSIlm+vywlkuX7zs/tab99POz4U/vlcnz67Zf3+b+3eCd+m7+dXp92z5fTbvleNN6bvyn9Dw==";
103
+ const file_map = {
104
+ "19": {
105
+ source: "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s<let N: u32>(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3<let N: u32>(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3<let N: u32>(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment<let N: u32>(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator<let N: u32>(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash<let N: u32>(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator<let N: u32>(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars, true)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators<let N: u32, let M: u32>(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators<let N: u32, let M: u32>(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Decompose the input 'bn254 scalar' into two 128 bits limbs.\n// It is called 'unsafe' because it does not assert the limbs are 128 bits\n// Assuming the limbs are 128 bits:\n// Assert the decomposition does not overflow the field size.\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n // Check that the decomposition does not overflow the field size\n let (a, b) = if xhi == crate::field::bn254::PHI {\n (xlo, crate::field::bn254::PLO)\n } else {\n (xhi, crate::field::bn254::PHI)\n };\n crate::field::bn254::assert_lt(a, b);\n\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn poseidon2_permutation<let N: u32>(input: [Field; N], state_len: u32) -> [Field; N] {\n assert_eq(input.len(), state_len);\n poseidon2_permutation_internal(input)\n}\n\n#[foreign(poseidon2_permutation)]\nfn poseidon2_permutation_internal<let N: u32>(input: [Field; N]) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash<H>(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault<H>;\n\nimpl<H> BuildHasher for BuildHasherDefault<H>\nwhere\n H: Hasher + Default,\n{\n type H = H;\n\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl<H> Default for BuildHasherDefault<H>\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as u8 as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as u16 as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as u32 as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as u64 as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash<H>(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl<T, let N: u32> Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl<T> Hash for [T]\nwhere\n T: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl<A, B> Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl<A, B, C> Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl<A, B, C, D> Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl<A, B, C, D, E> Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n",
106
+ path: "std/hash/mod.nr"
107
+ },
108
+ "52": {
109
+ source: "// District membership circuit (Barretenberg / Noir)\n// Mirrors Halo2 semantics with Poseidon hashing and domain-separated nullifier.\n\nuse dep::std::hash::poseidon2_permutation;\n\n// Default depth; build pipeline rewrites this per-class (14 / 20 / 22).\nglobal DEPTH: u32 = 20;\n\nfn poseidon2_hash2(left: Field, right: Field) -> Field {\n let mut state: [Field; 4] = [left, right, 0, 0];\n let out = poseidon2_permutation(state, 4);\n out[0]\n}\n\nfn poseidon2_hash4(a: Field, b: Field, c: Field, d: Field) -> Field {\n let mut state: [Field; 4] = [a, b, c, d];\n let out = poseidon2_permutation(state, 4);\n out[0]\n}\n\nfn compute_merkle_root(leaf: Field, merkle_path: [Field; DEPTH], leaf_index: u32) -> Field {\n assert(leaf_index < (1u32 << DEPTH)); // range-constrain index\n\n let mut node = leaf;\n for i in 0..DEPTH {\n let bit: bool = ((leaf_index >> i) & 1u32) == 1u32;\n let sibling = merkle_path[i];\n node = if bit { poseidon2_hash2(sibling, node) } else { poseidon2_hash2(node, sibling) };\n }\n node\n}\n\nfn compute_nullifier(user_secret: Field, campaign_id: Field, authority_hash: Field, epoch_id: Field) -> Field {\n poseidon2_hash4(user_secret, campaign_id, authority_hash, epoch_id)\n}\n\n// Public inputs are marked `pub`; private witnesses remain secret.\nfn main(\n merkle_root: Field,\n nullifier: Field,\n authority_hash: Field,\n epoch_id: Field,\n campaign_id: Field,\n leaf: Field,\n merkle_path: [Field; DEPTH],\n leaf_index: u32,\n user_secret: Field,\n) -> pub (Field, Field, Field, Field, Field) {\n let computed_root = compute_merkle_root(leaf, merkle_path, leaf_index);\n assert(computed_root == merkle_root);\n\n let computed_nullifier = compute_nullifier(user_secret, campaign_id, authority_hash, epoch_id);\n assert(computed_nullifier == nullifier);\n\n (merkle_root, nullifier, authority_hash, epoch_id, campaign_id)\n}\n",
110
+ path: "/home/noot/voter-protocol/packages/crypto/noir/district_membership/src/main.nr"
111
+ }
112
+ };
113
+ const expression_width = {
114
+ Bounded: {
115
+ width: 4
116
+ }
117
+ };
118
+ const district_membership_20 = {
119
+ noir_version: noir_version,
120
+ hash: hash,
121
+ abi: abi,
122
+ bytecode: bytecode,
123
+ debug_symbols: debug_symbols,
124
+ file_map: file_map,
125
+ expression_width: expression_width
126
+ };
127
+
128
+ export { abi, bytecode, debug_symbols, district_membership_20 as default, expression_width, file_map, hash, noir_version };
@@ -0,0 +1,139 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
+
5
+ const noir_version = "1.0.0-beta.18+99bb8b5cf33d7669adbdef096b12d80f30b4c0c9";
6
+ const hash = "2656653086632005791";
7
+ const abi = {
8
+ parameters: [
9
+ {
10
+ name: "merkle_root",
11
+ type: {
12
+ kind: "field"
13
+ },
14
+ visibility: "private"
15
+ },
16
+ {
17
+ name: "nullifier",
18
+ type: {
19
+ kind: "field"
20
+ },
21
+ visibility: "private"
22
+ },
23
+ {
24
+ name: "authority_hash",
25
+ type: {
26
+ kind: "field"
27
+ },
28
+ visibility: "private"
29
+ },
30
+ {
31
+ name: "epoch_id",
32
+ type: {
33
+ kind: "field"
34
+ },
35
+ visibility: "private"
36
+ },
37
+ {
38
+ name: "campaign_id",
39
+ type: {
40
+ kind: "field"
41
+ },
42
+ visibility: "private"
43
+ },
44
+ {
45
+ name: "leaf",
46
+ type: {
47
+ kind: "field"
48
+ },
49
+ visibility: "private"
50
+ },
51
+ {
52
+ name: "merkle_path",
53
+ type: {
54
+ kind: "array",
55
+ length: 20,
56
+ type: {
57
+ kind: "field"
58
+ }
59
+ },
60
+ visibility: "private"
61
+ },
62
+ {
63
+ name: "leaf_index",
64
+ type: {
65
+ kind: "integer",
66
+ sign: "unsigned",
67
+ width: 32
68
+ },
69
+ visibility: "private"
70
+ },
71
+ {
72
+ name: "user_secret",
73
+ type: {
74
+ kind: "field"
75
+ },
76
+ visibility: "private"
77
+ }
78
+ ],
79
+ return_type: {
80
+ abi_type: {
81
+ kind: "tuple",
82
+ fields: [
83
+ {
84
+ kind: "field"
85
+ },
86
+ {
87
+ kind: "field"
88
+ },
89
+ {
90
+ kind: "field"
91
+ },
92
+ {
93
+ kind: "field"
94
+ },
95
+ {
96
+ kind: "field"
97
+ }
98
+ ]
99
+ },
100
+ visibility: "public"
101
+ },
102
+ error_types: {
103
+ }
104
+ };
105
+ const bytecode = "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";
106
+ const debug_symbols = "tZfBbuM4EET/RWcfWE2y2ZxfWSwCJ3EGBgwn8NgDLIL595XY1c7kIGPgYC4qxg7bqqcqyX6fnnePl+8P++PL64/p2z/v0+Npfzjsvz8cXp+25/3rcX71/ddmij8fzqfdbn5p+u39edfb9rQ7nqdvx8vhsJl+bg+X8U8/3rbHoeftaX43babd8XnWeeDL/rBbVr82H7vT+lbU3rgbWtp1QJVPE7A+oUnngFbv2W8ap29W7tlf4/Ot5zv2dwSAnnHP/nrdb6v+dX1/tsz9ed3/jf0lgftLlrX9dmO/ocYAqx8T0P/4DLLFgHLPFewfEUyyHiF8keGtAX8EEfnLFG+ewxcxmoYHa7q2/9atQK9NhJrdM6FJnAJaT6sebqQR0OAIuXEp+l8dUVtcCk19bYDg63G4cQ56naCCey6GpSgFLH8O1L/zX9un/enT02jC7GkzyTjmcSzjWOdabSYdxzaONo59NreZkFzgMm+fTSG7zAOwvFqXTM2q1EY1ah8DJbnARVzyGCzFpbromC/NxfxjpPu4nKigCjWPibm4uK/sxnIbg7O5uLeSxvwCF/GPKdnHlUKlu0J3xSEVp1TcW3Vv1TFVcXFvtYz5tbqof0wlpEpIle6U7tQxqWNS96buTR2Tqot7UxvztQ9pyT+mEVIjpEZ3je6aY2q8/u6tubfmmMwjYO7NPALmETBGwAjJCMnozujOHFN3TN29dffWHVP3CHT31j0C3SPQGYFOSEgpFoiFxMJRIRVqpSq1MdhGZdDhaQBAZR4AIgNKLCLw18TDwQFGdb9g5iHRH6FmqmcDUqlMByQ6JFGiiD8i/8iOEVmodM4GIDtKZKXSeTa2uLPGzApKwCwBM8qAaAMKcRbiZB3APqAQZ+WNg5VA5a2j8t5RrzePgFkDZlQD0Q1U4lTiZDnAdkCJUwuVztVTBG1U5ggaMFvAjKIgmoJGnI04WRWwK2jE2Rgk1gXGIBmDZBEkC5gWMKM2iN7AiNOIk8UBm4NOnJ1BYnnQGaTOIPUIUg+Y/Xo3pneJEkniLTnxnswKCSskibflpNRG9SBJ8iAJGCQBYQokFjkWJRaVjwOlNqpRHadIooLqQRLJVAZJhDBFNBYtFhYLPooyn0WskOR4GvFxlPk8YoUk84mU+UjK8UzKAbMEzCiRRImkEGchTlZIWCEpxFmMSufVgyQVVAZJasCsATNKJFEiqcRZiZMVElZIlDhVqHSuHiTRSmWQRAOmBswokUSJpBFnI05WSFghacTZGCRWSBqD1BgkiyAtHVp+wclSIlm+vywlkuX7zs/tab99POz4U/vlcnz67Zf3+b+3eCd+m7+dXp92z5fTbvleNN6bvyn9Dw==";
107
+ const file_map = {
108
+ "19": {
109
+ source: "// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s<let N: u32>(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3<let N: u32>(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3<let N: u32>(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment<let N: u32>(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator<let N: u32>(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash<let N: u32>(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator<let N: u32>(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars, true)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators<let N: u32, let M: u32>(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n // TODO(https://github.com/noir-lang/noir/issues/5672): Add back assert_constant on starting_index\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators<let N: u32, let M: u32>(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Decompose the input 'bn254 scalar' into two 128 bits limbs.\n// It is called 'unsafe' because it does not assert the limbs are 128 bits\n// Assuming the limbs are 128 bits:\n// Assert the decomposition does not overflow the field size.\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n // Check that the decomposition does not overflow the field size\n let (a, b) = if xhi == crate::field::bn254::PHI {\n (xlo, crate::field::bn254::PLO)\n } else {\n (xhi, crate::field::bn254::PHI)\n };\n crate::field::bn254::assert_lt(a, b);\n\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn poseidon2_permutation<let N: u32>(input: [Field; N], state_len: u32) -> [Field; N] {\n assert_eq(input.len(), state_len);\n poseidon2_permutation_internal(input)\n}\n\n#[foreign(poseidon2_permutation)]\nfn poseidon2_permutation_internal<let N: u32>(input: [Field; N]) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash<H>(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault<H>;\n\nimpl<H> BuildHasher for BuildHasherDefault<H>\nwhere\n H: Hasher + Default,\n{\n type H = H;\n\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl<H> Default for BuildHasherDefault<H>\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as u8 as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as u16 as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as u32 as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as u64 as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash<H>(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl<T, let N: u32> Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl<T> Hash for [T]\nwhere\n T: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl<A, B> Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl<A, B, C> Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl<A, B, C, D> Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl<A, B, C, D, E> Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n",
110
+ path: "std/hash/mod.nr"
111
+ },
112
+ "52": {
113
+ source: "// District membership circuit (Barretenberg / Noir)\n// Mirrors Halo2 semantics with Poseidon hashing and domain-separated nullifier.\n\nuse dep::std::hash::poseidon2_permutation;\n\n// Default depth; build pipeline rewrites this per-class (14 / 20 / 22).\nglobal DEPTH: u32 = 20;\n\nfn poseidon2_hash2(left: Field, right: Field) -> Field {\n let mut state: [Field; 4] = [left, right, 0, 0];\n let out = poseidon2_permutation(state, 4);\n out[0]\n}\n\nfn poseidon2_hash4(a: Field, b: Field, c: Field, d: Field) -> Field {\n let mut state: [Field; 4] = [a, b, c, d];\n let out = poseidon2_permutation(state, 4);\n out[0]\n}\n\nfn compute_merkle_root(leaf: Field, merkle_path: [Field; DEPTH], leaf_index: u32) -> Field {\n assert(leaf_index < (1u32 << DEPTH)); // range-constrain index\n\n let mut node = leaf;\n for i in 0..DEPTH {\n let bit: bool = ((leaf_index >> i) & 1u32) == 1u32;\n let sibling = merkle_path[i];\n node = if bit { poseidon2_hash2(sibling, node) } else { poseidon2_hash2(node, sibling) };\n }\n node\n}\n\nfn compute_nullifier(user_secret: Field, campaign_id: Field, authority_hash: Field, epoch_id: Field) -> Field {\n poseidon2_hash4(user_secret, campaign_id, authority_hash, epoch_id)\n}\n\n// Public inputs are marked `pub`; private witnesses remain secret.\nfn main(\n merkle_root: Field,\n nullifier: Field,\n authority_hash: Field,\n epoch_id: Field,\n campaign_id: Field,\n leaf: Field,\n merkle_path: [Field; DEPTH],\n leaf_index: u32,\n user_secret: Field,\n) -> pub (Field, Field, Field, Field, Field) {\n let computed_root = compute_merkle_root(leaf, merkle_path, leaf_index);\n assert(computed_root == merkle_root);\n\n let computed_nullifier = compute_nullifier(user_secret, campaign_id, authority_hash, epoch_id);\n assert(computed_nullifier == nullifier);\n\n (merkle_root, nullifier, authority_hash, epoch_id, campaign_id)\n}\n",
114
+ path: "/home/noot/voter-protocol/packages/crypto/noir/district_membership/src/main.nr"
115
+ }
116
+ };
117
+ const expression_width = {
118
+ Bounded: {
119
+ width: 4
120
+ }
121
+ };
122
+ const district_membership_20 = {
123
+ noir_version: noir_version,
124
+ hash: hash,
125
+ abi: abi,
126
+ bytecode: bytecode,
127
+ debug_symbols: debug_symbols,
128
+ file_map: file_map,
129
+ expression_width: expression_width
130
+ };
131
+
132
+ exports.abi = abi;
133
+ exports.bytecode = bytecode;
134
+ exports.debug_symbols = debug_symbols;
135
+ exports.default = district_membership_20;
136
+ exports.expression_width = expression_width;
137
+ exports.file_map = file_map;
138
+ exports.hash = hash;
139
+ exports.noir_version = noir_version;