@aztec/accounts 0.18.0 → 0.20.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.
@@ -1,967 +1,1654 @@
1
1
  {
2
+ "noir_version": "0.23.0+602f23f4fb698cf6e37071936a2a46593a998d08",
2
3
  "name": "SchnorrSingleKeyAccount",
3
4
  "functions": [
4
5
  {
5
- "name": "constructor",
6
- "functionType": "secret",
7
- "isInternal": false,
8
- "parameters": [],
9
- "returnTypes": [],
10
- "bytecode": "H4sIAAAAAAAA/+Xd5XNUVxzG8U3I7qbuDU5wh9XsXdxdq9Rhy6beUqdOqTt16pS6U1daCnU3/p8+z7CZyQt4xckMZ7535pnM5MWd/ey9e/Wc3293KpXaldqzNCnNSovS3u1/XmY0/ub2b8mntY70XtZbzHWUSvVKoZ4v5tfkCtVaUs6VyrWOJJ/ky0l5bSEpFutJKalUa9VKrpovFev5znK12NlYcTrcZ8z1hDujdWR6wJ05wN1ZrSPbA+5sQHfXft/abb9P7WP/39/P3Tvw9upamgNvt6aA5j6RmJsDmvtGYu4V0NwvEnNLQHP/SMzpgOYBkZgzAc0DIzFnA5oHRWJuDWhuj8TcO6B5MNA8BGgeCjQPA5qHA80jgOaRQPMooHk00DwGaB4LNI8DmscDzROA5olAcw5ozgPNBaC5CDSXgOYy0NwBNFeA5gRorgLNk4DmyUDzFKB5KtA8DWieDjTPAJpnAs2zgObZQPMcoHku0DwPaJ4PNC8AmhcCzYuA5sVA8xKgeSnQvAxoXg40rwCaVwLNJwDNJwLNJwHNJwPNpwDNpwLNq4Dm04Dm04HmM4DmM4Hms4Dms4Hmc4Dm1UDzGqC5BjSfCzSvBZrrQHMn0Hwe0Hw+0HwB0Hwh0HwR0Hwx0HwJ0Hwp0HwZ0LwOaL4caL4CaL4SaL4KaL4aaL4GaL4WaF4PNF8HNF8PNN8ANN8INN8ENN8MNN8CNG8Amm8FmjcCzbcBzbcDzXcAzXcCzXcBzXcDzfcAzfcCzfcBzfcDzQ8AzQ8CzQ8BzZuA5oeB5keA5keB5seA5seB5ieA5ieB5s1A81NA89NA8zNA87NA83NA8/NA8wtA8xag+UWgeSvQ/BLQ/DLQ/ArQ/CrQ/BrQ/DrQ/AbQ/CbQ/BbQ/DbQ/A7Q/C7Q/B7QvA1ofh9o/gBo/hBo/gho/hho/gRo/hRo/gxo/hxo/gJo/hJo/gpo3g40fw00fxOJuTWgeQdwO38LNO8EmncBzd8Bzd8DzT9EYj4ooPnHSMwHBzT/FIn5kIDmnyMxHxrQ/Esk5sMCmn+NxHx4QPNvkZiPCGj+PRLzkQHNf0RiPiqg+c9IzEcHNP8VifmYgOa/IzEfG9D8TyTm4wKa/43EfHxA83+RmNsCmncHNLc11tPUMPdSWpS0klGyip9f+r7Q90m+b/B1tK8rfZ3l6w6fh31e8nHaxy3/jr1fezu3dftOtzf+9lH6Kv2U/soAZaAySGlXBitDlKHKMGW4MkIZqYxSRitjlLHKOGW8MkGZ6O9DySsFf89KSSkrHUpFSZSqMkmZrExRpirTlOmN73WmMkuZrcxR5irzlPnKAmWhskhZrCxRlirLlOXKCmWl4v7z7sfu/uTu1+3+1e7nvEpxv1/3v3U/WPdHdb9Q9890P8nVivsN1hT3o3N/Nvcrc/8u97Nyfyf3O3L/H/fDcX8Y90tx/xD301inuN+C+w+4Hr/r07teu+uXu573esX1nl3/2PWAXR/X9WJdP9X1RDcorje5UXE9Qtfnc706129zPTPX93K9K9d/cj0k1wdyvRzXj3E9lU2K6224/oTrMbg+gefre/6653NvVjzf1/NfPR/U8yM9X9Dz5zyfbIvi+UZbFc9H8fwMz1fw+H2PZ/f4bo939vhfj4f1+FCPl/T4QY+n26Z4vJXHH3k8jseneLyGxy/4fb7fb/t9r99/+n2g3495v/T7E79P2KH4efNOxc8j/XzOz6v8/MbPM3x/7/td3//5fsj3B75e9vWjr6d8feHzrc8/Ph77+OTfa9fyP/19vDxQuwAA",
11
- "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f"
12
- },
13
- {
14
- "name": "entrypoint",
15
- "functionType": "secret",
16
- "isInternal": false,
17
- "parameters": [
18
- {
19
- "name": "payload",
20
- "type": {
21
- "kind": "struct",
22
- "path": "authwit::entrypoint::EntrypointPayload",
23
- "fields": [
24
- {
25
- "name": "function_calls",
26
- "type": {
27
- "kind": "array",
28
- "length": 4,
6
+ "name": "is_valid_public",
7
+ "function_type": "Open",
8
+ "is_internal": false,
9
+ "abi": {
10
+ "parameters": [
11
+ {
12
+ "name": "inputs",
13
+ "type": {
14
+ "kind": "struct",
15
+ "path": "authwit::aztec::abi::PublicContextInputs",
16
+ "fields": [
17
+ {
18
+ "name": "call_context",
29
19
  "type": {
30
20
  "kind": "struct",
31
- "path": "authwit::entrypoint::FunctionCall",
21
+ "path": "authwit::aztec::protocol_types::abis::call_context::CallContext",
32
22
  "fields": [
33
23
  {
34
- "name": "args_hash",
24
+ "name": "msg_sender",
35
25
  "type": {
36
- "kind": "field"
26
+ "kind": "struct",
27
+ "path": "authwit::aztec::protocol_types::address::AztecAddress",
28
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
37
29
  }
38
30
  },
39
31
  {
40
- "name": "function_selector",
32
+ "name": "storage_contract_address",
41
33
  "type": {
42
34
  "kind": "struct",
43
- "path": "authwit::aztec::protocol_types::abis::function_selector::FunctionSelector",
44
- "fields": [
45
- {
46
- "name": "inner",
47
- "type": {
48
- "kind": "integer",
49
- "sign": "unsigned",
50
- "width": 32
51
- }
52
- }
53
- ]
35
+ "path": "authwit::aztec::protocol_types::address::AztecAddress",
36
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
54
37
  }
55
38
  },
56
39
  {
57
- "name": "target_address",
40
+ "name": "portal_contract_address",
58
41
  "type": {
59
42
  "kind": "struct",
60
- "path": "authwit::aztec::protocol_types::address::AztecAddress",
61
- "fields": [
62
- {
63
- "name": "inner",
64
- "type": {
65
- "kind": "field"
66
- }
67
- }
68
- ]
43
+ "path": "authwit::aztec::protocol_types::address::EthAddress",
44
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
69
45
  }
70
46
  },
71
47
  {
72
- "name": "is_public",
48
+ "name": "function_selector",
73
49
  "type": {
74
- "kind": "boolean"
50
+ "kind": "struct",
51
+ "path": "authwit::aztec::protocol_types::abis::function_selector::FunctionSelector",
52
+ "fields": [
53
+ { "name": "inner", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }
54
+ ]
75
55
  }
56
+ },
57
+ { "name": "is_delegate_call", "type": { "kind": "boolean" } },
58
+ { "name": "is_static_call", "type": { "kind": "boolean" } },
59
+ { "name": "is_contract_deployment", "type": { "kind": "boolean" } },
60
+ {
61
+ "name": "start_side_effect_counter",
62
+ "type": { "kind": "integer", "sign": "unsigned", "width": 32 }
76
63
  }
77
64
  ]
78
65
  }
79
- }
80
- },
81
- {
82
- "name": "nonce",
83
- "type": {
84
- "kind": "field"
85
- }
86
- }
87
- ]
88
- },
89
- "visibility": "public"
90
- }
91
- ],
92
- "returnTypes": [],
93
- "bytecode": "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",
94
- "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f"
95
- },
96
- {
97
- "name": "is_valid",
98
- "functionType": "secret",
99
- "isInternal": false,
100
- "parameters": [
101
- {
102
- "name": "message_hash",
103
- "type": {
104
- "kind": "field"
105
- },
106
- "visibility": "private"
107
- }
108
- ],
109
- "returnTypes": [],
110
- "bytecode": "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",
111
- "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f"
112
- },
113
- {
114
- "name": "is_valid_public",
115
- "functionType": "open",
116
- "isInternal": false,
117
- "parameters": [
118
- {
119
- "name": "message_hash",
120
- "type": {
121
- "kind": "field"
122
- },
123
- "visibility": "private"
124
- }
125
- ],
126
- "returnTypes": [
127
- {
128
- "kind": "struct",
129
- "path": "authwit::aztec::protocol_types::abis::public_circuit_public_inputs::PublicCircuitPublicInputs",
130
- "fields": [
131
- {
132
- "name": "call_context",
133
- "type": {
134
- "kind": "struct",
135
- "path": "authwit::aztec::protocol_types::abis::call_context::CallContext",
136
- "fields": [
137
- {
138
- "name": "msg_sender",
139
- "type": {
140
- "kind": "struct",
141
- "path": "authwit::aztec::protocol_types::address::AztecAddress",
142
- "fields": [
143
- {
144
- "name": "inner",
145
- "type": {
146
- "kind": "field"
147
- }
148
- }
149
- ]
150
- }
151
- },
152
- {
153
- "name": "storage_contract_address",
154
- "type": {
155
- "kind": "struct",
156
- "path": "authwit::aztec::protocol_types::address::AztecAddress",
157
- "fields": [
158
- {
159
- "name": "inner",
160
- "type": {
161
- "kind": "field"
162
- }
163
- }
164
- ]
165
- }
166
- },
167
- {
168
- "name": "portal_contract_address",
169
- "type": {
170
- "kind": "struct",
171
- "path": "authwit::aztec::protocol_types::address::EthAddress",
172
- "fields": [
173
- {
174
- "name": "inner",
175
- "type": {
176
- "kind": "field"
177
- }
178
- }
179
- ]
180
- }
181
- },
182
- {
183
- "name": "function_selector",
184
- "type": {
185
- "kind": "struct",
186
- "path": "authwit::aztec::protocol_types::abis::function_selector::FunctionSelector",
187
- "fields": [
188
- {
189
- "name": "inner",
190
- "type": {
191
- "kind": "integer",
192
- "sign": "unsigned",
193
- "width": 32
194
- }
195
- }
196
- ]
197
- }
198
- },
199
- {
200
- "name": "is_delegate_call",
201
- "type": {
202
- "kind": "boolean"
203
- }
204
- },
205
- {
206
- "name": "is_static_call",
207
- "type": {
208
- "kind": "boolean"
209
- }
210
- },
211
- {
212
- "name": "is_contract_deployment",
213
- "type": {
214
- "kind": "boolean"
215
- }
216
- },
217
- {
218
- "name": "start_side_effect_counter",
219
- "type": {
220
- "kind": "integer",
221
- "sign": "unsigned",
222
- "width": 32
223
- }
66
+ },
67
+ {
68
+ "name": "block_header",
69
+ "type": {
70
+ "kind": "struct",
71
+ "path": "authwit::aztec::protocol_types::abis::block_header::BlockHeader",
72
+ "fields": [
73
+ { "name": "note_hash_tree_root", "type": { "kind": "field" } },
74
+ { "name": "nullifier_tree_root", "type": { "kind": "field" } },
75
+ { "name": "contract_tree_root", "type": { "kind": "field" } },
76
+ { "name": "l1_to_l2_message_tree_root", "type": { "kind": "field" } },
77
+ { "name": "archive_root", "type": { "kind": "field" } },
78
+ { "name": "public_data_tree_root", "type": { "kind": "field" } },
79
+ { "name": "global_variables_hash", "type": { "kind": "field" } }
80
+ ]
81
+ }
82
+ },
83
+ {
84
+ "name": "public_global_variables",
85
+ "type": {
86
+ "kind": "struct",
87
+ "path": "authwit::aztec::abi::PublicGlobalVariables",
88
+ "fields": [
89
+ { "name": "chain_id", "type": { "kind": "field" } },
90
+ { "name": "version", "type": { "kind": "field" } },
91
+ { "name": "block_number", "type": { "kind": "field" } },
92
+ { "name": "timestamp", "type": { "kind": "field" } }
93
+ ]
224
94
  }
225
- ]
226
- }
227
- },
228
- {
229
- "name": "args_hash",
230
- "type": {
231
- "kind": "field"
232
- }
233
- },
234
- {
235
- "name": "return_values",
236
- "type": {
237
- "kind": "array",
238
- "length": 4,
239
- "type": {
240
- "kind": "field"
241
95
  }
242
- }
96
+ ]
243
97
  },
244
- {
245
- "name": "contract_storage_update_requests",
246
- "type": {
247
- "kind": "array",
248
- "length": 16,
98
+ "visibility": "private"
99
+ },
100
+ { "name": "message_hash", "type": { "kind": "field" }, "visibility": "private" }
101
+ ],
102
+ "param_witnesses": { "inputs": [{ "start": 0, "end": 19 }], "message_hash": [{ "start": 19, "end": 20 }] },
103
+ "return_type": {
104
+ "abi_type": {
105
+ "kind": "struct",
106
+ "path": "authwit::aztec::protocol_types::abis::public_circuit_public_inputs::PublicCircuitPublicInputs",
107
+ "fields": [
108
+ {
109
+ "name": "call_context",
249
110
  "type": {
250
111
  "kind": "struct",
251
- "path": "authwit::aztec::protocol_types::contrakt::storage_update_request::StorageUpdateRequest",
112
+ "path": "authwit::aztec::protocol_types::abis::call_context::CallContext",
252
113
  "fields": [
253
114
  {
254
- "name": "storage_slot",
115
+ "name": "msg_sender",
255
116
  "type": {
256
- "kind": "field"
117
+ "kind": "struct",
118
+ "path": "authwit::aztec::protocol_types::address::AztecAddress",
119
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
257
120
  }
258
121
  },
259
122
  {
260
- "name": "old_value",
123
+ "name": "storage_contract_address",
261
124
  "type": {
262
- "kind": "field"
125
+ "kind": "struct",
126
+ "path": "authwit::aztec::protocol_types::address::AztecAddress",
127
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
263
128
  }
264
129
  },
265
130
  {
266
- "name": "new_value",
131
+ "name": "portal_contract_address",
267
132
  "type": {
268
- "kind": "field"
133
+ "kind": "struct",
134
+ "path": "authwit::aztec::protocol_types::address::EthAddress",
135
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
269
136
  }
270
- }
271
- ]
272
- }
273
- }
274
- },
275
- {
276
- "name": "contract_storage_reads",
277
- "type": {
278
- "kind": "array",
279
- "length": 16,
280
- "type": {
281
- "kind": "struct",
282
- "path": "authwit::aztec::protocol_types::contrakt::storage_read::StorageRead",
283
- "fields": [
137
+ },
284
138
  {
285
- "name": "storage_slot",
139
+ "name": "function_selector",
286
140
  "type": {
287
- "kind": "field"
141
+ "kind": "struct",
142
+ "path": "authwit::aztec::protocol_types::abis::function_selector::FunctionSelector",
143
+ "fields": [{ "name": "inner", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }]
288
144
  }
289
145
  },
146
+ { "name": "is_delegate_call", "type": { "kind": "boolean" } },
147
+ { "name": "is_static_call", "type": { "kind": "boolean" } },
148
+ { "name": "is_contract_deployment", "type": { "kind": "boolean" } },
290
149
  {
291
- "name": "current_value",
292
- "type": {
293
- "kind": "field"
294
- }
150
+ "name": "start_side_effect_counter",
151
+ "type": { "kind": "integer", "sign": "unsigned", "width": 32 }
295
152
  }
296
153
  ]
297
154
  }
298
- }
299
- },
300
- {
301
- "name": "public_call_stack_hashes",
302
- "type": {
303
- "kind": "array",
304
- "length": 4,
155
+ },
156
+ { "name": "args_hash", "type": { "kind": "field" } },
157
+ { "name": "return_values", "type": { "kind": "array", "length": 4, "type": { "kind": "field" } } },
158
+ {
159
+ "name": "contract_storage_update_requests",
160
+ "type": {
161
+ "kind": "array",
162
+ "length": 16,
163
+ "type": {
164
+ "kind": "struct",
165
+ "path": "authwit::aztec::protocol_types::contrakt::storage_update_request::StorageUpdateRequest",
166
+ "fields": [
167
+ { "name": "storage_slot", "type": { "kind": "field" } },
168
+ { "name": "old_value", "type": { "kind": "field" } },
169
+ { "name": "new_value", "type": { "kind": "field" } }
170
+ ]
171
+ }
172
+ }
173
+ },
174
+ {
175
+ "name": "contract_storage_reads",
305
176
  "type": {
306
- "kind": "field"
177
+ "kind": "array",
178
+ "length": 16,
179
+ "type": {
180
+ "kind": "struct",
181
+ "path": "authwit::aztec::protocol_types::contrakt::storage_read::StorageRead",
182
+ "fields": [
183
+ { "name": "storage_slot", "type": { "kind": "field" } },
184
+ { "name": "current_value", "type": { "kind": "field" } }
185
+ ]
186
+ }
307
187
  }
308
- }
309
- },
310
- {
311
- "name": "new_commitments",
312
- "type": {
313
- "kind": "array",
314
- "length": 16,
188
+ },
189
+ {
190
+ "name": "public_call_stack_hashes",
191
+ "type": { "kind": "array", "length": 4, "type": { "kind": "field" } }
192
+ },
193
+ {
194
+ "name": "new_commitments",
195
+ "type": {
196
+ "kind": "array",
197
+ "length": 16,
198
+ "type": {
199
+ "kind": "struct",
200
+ "path": "authwit::aztec::protocol_types::abis::side_effect::SideEffect",
201
+ "fields": [
202
+ { "name": "value", "type": { "kind": "field" } },
203
+ { "name": "counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }
204
+ ]
205
+ }
206
+ }
207
+ },
208
+ {
209
+ "name": "new_nullifiers",
210
+ "type": {
211
+ "kind": "array",
212
+ "length": 16,
213
+ "type": {
214
+ "kind": "struct",
215
+ "path": "authwit::aztec::protocol_types::abis::side_effect::SideEffectLinkedToNoteHash",
216
+ "fields": [
217
+ { "name": "value", "type": { "kind": "field" } },
218
+ { "name": "note_hash", "type": { "kind": "field" } },
219
+ { "name": "counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }
220
+ ]
221
+ }
222
+ }
223
+ },
224
+ { "name": "new_l2_to_l1_msgs", "type": { "kind": "array", "length": 2, "type": { "kind": "field" } } },
225
+ {
226
+ "name": "unencrypted_logs_hash",
227
+ "type": { "kind": "array", "length": 2, "type": { "kind": "field" } }
228
+ },
229
+ { "name": "unencrypted_log_preimages_length", "type": { "kind": "field" } },
230
+ {
231
+ "name": "block_header",
315
232
  "type": {
316
233
  "kind": "struct",
317
- "path": "authwit::aztec::protocol_types::abis::side_effect::SideEffect",
234
+ "path": "authwit::aztec::protocol_types::abis::block_header::BlockHeader",
318
235
  "fields": [
319
- {
320
- "name": "value",
321
- "type": {
322
- "kind": "field"
323
- }
324
- },
325
- {
326
- "name": "counter",
327
- "type": {
328
- "kind": "integer",
329
- "sign": "unsigned",
330
- "width": 32
331
- }
332
- }
236
+ { "name": "note_hash_tree_root", "type": { "kind": "field" } },
237
+ { "name": "nullifier_tree_root", "type": { "kind": "field" } },
238
+ { "name": "contract_tree_root", "type": { "kind": "field" } },
239
+ { "name": "l1_to_l2_message_tree_root", "type": { "kind": "field" } },
240
+ { "name": "archive_root", "type": { "kind": "field" } },
241
+ { "name": "public_data_tree_root", "type": { "kind": "field" } },
242
+ { "name": "global_variables_hash", "type": { "kind": "field" } }
333
243
  ]
334
244
  }
245
+ },
246
+ {
247
+ "name": "prover_address",
248
+ "type": {
249
+ "kind": "struct",
250
+ "path": "authwit::aztec::protocol_types::address::AztecAddress",
251
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
252
+ }
335
253
  }
254
+ ]
255
+ },
256
+ "visibility": "public"
257
+ },
258
+ "return_witnesses": [
259
+ 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,
260
+ 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,
261
+ 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,
262
+ 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122,
263
+ 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144,
264
+ 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166,
265
+ 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188,
266
+ 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209
267
+ ]
268
+ },
269
+ "bytecode": "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",
270
+ "debug_symbols": "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hxuZw43M4UbmcCNzuJE53MgcbmQONzKHG5nDjczhRuZwI3O4kTncyBxuZA43MocbmcONzOFG5nAjc7iROdzIHG5kDjcyhxuZw43M4UbmcCNzuJE53MgcbmQONzKHG5nDjczhRuZwI3O4kTncyBxuZA43MocbmcONzOFG5nAjc7iROdzIHG5kDjcyhxuZw43M4UbmcCNzuJE53MgcbmQONzKHG5nDjczhRuZwI3O4kTncyBxuZA43MocbmcONzOFG5nAjc7iROdzIHG5kDjcyhzsPGcS9XHL0S65+iemXuH5J6Jekfknpl7R+ib79o2//6Ns/+vaPvv2jb//o2z/69o++/aNv/+jbv/r2r779q2//6tu/+vavvv2rb//q27/69q++fdO3b/r2Td++6ds3ffumb9/07Zu+fdO3b/r2Xd++69t3ffuub9/17bu+fde37/r2Xd++69sPffuhbz/07Ye+/dC3H/r2Q99+6NsPffuhbz/17ae+/dS3n/r2U99+6ttPffupbz/17ae+/dK3X/r2S99+6dsvffulb7/07Ze+/dK3X/r2W99+69tvffutb7/17be+/da33/r2W99+69sfffujb3/07Y++/dG3P/r2R9/+6Nsfffs66zs66zs66zs66zs663v5rle/JPRLUr+k9Etav0Tfvs76js76js76js76js76js76js76js76js76js76js76js76js76js76js76js76js76js76js76js76js76js76js76js76js76js76js76js76js76js76js76zvus7++98/mqlwz6xwt/+vmnrez10zb19unT9c6nb9mtzx9/+W8/b5/Pfu/m9fbhx1eD9NsBLv0ARj+A0w8Q9AMk/QBFP0DTDzDwA7z/Nx2kA9CbOOhNHPQmDnoTB72Jg97EQW/ioDdx0Js46U2c9CZOehMnvYmT3sRJb+KkN3HSmzjpTZz0Ji56Exe9iYvexEVv4qI3cdGbuOhNXPQmLnoTF72Jm97ETW/ipjdx05u46U3c9CZuehM3vYmb3sRNb+KhN/HQm3joTTz0Jh56Ew+9iYfexENv4qE38cCb+D7gTXwf8Ca+D3gT3we8ie8D3sT3AW/i+4A38X3Am/g+4E18H/QmPvQmPvQmPvQmPvQmPvQmPvQmPvQmPvQmPvQmPvQmvvQmvvQmvvQmvvQmvvQmvvQmvvQmvvQmvvQmvvQmNnoTG72Jjd7ERm9iozex0ZvY6E1s9CY2ehMbvYmd3sR0x9alO7Yu3bF16Y6tS3dsXbpj69IdW5fu2Lp0x9alO7Yu3bF16Y6tS3dsXbpj69IdW5fu2Lp0x9alO7Yu3bF16Y6tS3dsXbpj69IdW5fu2Lp0x9alO7Yu3bF16Y6tS3dsXbpj69IdW5fu2Lp0x9alO7Yu3bF16Y6tS3dsXbpj69IdW5fu2Lp0x9alO7Yu3bF16Y6tS3dsXbpj69IdW5fu2Lp0x9alO7Yu3bF16Y6tS3dsXbpj69IdW5fu2Lp0x9alO7Yu3bFldMeW0R1bRndsGd2xZQ94ExvdsWV0x5bRHVtGd2wZ3bFldMeW0R1bRndsGd2xZXTHltEdW0Z3bBndsWV0x5bRHVtGd2wZ3bFldMeW0R1bRndsGd2xZXTHltEdW0Z3bBndsWV0x5bRHVtGd2wZ3bFldMeW0R1bRndsGd2xZXTHltEdW0Z3bBndsWV0x5bRHVtGd2wZ3bFldMeW0R1bRndsGd2xZXTHltEdW0Z3bBndsWV0x5bRHVtGd2wZ3bFldMeW0R1bRndsGd2xZXTHltEdW0Z3bBndsWV0x5bRHVtGd2wZ3bFldMeW0R1bRndsGd2xZXTHltEdW0Z3bBndsWV0x5bRHVtGd2wZ3bFldMeW0R1bRndsGd2xZXTHltEdW0Z3bBndsWV0x5bRHVtGd2wZ3bFldMeW0R1bRndsGd2xZXTHltEdW053bDndseV0x5bTHVv+gDex0x1bTndsOd2x5XTHltMdW053bDndseV0x5bTHVtOd2w53bHldMeW0x1bTndsOd2x5XTHltMdW053bDndseV0x5bTHVtOd2w53bHldMeW0x1bTndsOd2x5XTHltMdW053bDndseV0x5bTHVtOd2w53bHldMeW0x1bTndsOd2x5XTHltMdW053bDndseV0x5bTHVtOd2w53bHldMeW0x1bTndsOd2x5XTHltMdW053bDndseV0x5bTHVtOd2w53bHldMeW0x1bTndsOd2x5XTHltMdW053bDndseV0x5bTHVtOd2w53bHldMeW0x1bTndsOd2x5XTHltMdW053bDndseV0x5bTHVtOd2w53bHldMeW0x1bTndsOd2x5XTHltMdW053bDndseV0x5bTHVtOd2w53bEVdMdW0B1bQXdsBd2xFQ94EwfdsRV0x1bQHVtBd2wF3bEVdMdW0B1bQXdsBd2xFXTHVtAdW0F3bAXdsRV0x1bQHVtBd2wF3bEVdMdW0B1bQXdsBd2xFXTHVtAdW0F3bAXdsRV0x1bQHVtBd2wF3bEVdMdW0B1bQXdsBd2xFXTHVtAdW0F3bAXdsRV0x1bQHVtBd2wF3bEVdMdW0B1bQXdsBd2xFXTHVtAdW0F3bAXdsRV0x1bQHVtBd2wF3bEVdMdW0B1bQXdsBd2xFXTHVtAdW0F3bAXdsRV0x1bQHVtBd2wF3bEVdMdW0B1bQXdsBd2xFXTHVtAdW0F3bAXdsRV0x1bQHVtBd2wF3bEVdMdW0B1bQXdsBd2xFXTHVtAdW0F3bAXdsRV0x1bQHVtBd2wF3bEVdMdW0B1bQXdsBd2xFXTHVtAdW0l3bCXdsZV0x1bSHVv5gDdx0h1bSXdsJd2xlXTHVtIdW0l3bCXdsZV0x1bSHVtJd2wl3bGVdMdW0h1bSXdsJd2xlXTHVtIdW0l3bCXdsZV0x1bSHVtJd2wl3bGVdMdW0h1bSXdsJd2xlXTHVtIdW0l3bCXdsZV0x1bSHVtJd2wl3bGVdMdW0h1bSXdsJd2xlXTHVtIdW0l3bCXdsZV0x1bSHVtJd2wl3bGVdMdW0h1bSXdsJd2xlXTHVtIdW0l3bCXdsZV0x1bSHVtJd2wl3bGVdMdW0h1bSXdsJd2xlXTHVtIdW0l3bCXdsZV0x1bSHVtJd2wl3bGVdMdW0h1bSXdsJd2xlXTHVtIdW0l3bCXdsZV0x1bSHVtJd2wl3bGVdMdW0h1bSXdsJd2xlXTHVtIdW0l3bCXdsZV0x1bSHVtJd2wl3bFVdMdW0R1bRXdsFd2xVQ94ExfdsVV0x1bRHVtFd2wV3bFVdMdW0R1bRXdsFd2xVXTHVtEdW0V3bBXdsVV0x1bRHVtFd2wV3bFVdMdW0R1bRXdsFd2xVXTHVtEdW0V3bBXdsVV0x1bRHVtFd2wV3bFVdMdW0R1bRXdsFd2xVXTHVtEdW0V3bBXdsVV0x1bRHVtFd2wV3bFVdMdW0R1bRXdsFd2xVXTHVtEdW0V3bBXdsVV0x1bRHVtFd2wV3bFVdMdW0R1bRXdsFd2xVXTHVtEdW0V3bBXdsVV0x1bRHVtFd2wV3bFVdMdW0R1bRXdsFd2xVXTHVtEdW0V3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"
271
+ },
272
+ {
273
+ "name": "set_is_valid_storage",
274
+ "function_type": "Open",
275
+ "is_internal": true,
276
+ "abi": {
277
+ "parameters": [
278
+ {
279
+ "name": "inputs",
280
+ "type": {
281
+ "kind": "struct",
282
+ "path": "authwit::aztec::abi::PublicContextInputs",
283
+ "fields": [
284
+ {
285
+ "name": "call_context",
286
+ "type": {
287
+ "kind": "struct",
288
+ "path": "authwit::aztec::protocol_types::abis::call_context::CallContext",
289
+ "fields": [
290
+ {
291
+ "name": "msg_sender",
292
+ "type": {
293
+ "kind": "struct",
294
+ "path": "authwit::aztec::protocol_types::address::AztecAddress",
295
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
296
+ }
297
+ },
298
+ {
299
+ "name": "storage_contract_address",
300
+ "type": {
301
+ "kind": "struct",
302
+ "path": "authwit::aztec::protocol_types::address::AztecAddress",
303
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
304
+ }
305
+ },
306
+ {
307
+ "name": "portal_contract_address",
308
+ "type": {
309
+ "kind": "struct",
310
+ "path": "authwit::aztec::protocol_types::address::EthAddress",
311
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
312
+ }
313
+ },
314
+ {
315
+ "name": "function_selector",
316
+ "type": {
317
+ "kind": "struct",
318
+ "path": "authwit::aztec::protocol_types::abis::function_selector::FunctionSelector",
319
+ "fields": [
320
+ { "name": "inner", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }
321
+ ]
322
+ }
323
+ },
324
+ { "name": "is_delegate_call", "type": { "kind": "boolean" } },
325
+ { "name": "is_static_call", "type": { "kind": "boolean" } },
326
+ { "name": "is_contract_deployment", "type": { "kind": "boolean" } },
327
+ {
328
+ "name": "start_side_effect_counter",
329
+ "type": { "kind": "integer", "sign": "unsigned", "width": 32 }
330
+ }
331
+ ]
332
+ }
333
+ },
334
+ {
335
+ "name": "block_header",
336
+ "type": {
337
+ "kind": "struct",
338
+ "path": "authwit::aztec::protocol_types::abis::block_header::BlockHeader",
339
+ "fields": [
340
+ { "name": "note_hash_tree_root", "type": { "kind": "field" } },
341
+ { "name": "nullifier_tree_root", "type": { "kind": "field" } },
342
+ { "name": "contract_tree_root", "type": { "kind": "field" } },
343
+ { "name": "l1_to_l2_message_tree_root", "type": { "kind": "field" } },
344
+ { "name": "archive_root", "type": { "kind": "field" } },
345
+ { "name": "public_data_tree_root", "type": { "kind": "field" } },
346
+ { "name": "global_variables_hash", "type": { "kind": "field" } }
347
+ ]
348
+ }
349
+ },
350
+ {
351
+ "name": "public_global_variables",
352
+ "type": {
353
+ "kind": "struct",
354
+ "path": "authwit::aztec::abi::PublicGlobalVariables",
355
+ "fields": [
356
+ { "name": "chain_id", "type": { "kind": "field" } },
357
+ { "name": "version", "type": { "kind": "field" } },
358
+ { "name": "block_number", "type": { "kind": "field" } },
359
+ { "name": "timestamp", "type": { "kind": "field" } }
360
+ ]
361
+ }
362
+ }
363
+ ]
336
364
  },
337
- {
338
- "name": "new_nullifiers",
339
- "type": {
340
- "kind": "array",
341
- "length": 16,
365
+ "visibility": "private"
366
+ },
367
+ { "name": "message_hash", "type": { "kind": "field" }, "visibility": "private" },
368
+ { "name": "value", "type": { "kind": "boolean" }, "visibility": "private" }
369
+ ],
370
+ "param_witnesses": {
371
+ "inputs": [{ "start": 0, "end": 19 }],
372
+ "message_hash": [{ "start": 19, "end": 20 }],
373
+ "value": [{ "start": 20, "end": 21 }]
374
+ },
375
+ "return_type": {
376
+ "abi_type": {
377
+ "kind": "struct",
378
+ "path": "authwit::aztec::protocol_types::abis::public_circuit_public_inputs::PublicCircuitPublicInputs",
379
+ "fields": [
380
+ {
381
+ "name": "call_context",
342
382
  "type": {
343
383
  "kind": "struct",
344
- "path": "authwit::aztec::protocol_types::abis::side_effect::SideEffectLinkedToNoteHash",
384
+ "path": "authwit::aztec::protocol_types::abis::call_context::CallContext",
345
385
  "fields": [
346
386
  {
347
- "name": "value",
387
+ "name": "msg_sender",
388
+ "type": {
389
+ "kind": "struct",
390
+ "path": "authwit::aztec::protocol_types::address::AztecAddress",
391
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
392
+ }
393
+ },
394
+ {
395
+ "name": "storage_contract_address",
348
396
  "type": {
349
- "kind": "field"
397
+ "kind": "struct",
398
+ "path": "authwit::aztec::protocol_types::address::AztecAddress",
399
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
350
400
  }
351
401
  },
352
402
  {
353
- "name": "note_hash",
403
+ "name": "portal_contract_address",
354
404
  "type": {
355
- "kind": "field"
405
+ "kind": "struct",
406
+ "path": "authwit::aztec::protocol_types::address::EthAddress",
407
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
356
408
  }
357
409
  },
358
410
  {
359
- "name": "counter",
411
+ "name": "function_selector",
360
412
  "type": {
361
- "kind": "integer",
362
- "sign": "unsigned",
363
- "width": 32
413
+ "kind": "struct",
414
+ "path": "authwit::aztec::protocol_types::abis::function_selector::FunctionSelector",
415
+ "fields": [{ "name": "inner", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }]
364
416
  }
417
+ },
418
+ { "name": "is_delegate_call", "type": { "kind": "boolean" } },
419
+ { "name": "is_static_call", "type": { "kind": "boolean" } },
420
+ { "name": "is_contract_deployment", "type": { "kind": "boolean" } },
421
+ {
422
+ "name": "start_side_effect_counter",
423
+ "type": { "kind": "integer", "sign": "unsigned", "width": 32 }
365
424
  }
366
425
  ]
367
426
  }
368
- }
369
- },
370
- {
371
- "name": "new_l2_to_l1_msgs",
372
- "type": {
373
- "kind": "array",
374
- "length": 2,
427
+ },
428
+ { "name": "args_hash", "type": { "kind": "field" } },
429
+ { "name": "return_values", "type": { "kind": "array", "length": 4, "type": { "kind": "field" } } },
430
+ {
431
+ "name": "contract_storage_update_requests",
375
432
  "type": {
376
- "kind": "field"
433
+ "kind": "array",
434
+ "length": 16,
435
+ "type": {
436
+ "kind": "struct",
437
+ "path": "authwit::aztec::protocol_types::contrakt::storage_update_request::StorageUpdateRequest",
438
+ "fields": [
439
+ { "name": "storage_slot", "type": { "kind": "field" } },
440
+ { "name": "old_value", "type": { "kind": "field" } },
441
+ { "name": "new_value", "type": { "kind": "field" } }
442
+ ]
443
+ }
377
444
  }
378
- }
379
- },
380
- {
381
- "name": "unencrypted_logs_hash",
382
- "type": {
383
- "kind": "array",
384
- "length": 2,
445
+ },
446
+ {
447
+ "name": "contract_storage_reads",
385
448
  "type": {
386
- "kind": "field"
449
+ "kind": "array",
450
+ "length": 16,
451
+ "type": {
452
+ "kind": "struct",
453
+ "path": "authwit::aztec::protocol_types::contrakt::storage_read::StorageRead",
454
+ "fields": [
455
+ { "name": "storage_slot", "type": { "kind": "field" } },
456
+ { "name": "current_value", "type": { "kind": "field" } }
457
+ ]
458
+ }
387
459
  }
388
- }
389
- },
390
- {
391
- "name": "unencrypted_log_preimages_length",
392
- "type": {
393
- "kind": "field"
394
- }
395
- },
396
- {
397
- "name": "block_header",
398
- "type": {
399
- "kind": "struct",
400
- "path": "authwit::aztec::protocol_types::abis::block_header::BlockHeader",
401
- "fields": [
402
- {
403
- "name": "note_hash_tree_root",
404
- "type": {
405
- "kind": "field"
406
- }
407
- },
408
- {
409
- "name": "nullifier_tree_root",
410
- "type": {
411
- "kind": "field"
412
- }
413
- },
414
- {
415
- "name": "contract_tree_root",
416
- "type": {
417
- "kind": "field"
418
- }
419
- },
420
- {
421
- "name": "l1_to_l2_message_tree_root",
422
- "type": {
423
- "kind": "field"
424
- }
425
- },
426
- {
427
- "name": "archive_root",
428
- "type": {
429
- "kind": "field"
430
- }
431
- },
432
- {
433
- "name": "public_data_tree_root",
434
- "type": {
435
- "kind": "field"
436
- }
437
- },
438
- {
439
- "name": "global_variables_hash",
440
- "type": {
441
- "kind": "field"
442
- }
460
+ },
461
+ {
462
+ "name": "public_call_stack_hashes",
463
+ "type": { "kind": "array", "length": 4, "type": { "kind": "field" } }
464
+ },
465
+ {
466
+ "name": "new_commitments",
467
+ "type": {
468
+ "kind": "array",
469
+ "length": 16,
470
+ "type": {
471
+ "kind": "struct",
472
+ "path": "authwit::aztec::protocol_types::abis::side_effect::SideEffect",
473
+ "fields": [
474
+ { "name": "value", "type": { "kind": "field" } },
475
+ { "name": "counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }
476
+ ]
443
477
  }
444
- ]
445
- }
446
- },
447
- {
448
- "name": "prover_address",
449
- "type": {
450
- "kind": "struct",
451
- "path": "authwit::aztec::protocol_types::address::AztecAddress",
452
- "fields": [
453
- {
454
- "name": "inner",
455
- "type": {
456
- "kind": "field"
457
- }
478
+ }
479
+ },
480
+ {
481
+ "name": "new_nullifiers",
482
+ "type": {
483
+ "kind": "array",
484
+ "length": 16,
485
+ "type": {
486
+ "kind": "struct",
487
+ "path": "authwit::aztec::protocol_types::abis::side_effect::SideEffectLinkedToNoteHash",
488
+ "fields": [
489
+ { "name": "value", "type": { "kind": "field" } },
490
+ { "name": "note_hash", "type": { "kind": "field" } },
491
+ { "name": "counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }
492
+ ]
458
493
  }
459
- ]
494
+ }
495
+ },
496
+ { "name": "new_l2_to_l1_msgs", "type": { "kind": "array", "length": 2, "type": { "kind": "field" } } },
497
+ {
498
+ "name": "unencrypted_logs_hash",
499
+ "type": { "kind": "array", "length": 2, "type": { "kind": "field" } }
500
+ },
501
+ { "name": "unencrypted_log_preimages_length", "type": { "kind": "field" } },
502
+ {
503
+ "name": "block_header",
504
+ "type": {
505
+ "kind": "struct",
506
+ "path": "authwit::aztec::protocol_types::abis::block_header::BlockHeader",
507
+ "fields": [
508
+ { "name": "note_hash_tree_root", "type": { "kind": "field" } },
509
+ { "name": "nullifier_tree_root", "type": { "kind": "field" } },
510
+ { "name": "contract_tree_root", "type": { "kind": "field" } },
511
+ { "name": "l1_to_l2_message_tree_root", "type": { "kind": "field" } },
512
+ { "name": "archive_root", "type": { "kind": "field" } },
513
+ { "name": "public_data_tree_root", "type": { "kind": "field" } },
514
+ { "name": "global_variables_hash", "type": { "kind": "field" } }
515
+ ]
516
+ }
517
+ },
518
+ {
519
+ "name": "prover_address",
520
+ "type": {
521
+ "kind": "struct",
522
+ "path": "authwit::aztec::protocol_types::address::AztecAddress",
523
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
524
+ }
460
525
  }
461
- }
462
- ]
463
- }
464
- ],
465
- "bytecode": "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",
466
- "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f"
467
- },
468
- {
469
- "name": "set_is_valid_storage",
470
- "functionType": "open",
471
- "isInternal": true,
472
- "parameters": [
473
- {
474
- "name": "message_hash",
475
- "type": {
476
- "kind": "field"
526
+ ]
477
527
  },
478
- "visibility": "private"
528
+ "visibility": "public"
479
529
  },
480
- {
481
- "name": "value",
482
- "type": {
483
- "kind": "boolean"
484
- },
485
- "visibility": "private"
486
- }
487
- ],
488
- "returnTypes": [
489
- {
490
- "kind": "struct",
491
- "path": "authwit::aztec::protocol_types::abis::public_circuit_public_inputs::PublicCircuitPublicInputs",
492
- "fields": [
493
- {
494
- "name": "call_context",
495
- "type": {
496
- "kind": "struct",
497
- "path": "authwit::aztec::protocol_types::abis::call_context::CallContext",
498
- "fields": [
499
- {
500
- "name": "msg_sender",
501
- "type": {
502
- "kind": "struct",
503
- "path": "authwit::aztec::protocol_types::address::AztecAddress",
504
- "fields": [
505
- {
506
- "name": "inner",
507
- "type": {
508
- "kind": "field"
509
- }
530
+ "return_witnesses": [
531
+ 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,
532
+ 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,
533
+ 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,
534
+ 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123,
535
+ 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145,
536
+ 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167,
537
+ 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189,
538
+ 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210
539
+ ]
540
+ },
541
+ "bytecode": "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",
542
+ "debug_symbols": "5Z3LbmbXcUbfpcdCcPauu18lyMDIBQhg2EHsmeF3DwU02W2YirSckKoPHqlBnH1UW9X/V9TqrsU/f/ndH/71t3/6zz/8/o9ffvPnL88/1f3ym3/+85c//tdvf//jF/74p9/+95++/Ob54cu///7fXv75lx++/Md//u7fv/zmnvOXf/nhxwNGDzg9EPRA0gNFDzQ9ML/8wA9/89ypzK+Pnhp/e9q/vr2fD337+dC33w99u33o2/1D3x4f+vb80LfXh769P/TtH/pZnQ/9rM6HflbnQz+r86Gf1fnQz+p86Gd1PvSzOh/6WZ0P/azOh35Wz/N87OvPx77+fuzr/0+f1/s88fXR+9z6/vXv1eL2Vot/q+U89VqMbyomNhWTm4qpTcX0pmJmUTHn2VTM2VTM3VTMpgQ+mxL4bErgsymBz6YEPpsS+GxK4Lspge+mBL6bEvhuSuC7KYHvpgS+mxL4bkrguymB76YEtk0JbJsS2DYlsG1KYNuUwLYpgW1TAtumBLZNCWybEtg3JbBvSmDflMC+KYF9UwL7pgT2TQnsmxLYNyWwb0rg2JTAsSmBY1MCx6YEjk0JHJsSODYlcGxK4NiUwLEpgXNTAuemBM5NCZybEjg3JXBuSuDclMC5KYFzUwLnpgSuTQlcmxK4NiVwbUrg2pTAtSmBa1MC16YErk0JXJsSuDclcH/mR3te33v6x9f9bTGxqZjP+w18/a1NL798t02zqJh5NhVzNhVzNxXzed9C9Atl+Ppwv/xv9XfFvP7t+vFNxcQntqn69eGw/qs2sae/lp66pdfS0s8z9frucx6b94pv5eJHt/j70BXu+xg+4fhE4BOJTxQ+0fjE0BNkmeLriYNP4J4f3PODe35wzw/u+cE9P7jnB/f84p5f3POLe35xzy/u+cU9v7jnF/f84p5f3HPDPTfcc8M9N9xzwz033HPDPTfcc8M9N9xzxz133HPHPXfcc8c9d9xzxz133HPHPXfc88A9D9zzwD0P3PPAPQ/c88A9D9zzwD0P3PPEPU/c88Q9T9zzxD1P3PPEPU/c88Q9T9zzwj0v3HOs27rYt3WxcOti49bFyq2LnVsXS7du4Z437nnjnjfueeOeN+5545437nnjnjfueeOeD+754J4P7vngng/u+eCeD+754J4P7vnQntvz4BMHn7j4hOETjk8EPpH4ROETjU/gnmMOZ5jDGeZwhjmcYQ5nmMMZ5nCGOZxhDmeYwxnmcIY5nGEOZ5jDGeZwhjmcYQ5nmMMZ5nCGOZxhDmeYwxnmcIY5nGEOZ5jDGeZwhjmcYQ5nmMMZ5nCGOZxhDmeYwxnmcIY5nGEOZ5jDGeZwhjmcYQ5nmMMZ5nCGOZxhDmeYwxnmcIY5nGEOZ5jDGeZwhjmcYQ5nmMMZ5nCGOZxhDmeYwxnmcIY5nGEOZ5jDGeZwhjmcYQ5nmMMZ5nCGOZxhDmeYwxnmcIY5nGEOZ5jDGeZwhjmcYQ5nmMMZ5nCGOZxhDmeYwxnmcIY5nGEOZ5jDGeZwhjmcYQ5nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwwXmcIE5XGAOF5jDBeZwgTlcYA4XmMMF5nCBOVxgDheYwwXmcIE5XGAOF5jDBeZwgTlcYA4XmMMF5nCBOVxgDheYwwXmcIE5XGAOF5jDBeZwgTlcYA4XmMMF5nCBOVxgDheYwwXmcIE5XGAOF5jDBeZwgTlcYA4XmMMF5nCBOVxgDheYwwXmcIE5XGAOF5jDBeZwgTlcYA4XmMMF5nCBOVxgDheYwwXmcIE5XGAOF5jDBeZwgTlcYA4XmMMF5nCBOVxgDheYwwXmcIE5XGAOF5jDBeZwgTlcYA4XmMMF5nCBOVxgDheYwwXmcIE5XGAOF5jDBeZwgTlcYA4XmMMF5nCBOVxgDheYwwXmcIE5XGAOF5jDJeZwiTlcYg6XmMMl5nCJOVxiDpeYwyXmcIk5XGIOl5jDJeZwiTlcYg6XmMMl5nCJOVxiDpeYwyXmcIk5XGIOl5jDJeZwiTlcYg6XmMMl5nCJOVxiDpeYwyXmcIk5XGIOl5jDJeZwiTlc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"
543
+ },
544
+ {
545
+ "name": "entrypoint",
546
+ "function_type": "Secret",
547
+ "is_internal": false,
548
+ "abi": {
549
+ "parameters": [
550
+ {
551
+ "name": "inputs",
552
+ "type": {
553
+ "kind": "struct",
554
+ "path": "authwit::aztec::abi::PrivateContextInputs",
555
+ "fields": [
556
+ {
557
+ "name": "call_context",
558
+ "type": {
559
+ "kind": "struct",
560
+ "path": "authwit::aztec::protocol_types::abis::call_context::CallContext",
561
+ "fields": [
562
+ {
563
+ "name": "msg_sender",
564
+ "type": {
565
+ "kind": "struct",
566
+ "path": "authwit::aztec::protocol_types::address::AztecAddress",
567
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
510
568
  }
511
- ]
512
- }
513
- },
514
- {
515
- "name": "storage_contract_address",
516
- "type": {
517
- "kind": "struct",
518
- "path": "authwit::aztec::protocol_types::address::AztecAddress",
519
- "fields": [
520
- {
521
- "name": "inner",
522
- "type": {
523
- "kind": "field"
524
- }
569
+ },
570
+ {
571
+ "name": "storage_contract_address",
572
+ "type": {
573
+ "kind": "struct",
574
+ "path": "authwit::aztec::protocol_types::address::AztecAddress",
575
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
525
576
  }
526
- ]
527
- }
528
- },
529
- {
530
- "name": "portal_contract_address",
577
+ },
578
+ {
579
+ "name": "portal_contract_address",
580
+ "type": {
581
+ "kind": "struct",
582
+ "path": "authwit::aztec::protocol_types::address::EthAddress",
583
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
584
+ }
585
+ },
586
+ {
587
+ "name": "function_selector",
588
+ "type": {
589
+ "kind": "struct",
590
+ "path": "authwit::aztec::protocol_types::abis::function_selector::FunctionSelector",
591
+ "fields": [
592
+ { "name": "inner", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }
593
+ ]
594
+ }
595
+ },
596
+ { "name": "is_delegate_call", "type": { "kind": "boolean" } },
597
+ { "name": "is_static_call", "type": { "kind": "boolean" } },
598
+ { "name": "is_contract_deployment", "type": { "kind": "boolean" } },
599
+ {
600
+ "name": "start_side_effect_counter",
601
+ "type": { "kind": "integer", "sign": "unsigned", "width": 32 }
602
+ }
603
+ ]
604
+ }
605
+ },
606
+ {
607
+ "name": "block_header",
608
+ "type": {
609
+ "kind": "struct",
610
+ "path": "authwit::aztec::protocol_types::abis::block_header::BlockHeader",
611
+ "fields": [
612
+ { "name": "note_hash_tree_root", "type": { "kind": "field" } },
613
+ { "name": "nullifier_tree_root", "type": { "kind": "field" } },
614
+ { "name": "contract_tree_root", "type": { "kind": "field" } },
615
+ { "name": "l1_to_l2_message_tree_root", "type": { "kind": "field" } },
616
+ { "name": "archive_root", "type": { "kind": "field" } },
617
+ { "name": "public_data_tree_root", "type": { "kind": "field" } },
618
+ { "name": "global_variables_hash", "type": { "kind": "field" } }
619
+ ]
620
+ }
621
+ },
622
+ {
623
+ "name": "contract_deployment_data",
624
+ "type": {
625
+ "kind": "struct",
626
+ "path": "authwit::aztec::protocol_types::contrakt::deployment_data::ContractDeploymentData",
627
+ "fields": [
628
+ {
629
+ "name": "deployer_public_key",
630
+ "type": {
631
+ "kind": "struct",
632
+ "path": "authwit::aztec::protocol_types::grumpkin_point::GrumpkinPoint",
633
+ "fields": [
634
+ { "name": "x", "type": { "kind": "field" } },
635
+ { "name": "y", "type": { "kind": "field" } }
636
+ ]
637
+ }
638
+ },
639
+ { "name": "constructor_vk_hash", "type": { "kind": "field" } },
640
+ { "name": "function_tree_root", "type": { "kind": "field" } },
641
+ { "name": "contract_address_salt", "type": { "kind": "field" } },
642
+ {
643
+ "name": "portal_contract_address",
644
+ "type": {
645
+ "kind": "struct",
646
+ "path": "authwit::aztec::protocol_types::address::EthAddress",
647
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
648
+ }
649
+ }
650
+ ]
651
+ }
652
+ },
653
+ {
654
+ "name": "private_global_variables",
655
+ "type": {
656
+ "kind": "struct",
657
+ "path": "authwit::aztec::abi::PrivateGlobalVariables",
658
+ "fields": [
659
+ { "name": "chain_id", "type": { "kind": "field" } },
660
+ { "name": "version", "type": { "kind": "field" } }
661
+ ]
662
+ }
663
+ }
664
+ ]
665
+ },
666
+ "visibility": "private"
667
+ },
668
+ {
669
+ "name": "payload",
670
+ "type": {
671
+ "kind": "struct",
672
+ "path": "authwit::entrypoint::EntrypointPayload",
673
+ "fields": [
674
+ {
675
+ "name": "function_calls",
676
+ "type": {
677
+ "kind": "array",
678
+ "length": 4,
531
679
  "type": {
532
680
  "kind": "struct",
533
- "path": "authwit::aztec::protocol_types::address::EthAddress",
681
+ "path": "authwit::entrypoint::FunctionCall",
534
682
  "fields": [
683
+ { "name": "args_hash", "type": { "kind": "field" } },
535
684
  {
536
- "name": "inner",
685
+ "name": "function_selector",
537
686
  "type": {
538
- "kind": "field"
687
+ "kind": "struct",
688
+ "path": "authwit::aztec::protocol_types::abis::function_selector::FunctionSelector",
689
+ "fields": [
690
+ { "name": "inner", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }
691
+ ]
539
692
  }
540
- }
541
- ]
542
- }
543
- },
544
- {
545
- "name": "function_selector",
546
- "type": {
547
- "kind": "struct",
548
- "path": "authwit::aztec::protocol_types::abis::function_selector::FunctionSelector",
549
- "fields": [
693
+ },
550
694
  {
551
- "name": "inner",
695
+ "name": "target_address",
552
696
  "type": {
553
- "kind": "integer",
554
- "sign": "unsigned",
555
- "width": 32
697
+ "kind": "struct",
698
+ "path": "authwit::aztec::protocol_types::address::AztecAddress",
699
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
556
700
  }
557
- }
701
+ },
702
+ { "name": "is_public", "type": { "kind": "boolean" } }
558
703
  ]
559
704
  }
560
- },
561
- {
562
- "name": "is_delegate_call",
563
- "type": {
564
- "kind": "boolean"
565
- }
566
- },
567
- {
568
- "name": "is_static_call",
569
- "type": {
570
- "kind": "boolean"
571
- }
572
- },
573
- {
574
- "name": "is_contract_deployment",
575
- "type": {
576
- "kind": "boolean"
577
- }
578
- },
579
- {
580
- "name": "start_side_effect_counter",
581
- "type": {
582
- "kind": "integer",
583
- "sign": "unsigned",
584
- "width": 32
585
- }
586
705
  }
587
- ]
588
- }
589
- },
590
- {
591
- "name": "args_hash",
592
- "type": {
593
- "kind": "field"
594
- }
706
+ },
707
+ { "name": "nonce", "type": { "kind": "field" } }
708
+ ]
595
709
  },
596
- {
597
- "name": "return_values",
598
- "type": {
599
- "kind": "array",
600
- "length": 4,
601
- "type": {
602
- "kind": "field"
603
- }
604
- }
605
- },
606
- {
607
- "name": "contract_storage_update_requests",
608
- "type": {
609
- "kind": "array",
610
- "length": 16,
710
+ "visibility": "public"
711
+ }
712
+ ],
713
+ "param_witnesses": { "inputs": [{ "start": 0, "end": 23 }], "payload": [{ "start": 23, "end": 40 }] },
714
+ "return_type": {
715
+ "abi_type": {
716
+ "kind": "struct",
717
+ "path": "authwit::aztec::protocol_types::abis::private_circuit_public_inputs::PrivateCircuitPublicInputs",
718
+ "fields": [
719
+ {
720
+ "name": "call_context",
611
721
  "type": {
612
722
  "kind": "struct",
613
- "path": "authwit::aztec::protocol_types::contrakt::storage_update_request::StorageUpdateRequest",
723
+ "path": "authwit::aztec::protocol_types::abis::call_context::CallContext",
614
724
  "fields": [
615
725
  {
616
- "name": "storage_slot",
726
+ "name": "msg_sender",
617
727
  "type": {
618
- "kind": "field"
728
+ "kind": "struct",
729
+ "path": "authwit::aztec::protocol_types::address::AztecAddress",
730
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
619
731
  }
620
732
  },
621
733
  {
622
- "name": "old_value",
734
+ "name": "storage_contract_address",
623
735
  "type": {
624
- "kind": "field"
736
+ "kind": "struct",
737
+ "path": "authwit::aztec::protocol_types::address::AztecAddress",
738
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
625
739
  }
626
740
  },
627
741
  {
628
- "name": "new_value",
742
+ "name": "portal_contract_address",
629
743
  "type": {
630
- "kind": "field"
744
+ "kind": "struct",
745
+ "path": "authwit::aztec::protocol_types::address::EthAddress",
746
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
631
747
  }
632
- }
633
- ]
634
- }
635
- }
636
- },
637
- {
638
- "name": "contract_storage_reads",
639
- "type": {
640
- "kind": "array",
641
- "length": 16,
642
- "type": {
643
- "kind": "struct",
644
- "path": "authwit::aztec::protocol_types::contrakt::storage_read::StorageRead",
645
- "fields": [
748
+ },
646
749
  {
647
- "name": "storage_slot",
750
+ "name": "function_selector",
648
751
  "type": {
649
- "kind": "field"
752
+ "kind": "struct",
753
+ "path": "authwit::aztec::protocol_types::abis::function_selector::FunctionSelector",
754
+ "fields": [{ "name": "inner", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }]
650
755
  }
651
756
  },
757
+ { "name": "is_delegate_call", "type": { "kind": "boolean" } },
758
+ { "name": "is_static_call", "type": { "kind": "boolean" } },
759
+ { "name": "is_contract_deployment", "type": { "kind": "boolean" } },
652
760
  {
653
- "name": "current_value",
654
- "type": {
655
- "kind": "field"
656
- }
761
+ "name": "start_side_effect_counter",
762
+ "type": { "kind": "integer", "sign": "unsigned", "width": 32 }
657
763
  }
658
764
  ]
659
765
  }
660
- }
661
- },
662
- {
663
- "name": "public_call_stack_hashes",
664
- "type": {
665
- "kind": "array",
666
- "length": 4,
766
+ },
767
+ { "name": "args_hash", "type": { "kind": "field" } },
768
+ { "name": "return_values", "type": { "kind": "array", "length": 4, "type": { "kind": "field" } } },
769
+ {
770
+ "name": "read_requests",
771
+ "type": {
772
+ "kind": "array",
773
+ "length": 32,
774
+ "type": {
775
+ "kind": "struct",
776
+ "path": "authwit::aztec::protocol_types::abis::side_effect::SideEffect",
777
+ "fields": [
778
+ { "name": "value", "type": { "kind": "field" } },
779
+ { "name": "counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }
780
+ ]
781
+ }
782
+ }
783
+ },
784
+ {
785
+ "name": "new_commitments",
667
786
  "type": {
668
- "kind": "field"
787
+ "kind": "array",
788
+ "length": 16,
789
+ "type": {
790
+ "kind": "struct",
791
+ "path": "authwit::aztec::protocol_types::abis::side_effect::SideEffect",
792
+ "fields": [
793
+ { "name": "value", "type": { "kind": "field" } },
794
+ { "name": "counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }
795
+ ]
796
+ }
669
797
  }
670
- }
671
- },
672
- {
673
- "name": "new_commitments",
674
- "type": {
675
- "kind": "array",
676
- "length": 16,
798
+ },
799
+ {
800
+ "name": "new_nullifiers",
801
+ "type": {
802
+ "kind": "array",
803
+ "length": 16,
804
+ "type": {
805
+ "kind": "struct",
806
+ "path": "authwit::aztec::protocol_types::abis::side_effect::SideEffectLinkedToNoteHash",
807
+ "fields": [
808
+ { "name": "value", "type": { "kind": "field" } },
809
+ { "name": "note_hash", "type": { "kind": "field" } },
810
+ { "name": "counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }
811
+ ]
812
+ }
813
+ }
814
+ },
815
+ {
816
+ "name": "private_call_stack_hashes",
817
+ "type": { "kind": "array", "length": 4, "type": { "kind": "field" } }
818
+ },
819
+ {
820
+ "name": "public_call_stack_hashes",
821
+ "type": { "kind": "array", "length": 4, "type": { "kind": "field" } }
822
+ },
823
+ { "name": "new_l2_to_l1_msgs", "type": { "kind": "array", "length": 2, "type": { "kind": "field" } } },
824
+ { "name": "end_side_effect_counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } },
825
+ { "name": "encrypted_logs_hash", "type": { "kind": "array", "length": 2, "type": { "kind": "field" } } },
826
+ {
827
+ "name": "unencrypted_logs_hash",
828
+ "type": { "kind": "array", "length": 2, "type": { "kind": "field" } }
829
+ },
830
+ { "name": "encrypted_log_preimages_length", "type": { "kind": "field" } },
831
+ { "name": "unencrypted_log_preimages_length", "type": { "kind": "field" } },
832
+ {
833
+ "name": "block_header",
677
834
  "type": {
678
835
  "kind": "struct",
679
- "path": "authwit::aztec::protocol_types::abis::side_effect::SideEffect",
836
+ "path": "authwit::aztec::protocol_types::abis::block_header::BlockHeader",
680
837
  "fields": [
681
- {
682
- "name": "value",
683
- "type": {
684
- "kind": "field"
685
- }
686
- },
687
- {
688
- "name": "counter",
689
- "type": {
690
- "kind": "integer",
691
- "sign": "unsigned",
692
- "width": 32
693
- }
694
- }
838
+ { "name": "note_hash_tree_root", "type": { "kind": "field" } },
839
+ { "name": "nullifier_tree_root", "type": { "kind": "field" } },
840
+ { "name": "contract_tree_root", "type": { "kind": "field" } },
841
+ { "name": "l1_to_l2_message_tree_root", "type": { "kind": "field" } },
842
+ { "name": "archive_root", "type": { "kind": "field" } },
843
+ { "name": "public_data_tree_root", "type": { "kind": "field" } },
844
+ { "name": "global_variables_hash", "type": { "kind": "field" } }
695
845
  ]
696
846
  }
697
- }
698
- },
699
- {
700
- "name": "new_nullifiers",
701
- "type": {
702
- "kind": "array",
703
- "length": 16,
847
+ },
848
+ {
849
+ "name": "contract_deployment_data",
704
850
  "type": {
705
851
  "kind": "struct",
706
- "path": "authwit::aztec::protocol_types::abis::side_effect::SideEffectLinkedToNoteHash",
852
+ "path": "authwit::aztec::protocol_types::contrakt::deployment_data::ContractDeploymentData",
707
853
  "fields": [
708
854
  {
709
- "name": "value",
710
- "type": {
711
- "kind": "field"
712
- }
713
- },
714
- {
715
- "name": "note_hash",
855
+ "name": "deployer_public_key",
716
856
  "type": {
717
- "kind": "field"
857
+ "kind": "struct",
858
+ "path": "authwit::aztec::protocol_types::grumpkin_point::GrumpkinPoint",
859
+ "fields": [
860
+ { "name": "x", "type": { "kind": "field" } },
861
+ { "name": "y", "type": { "kind": "field" } }
862
+ ]
718
863
  }
719
864
  },
865
+ { "name": "constructor_vk_hash", "type": { "kind": "field" } },
866
+ { "name": "function_tree_root", "type": { "kind": "field" } },
867
+ { "name": "contract_address_salt", "type": { "kind": "field" } },
720
868
  {
721
- "name": "counter",
869
+ "name": "portal_contract_address",
722
870
  "type": {
723
- "kind": "integer",
724
- "sign": "unsigned",
725
- "width": 32
871
+ "kind": "struct",
872
+ "path": "authwit::aztec::protocol_types::address::EthAddress",
873
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
726
874
  }
727
875
  }
728
876
  ]
729
877
  }
730
- }
731
- },
732
- {
733
- "name": "new_l2_to_l1_msgs",
734
- "type": {
735
- "kind": "array",
736
- "length": 2,
737
- "type": {
738
- "kind": "field"
739
- }
740
- }
741
- },
742
- {
743
- "name": "unencrypted_logs_hash",
744
- "type": {
745
- "kind": "array",
746
- "length": 2,
747
- "type": {
748
- "kind": "field"
749
- }
750
- }
751
- },
752
- {
753
- "name": "unencrypted_log_preimages_length",
754
- "type": {
755
- "kind": "field"
756
- }
757
- },
758
- {
759
- "name": "block_header",
760
- "type": {
761
- "kind": "struct",
762
- "path": "authwit::aztec::protocol_types::abis::block_header::BlockHeader",
763
- "fields": [
764
- {
765
- "name": "note_hash_tree_root",
766
- "type": {
767
- "kind": "field"
768
- }
769
- },
770
- {
771
- "name": "nullifier_tree_root",
772
- "type": {
773
- "kind": "field"
774
- }
775
- },
776
- {
777
- "name": "contract_tree_root",
778
- "type": {
779
- "kind": "field"
780
- }
781
- },
782
- {
783
- "name": "l1_to_l2_message_tree_root",
784
- "type": {
785
- "kind": "field"
786
- }
787
- },
788
- {
789
- "name": "archive_root",
790
- "type": {
791
- "kind": "field"
792
- }
793
- },
794
- {
795
- "name": "public_data_tree_root",
796
- "type": {
797
- "kind": "field"
878
+ },
879
+ { "name": "chain_id", "type": { "kind": "field" } },
880
+ { "name": "version", "type": { "kind": "field" } }
881
+ ]
882
+ },
883
+ "visibility": "public"
884
+ },
885
+ "return_witnesses": [
886
+ 3517, 3518, 3519, 3520, 3521, 3522, 3523, 3524, 3525, 3526, 3527, 3528, 3529, 3530, 3531, 3532, 3533, 3534,
887
+ 3535, 3536, 3537, 3538, 3539, 3540, 3541, 3542, 3543, 3544, 3545, 3546, 3547, 3548, 3549, 3550, 3551, 3552,
888
+ 3553, 3554, 3555, 3556, 3557, 3558, 3559, 3560, 3561, 3562, 3563, 3564, 3565, 3566, 3567, 3568, 3569, 3570,
889
+ 3571, 3572, 3573, 3574, 3575, 3576, 3577, 3578, 3579, 3580, 3581, 3582, 3583, 3584, 3585, 3586, 3587, 3588,
890
+ 3589, 3590, 3591, 3592, 3593, 3594, 3595, 3596, 3597, 3598, 3599, 3600, 3601, 3602, 3603, 3604, 3605, 3606,
891
+ 3607, 3608, 3609, 3610, 3611, 3612, 3613, 3614, 3615, 3616, 3617, 3618, 3619, 3620, 3621, 3622, 3623, 3624,
892
+ 3625, 3626, 3627, 3628, 3629, 3630, 3631, 3632, 3633, 3634, 3635, 3636, 3637, 3638, 3639, 3640, 3641, 3642,
893
+ 3643, 3644, 3645, 3646, 3647, 3648, 3649, 3650, 3651, 3652, 3653, 3654, 3655, 3656, 3657, 3658, 3659, 3660,
894
+ 3661, 3662, 3663, 3664, 3665, 3666, 3667, 3668, 3669, 3670, 3671, 3672, 3673, 3674, 3675, 3676, 3677, 3678,
895
+ 3679, 3680, 3681, 3682, 3683, 3684, 3685, 3686, 3687, 3688, 3689, 3690, 3691, 3692, 3693, 3694, 3695, 3696,
896
+ 3697, 3698, 3699, 3700, 3701, 3702, 3703, 3704, 3705
897
+ ]
898
+ },
899
+ "bytecode": "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",
900
+ "debug_symbols": "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"
901
+ },
902
+ {
903
+ "name": "constructor",
904
+ "function_type": "Secret",
905
+ "is_internal": false,
906
+ "abi": {
907
+ "parameters": [
908
+ {
909
+ "name": "inputs",
910
+ "type": {
911
+ "kind": "struct",
912
+ "path": "authwit::aztec::abi::PrivateContextInputs",
913
+ "fields": [
914
+ {
915
+ "name": "call_context",
916
+ "type": {
917
+ "kind": "struct",
918
+ "path": "authwit::aztec::protocol_types::abis::call_context::CallContext",
919
+ "fields": [
920
+ {
921
+ "name": "msg_sender",
922
+ "type": {
923
+ "kind": "struct",
924
+ "path": "authwit::aztec::protocol_types::address::AztecAddress",
925
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
926
+ }
927
+ },
928
+ {
929
+ "name": "storage_contract_address",
930
+ "type": {
931
+ "kind": "struct",
932
+ "path": "authwit::aztec::protocol_types::address::AztecAddress",
933
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
934
+ }
935
+ },
936
+ {
937
+ "name": "portal_contract_address",
938
+ "type": {
939
+ "kind": "struct",
940
+ "path": "authwit::aztec::protocol_types::address::EthAddress",
941
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
942
+ }
943
+ },
944
+ {
945
+ "name": "function_selector",
946
+ "type": {
947
+ "kind": "struct",
948
+ "path": "authwit::aztec::protocol_types::abis::function_selector::FunctionSelector",
949
+ "fields": [
950
+ { "name": "inner", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }
951
+ ]
952
+ }
953
+ },
954
+ { "name": "is_delegate_call", "type": { "kind": "boolean" } },
955
+ { "name": "is_static_call", "type": { "kind": "boolean" } },
956
+ { "name": "is_contract_deployment", "type": { "kind": "boolean" } },
957
+ {
958
+ "name": "start_side_effect_counter",
959
+ "type": { "kind": "integer", "sign": "unsigned", "width": 32 }
960
+ }
961
+ ]
962
+ }
963
+ },
964
+ {
965
+ "name": "block_header",
966
+ "type": {
967
+ "kind": "struct",
968
+ "path": "authwit::aztec::protocol_types::abis::block_header::BlockHeader",
969
+ "fields": [
970
+ { "name": "note_hash_tree_root", "type": { "kind": "field" } },
971
+ { "name": "nullifier_tree_root", "type": { "kind": "field" } },
972
+ { "name": "contract_tree_root", "type": { "kind": "field" } },
973
+ { "name": "l1_to_l2_message_tree_root", "type": { "kind": "field" } },
974
+ { "name": "archive_root", "type": { "kind": "field" } },
975
+ { "name": "public_data_tree_root", "type": { "kind": "field" } },
976
+ { "name": "global_variables_hash", "type": { "kind": "field" } }
977
+ ]
978
+ }
979
+ },
980
+ {
981
+ "name": "contract_deployment_data",
982
+ "type": {
983
+ "kind": "struct",
984
+ "path": "authwit::aztec::protocol_types::contrakt::deployment_data::ContractDeploymentData",
985
+ "fields": [
986
+ {
987
+ "name": "deployer_public_key",
988
+ "type": {
989
+ "kind": "struct",
990
+ "path": "authwit::aztec::protocol_types::grumpkin_point::GrumpkinPoint",
991
+ "fields": [
992
+ { "name": "x", "type": { "kind": "field" } },
993
+ { "name": "y", "type": { "kind": "field" } }
994
+ ]
995
+ }
996
+ },
997
+ { "name": "constructor_vk_hash", "type": { "kind": "field" } },
998
+ { "name": "function_tree_root", "type": { "kind": "field" } },
999
+ { "name": "contract_address_salt", "type": { "kind": "field" } },
1000
+ {
1001
+ "name": "portal_contract_address",
1002
+ "type": {
1003
+ "kind": "struct",
1004
+ "path": "authwit::aztec::protocol_types::address::EthAddress",
1005
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
1006
+ }
1007
+ }
1008
+ ]
1009
+ }
1010
+ },
1011
+ {
1012
+ "name": "private_global_variables",
1013
+ "type": {
1014
+ "kind": "struct",
1015
+ "path": "authwit::aztec::abi::PrivateGlobalVariables",
1016
+ "fields": [
1017
+ { "name": "chain_id", "type": { "kind": "field" } },
1018
+ { "name": "version", "type": { "kind": "field" } }
1019
+ ]
1020
+ }
1021
+ }
1022
+ ]
1023
+ },
1024
+ "visibility": "private"
1025
+ }
1026
+ ],
1027
+ "param_witnesses": { "inputs": [{ "start": 0, "end": 23 }] },
1028
+ "return_type": {
1029
+ "abi_type": {
1030
+ "kind": "struct",
1031
+ "path": "authwit::aztec::protocol_types::abis::private_circuit_public_inputs::PrivateCircuitPublicInputs",
1032
+ "fields": [
1033
+ {
1034
+ "name": "call_context",
1035
+ "type": {
1036
+ "kind": "struct",
1037
+ "path": "authwit::aztec::protocol_types::abis::call_context::CallContext",
1038
+ "fields": [
1039
+ {
1040
+ "name": "msg_sender",
1041
+ "type": {
1042
+ "kind": "struct",
1043
+ "path": "authwit::aztec::protocol_types::address::AztecAddress",
1044
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
1045
+ }
1046
+ },
1047
+ {
1048
+ "name": "storage_contract_address",
1049
+ "type": {
1050
+ "kind": "struct",
1051
+ "path": "authwit::aztec::protocol_types::address::AztecAddress",
1052
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
1053
+ }
1054
+ },
1055
+ {
1056
+ "name": "portal_contract_address",
1057
+ "type": {
1058
+ "kind": "struct",
1059
+ "path": "authwit::aztec::protocol_types::address::EthAddress",
1060
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
1061
+ }
1062
+ },
1063
+ {
1064
+ "name": "function_selector",
1065
+ "type": {
1066
+ "kind": "struct",
1067
+ "path": "authwit::aztec::protocol_types::abis::function_selector::FunctionSelector",
1068
+ "fields": [{ "name": "inner", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }]
1069
+ }
1070
+ },
1071
+ { "name": "is_delegate_call", "type": { "kind": "boolean" } },
1072
+ { "name": "is_static_call", "type": { "kind": "boolean" } },
1073
+ { "name": "is_contract_deployment", "type": { "kind": "boolean" } },
1074
+ {
1075
+ "name": "start_side_effect_counter",
1076
+ "type": { "kind": "integer", "sign": "unsigned", "width": 32 }
798
1077
  }
799
- },
800
- {
801
- "name": "global_variables_hash",
802
- "type": {
803
- "kind": "field"
1078
+ ]
1079
+ }
1080
+ },
1081
+ { "name": "args_hash", "type": { "kind": "field" } },
1082
+ { "name": "return_values", "type": { "kind": "array", "length": 4, "type": { "kind": "field" } } },
1083
+ {
1084
+ "name": "read_requests",
1085
+ "type": {
1086
+ "kind": "array",
1087
+ "length": 32,
1088
+ "type": {
1089
+ "kind": "struct",
1090
+ "path": "authwit::aztec::protocol_types::abis::side_effect::SideEffect",
1091
+ "fields": [
1092
+ { "name": "value", "type": { "kind": "field" } },
1093
+ { "name": "counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }
1094
+ ]
1095
+ }
1096
+ }
1097
+ },
1098
+ {
1099
+ "name": "new_commitments",
1100
+ "type": {
1101
+ "kind": "array",
1102
+ "length": 16,
1103
+ "type": {
1104
+ "kind": "struct",
1105
+ "path": "authwit::aztec::protocol_types::abis::side_effect::SideEffect",
1106
+ "fields": [
1107
+ { "name": "value", "type": { "kind": "field" } },
1108
+ { "name": "counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }
1109
+ ]
1110
+ }
1111
+ }
1112
+ },
1113
+ {
1114
+ "name": "new_nullifiers",
1115
+ "type": {
1116
+ "kind": "array",
1117
+ "length": 16,
1118
+ "type": {
1119
+ "kind": "struct",
1120
+ "path": "authwit::aztec::protocol_types::abis::side_effect::SideEffectLinkedToNoteHash",
1121
+ "fields": [
1122
+ { "name": "value", "type": { "kind": "field" } },
1123
+ { "name": "note_hash", "type": { "kind": "field" } },
1124
+ { "name": "counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }
1125
+ ]
1126
+ }
1127
+ }
1128
+ },
1129
+ {
1130
+ "name": "private_call_stack_hashes",
1131
+ "type": { "kind": "array", "length": 4, "type": { "kind": "field" } }
1132
+ },
1133
+ {
1134
+ "name": "public_call_stack_hashes",
1135
+ "type": { "kind": "array", "length": 4, "type": { "kind": "field" } }
1136
+ },
1137
+ { "name": "new_l2_to_l1_msgs", "type": { "kind": "array", "length": 2, "type": { "kind": "field" } } },
1138
+ { "name": "end_side_effect_counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } },
1139
+ { "name": "encrypted_logs_hash", "type": { "kind": "array", "length": 2, "type": { "kind": "field" } } },
1140
+ {
1141
+ "name": "unencrypted_logs_hash",
1142
+ "type": { "kind": "array", "length": 2, "type": { "kind": "field" } }
1143
+ },
1144
+ { "name": "encrypted_log_preimages_length", "type": { "kind": "field" } },
1145
+ { "name": "unencrypted_log_preimages_length", "type": { "kind": "field" } },
1146
+ {
1147
+ "name": "block_header",
1148
+ "type": {
1149
+ "kind": "struct",
1150
+ "path": "authwit::aztec::protocol_types::abis::block_header::BlockHeader",
1151
+ "fields": [
1152
+ { "name": "note_hash_tree_root", "type": { "kind": "field" } },
1153
+ { "name": "nullifier_tree_root", "type": { "kind": "field" } },
1154
+ { "name": "contract_tree_root", "type": { "kind": "field" } },
1155
+ { "name": "l1_to_l2_message_tree_root", "type": { "kind": "field" } },
1156
+ { "name": "archive_root", "type": { "kind": "field" } },
1157
+ { "name": "public_data_tree_root", "type": { "kind": "field" } },
1158
+ { "name": "global_variables_hash", "type": { "kind": "field" } }
1159
+ ]
1160
+ }
1161
+ },
1162
+ {
1163
+ "name": "contract_deployment_data",
1164
+ "type": {
1165
+ "kind": "struct",
1166
+ "path": "authwit::aztec::protocol_types::contrakt::deployment_data::ContractDeploymentData",
1167
+ "fields": [
1168
+ {
1169
+ "name": "deployer_public_key",
1170
+ "type": {
1171
+ "kind": "struct",
1172
+ "path": "authwit::aztec::protocol_types::grumpkin_point::GrumpkinPoint",
1173
+ "fields": [
1174
+ { "name": "x", "type": { "kind": "field" } },
1175
+ { "name": "y", "type": { "kind": "field" } }
1176
+ ]
1177
+ }
1178
+ },
1179
+ { "name": "constructor_vk_hash", "type": { "kind": "field" } },
1180
+ { "name": "function_tree_root", "type": { "kind": "field" } },
1181
+ { "name": "contract_address_salt", "type": { "kind": "field" } },
1182
+ {
1183
+ "name": "portal_contract_address",
1184
+ "type": {
1185
+ "kind": "struct",
1186
+ "path": "authwit::aztec::protocol_types::address::EthAddress",
1187
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
1188
+ }
804
1189
  }
1190
+ ]
1191
+ }
1192
+ },
1193
+ { "name": "chain_id", "type": { "kind": "field" } },
1194
+ { "name": "version", "type": { "kind": "field" } }
1195
+ ]
1196
+ },
1197
+ "visibility": "public"
1198
+ },
1199
+ "return_witnesses": [
1200
+ 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,
1201
+ 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,
1202
+ 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,
1203
+ 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125,
1204
+ 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147,
1205
+ 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169,
1206
+ 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
1207
+ 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212
1208
+ ]
1209
+ },
1210
+ "bytecode": "H4sIAAAAAAAA/+Xd5XNUVxzG8U2yu6l7CU5wh9XsXdzdqtQLWzb1lir1UupOlXopdaeutLTUvcAfxPMMm5m8gFeczHDme2eeyUxe3NnP3rtXz/n9dqdSqR2pvUuT0qy0KO3d/udlRuNv7sCWfFrrSO9jvcVcR6lUrxTq+WJ+da5QrSXlXKlc60jySb6clNcUkmKxnpSSSrVWreSq+VKxnu8sV4udjRWnw33GXE+4M1pHpgfcmYPcndU6sj3gzgZ0d+33rd32+9R+9v8D/dxtgbdX19IceLuFNPeOxNwU0NwnEnNzQHPfSMwtAc39IjGnA5r7R2LOBDQPiMScDWgeGIm5NaB5UCTmtoDmdqB5MNA8BGgeCjQPA5qHA80jgOaRQPMooHk00DwGaB4LNI8DmscDzROA5olAcw5ozgPNBaC5CDSXgOYy0NwBNFeA5gRorgLNk4DmyUDzFKB5KtA8DWieDjTPAJpnAs2zgObZQPMcoHku0DwPaJ4PNC8AmhcCzYuA5sVA8xKgeSnQvAxoXg40rwCaTwKaTwaaTwGaTwWaTwOaTweaVwLNZwDNZwLNZwHNZwPN5wDN5wLN5wHN5wPNq4Dm1UBzDWi+AGheAzTXgeZOoPlCoPkioPlioPkSoPlSoPkyoPlyoPkKoPlKoHkt0HwV0Hw10HwN0Hwt0Hwd0Hw90LwOaL4BaL4RaL4JaL4ZaL4FaL4VaL4NaL4daF4PNN8BNG8Amu8Emu8Cmu8Gmu8Bmu8Fmu8Dmu8Hmh8Amh8Emh8Cmh8Gmh8Bmh8FmjcCzY8BzY8DzU8AzU8CzU8BzU8DzZuA5meA5meB5ueA5ueB5heA5heB5peA5peB5s1A8ytA8xag+VWg+TWg+XWg+Q2g+U2g+S2g+W2g+R2g+V2g+T2g+X2g+QOg+UOgeSvQ/BHQ/DHQ/AnQ/CnQ/BnQ/DnQ/AXQ/CXQ/BXQ/DXQ/A3Q/C3QvA1o/i4Sc2tA8/fA7bwdaP4BaP4RaN4BNP8ENP8cifmQgOZfIjEfGtD8ayTmwwKaf4vEfHhA8++RmI8IaP4jEvORAc1/RmI+KqD5r0jMRwc0/x2J+ZiA5n8iMR8b0PxvJObjApr/i8R8fEDz/5GYTwho3hmJ+cSA5l2RmHsFNO8OaG7rZm5quFuUtJJRsoqfX/q+0PdJvm/wdbSvK32d5esOn4d9XvJx2sct/469X3s79+q2/m2Nv72VPkpfpZ/SXxmgDFQGKe3KYGWIMlQZpgxXRigjlVHKaGWMMlYZp4xXJigT/Z0oeaXg71opKWWlQ6koiVJVJimTlSnKVGWaMr3x3c5UZimzlTnKXGWeMl9ZoCxUFimLlSXKUmWZslxZobj/vPuxuz+5+3W7f7X7Oa9U3O/X/W/dD9b9Ud0v1P0z3U/S/RVXKe6/V1Pcn839yty/y/2s3N/J/Y7c/8f9cNwfxv1S3D/E/TTcX2Kt4v4Drsfv+vSu1+765a7nvU5xvWfXP3Y9YNfHdb1Y1091PVHX11yvuP7iBsX1+VyvzvXbXM/M9b1c78r1n1wPyfWBXC/H9WNcT8X1RTYqrj/hegyuT+D5+p6/7vncmxTP9/X8V88H9fxIzxf0/DnPJ/P8qs2K599sUTw/w/MVPH7f49k9vtvjnT3+1+NhPT7U4yU9ftDj6Ty+bKvi8Ucej+PxKR6v4fELfp/v99t+3+v3n34f6Pdjfl/kfdPvE/x8fbvi569+Hunnc35e5ec3fp7h+3vf7/r+z/dDvj/w9bKvH3095esLn299/vHx2Mcn/167lj1HMZVAULsAAA==",
1211
+ "debug_symbols": "q1bKyU9OLMnMzytWsqqurQUA"
1212
+ },
1213
+ {
1214
+ "name": "is_valid",
1215
+ "function_type": "Secret",
1216
+ "is_internal": false,
1217
+ "abi": {
1218
+ "parameters": [
1219
+ {
1220
+ "name": "inputs",
1221
+ "type": {
1222
+ "kind": "struct",
1223
+ "path": "authwit::aztec::abi::PrivateContextInputs",
1224
+ "fields": [
1225
+ {
1226
+ "name": "call_context",
1227
+ "type": {
1228
+ "kind": "struct",
1229
+ "path": "authwit::aztec::protocol_types::abis::call_context::CallContext",
1230
+ "fields": [
1231
+ {
1232
+ "name": "msg_sender",
1233
+ "type": {
1234
+ "kind": "struct",
1235
+ "path": "authwit::aztec::protocol_types::address::AztecAddress",
1236
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
1237
+ }
1238
+ },
1239
+ {
1240
+ "name": "storage_contract_address",
1241
+ "type": {
1242
+ "kind": "struct",
1243
+ "path": "authwit::aztec::protocol_types::address::AztecAddress",
1244
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
1245
+ }
1246
+ },
1247
+ {
1248
+ "name": "portal_contract_address",
1249
+ "type": {
1250
+ "kind": "struct",
1251
+ "path": "authwit::aztec::protocol_types::address::EthAddress",
1252
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
1253
+ }
1254
+ },
1255
+ {
1256
+ "name": "function_selector",
1257
+ "type": {
1258
+ "kind": "struct",
1259
+ "path": "authwit::aztec::protocol_types::abis::function_selector::FunctionSelector",
1260
+ "fields": [
1261
+ { "name": "inner", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }
1262
+ ]
1263
+ }
1264
+ },
1265
+ { "name": "is_delegate_call", "type": { "kind": "boolean" } },
1266
+ { "name": "is_static_call", "type": { "kind": "boolean" } },
1267
+ { "name": "is_contract_deployment", "type": { "kind": "boolean" } },
1268
+ {
1269
+ "name": "start_side_effect_counter",
1270
+ "type": { "kind": "integer", "sign": "unsigned", "width": 32 }
1271
+ }
1272
+ ]
805
1273
  }
806
- ]
807
- }
1274
+ },
1275
+ {
1276
+ "name": "block_header",
1277
+ "type": {
1278
+ "kind": "struct",
1279
+ "path": "authwit::aztec::protocol_types::abis::block_header::BlockHeader",
1280
+ "fields": [
1281
+ { "name": "note_hash_tree_root", "type": { "kind": "field" } },
1282
+ { "name": "nullifier_tree_root", "type": { "kind": "field" } },
1283
+ { "name": "contract_tree_root", "type": { "kind": "field" } },
1284
+ { "name": "l1_to_l2_message_tree_root", "type": { "kind": "field" } },
1285
+ { "name": "archive_root", "type": { "kind": "field" } },
1286
+ { "name": "public_data_tree_root", "type": { "kind": "field" } },
1287
+ { "name": "global_variables_hash", "type": { "kind": "field" } }
1288
+ ]
1289
+ }
1290
+ },
1291
+ {
1292
+ "name": "contract_deployment_data",
1293
+ "type": {
1294
+ "kind": "struct",
1295
+ "path": "authwit::aztec::protocol_types::contrakt::deployment_data::ContractDeploymentData",
1296
+ "fields": [
1297
+ {
1298
+ "name": "deployer_public_key",
1299
+ "type": {
1300
+ "kind": "struct",
1301
+ "path": "authwit::aztec::protocol_types::grumpkin_point::GrumpkinPoint",
1302
+ "fields": [
1303
+ { "name": "x", "type": { "kind": "field" } },
1304
+ { "name": "y", "type": { "kind": "field" } }
1305
+ ]
1306
+ }
1307
+ },
1308
+ { "name": "constructor_vk_hash", "type": { "kind": "field" } },
1309
+ { "name": "function_tree_root", "type": { "kind": "field" } },
1310
+ { "name": "contract_address_salt", "type": { "kind": "field" } },
1311
+ {
1312
+ "name": "portal_contract_address",
1313
+ "type": {
1314
+ "kind": "struct",
1315
+ "path": "authwit::aztec::protocol_types::address::EthAddress",
1316
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
1317
+ }
1318
+ }
1319
+ ]
1320
+ }
1321
+ },
1322
+ {
1323
+ "name": "private_global_variables",
1324
+ "type": {
1325
+ "kind": "struct",
1326
+ "path": "authwit::aztec::abi::PrivateGlobalVariables",
1327
+ "fields": [
1328
+ { "name": "chain_id", "type": { "kind": "field" } },
1329
+ { "name": "version", "type": { "kind": "field" } }
1330
+ ]
1331
+ }
1332
+ }
1333
+ ]
808
1334
  },
809
- {
810
- "name": "prover_address",
811
- "type": {
812
- "kind": "struct",
813
- "path": "authwit::aztec::protocol_types::address::AztecAddress",
814
- "fields": [
815
- {
816
- "name": "inner",
817
- "type": {
818
- "kind": "field"
1335
+ "visibility": "private"
1336
+ },
1337
+ { "name": "message_hash", "type": { "kind": "field" }, "visibility": "private" }
1338
+ ],
1339
+ "param_witnesses": { "inputs": [{ "start": 0, "end": 23 }], "message_hash": [{ "start": 23, "end": 24 }] },
1340
+ "return_type": {
1341
+ "abi_type": {
1342
+ "kind": "struct",
1343
+ "path": "authwit::aztec::protocol_types::abis::private_circuit_public_inputs::PrivateCircuitPublicInputs",
1344
+ "fields": [
1345
+ {
1346
+ "name": "call_context",
1347
+ "type": {
1348
+ "kind": "struct",
1349
+ "path": "authwit::aztec::protocol_types::abis::call_context::CallContext",
1350
+ "fields": [
1351
+ {
1352
+ "name": "msg_sender",
1353
+ "type": {
1354
+ "kind": "struct",
1355
+ "path": "authwit::aztec::protocol_types::address::AztecAddress",
1356
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
1357
+ }
1358
+ },
1359
+ {
1360
+ "name": "storage_contract_address",
1361
+ "type": {
1362
+ "kind": "struct",
1363
+ "path": "authwit::aztec::protocol_types::address::AztecAddress",
1364
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
1365
+ }
1366
+ },
1367
+ {
1368
+ "name": "portal_contract_address",
1369
+ "type": {
1370
+ "kind": "struct",
1371
+ "path": "authwit::aztec::protocol_types::address::EthAddress",
1372
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
1373
+ }
1374
+ },
1375
+ {
1376
+ "name": "function_selector",
1377
+ "type": {
1378
+ "kind": "struct",
1379
+ "path": "authwit::aztec::protocol_types::abis::function_selector::FunctionSelector",
1380
+ "fields": [{ "name": "inner", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }]
1381
+ }
1382
+ },
1383
+ { "name": "is_delegate_call", "type": { "kind": "boolean" } },
1384
+ { "name": "is_static_call", "type": { "kind": "boolean" } },
1385
+ { "name": "is_contract_deployment", "type": { "kind": "boolean" } },
1386
+ {
1387
+ "name": "start_side_effect_counter",
1388
+ "type": { "kind": "integer", "sign": "unsigned", "width": 32 }
819
1389
  }
1390
+ ]
1391
+ }
1392
+ },
1393
+ { "name": "args_hash", "type": { "kind": "field" } },
1394
+ { "name": "return_values", "type": { "kind": "array", "length": 4, "type": { "kind": "field" } } },
1395
+ {
1396
+ "name": "read_requests",
1397
+ "type": {
1398
+ "kind": "array",
1399
+ "length": 32,
1400
+ "type": {
1401
+ "kind": "struct",
1402
+ "path": "authwit::aztec::protocol_types::abis::side_effect::SideEffect",
1403
+ "fields": [
1404
+ { "name": "value", "type": { "kind": "field" } },
1405
+ { "name": "counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }
1406
+ ]
820
1407
  }
821
- ]
822
- }
823
- }
824
- ]
825
- }
826
- ],
827
- "bytecode": "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",
828
- "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f"
1408
+ }
1409
+ },
1410
+ {
1411
+ "name": "new_commitments",
1412
+ "type": {
1413
+ "kind": "array",
1414
+ "length": 16,
1415
+ "type": {
1416
+ "kind": "struct",
1417
+ "path": "authwit::aztec::protocol_types::abis::side_effect::SideEffect",
1418
+ "fields": [
1419
+ { "name": "value", "type": { "kind": "field" } },
1420
+ { "name": "counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }
1421
+ ]
1422
+ }
1423
+ }
1424
+ },
1425
+ {
1426
+ "name": "new_nullifiers",
1427
+ "type": {
1428
+ "kind": "array",
1429
+ "length": 16,
1430
+ "type": {
1431
+ "kind": "struct",
1432
+ "path": "authwit::aztec::protocol_types::abis::side_effect::SideEffectLinkedToNoteHash",
1433
+ "fields": [
1434
+ { "name": "value", "type": { "kind": "field" } },
1435
+ { "name": "note_hash", "type": { "kind": "field" } },
1436
+ { "name": "counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } }
1437
+ ]
1438
+ }
1439
+ }
1440
+ },
1441
+ {
1442
+ "name": "private_call_stack_hashes",
1443
+ "type": { "kind": "array", "length": 4, "type": { "kind": "field" } }
1444
+ },
1445
+ {
1446
+ "name": "public_call_stack_hashes",
1447
+ "type": { "kind": "array", "length": 4, "type": { "kind": "field" } }
1448
+ },
1449
+ { "name": "new_l2_to_l1_msgs", "type": { "kind": "array", "length": 2, "type": { "kind": "field" } } },
1450
+ { "name": "end_side_effect_counter", "type": { "kind": "integer", "sign": "unsigned", "width": 32 } },
1451
+ { "name": "encrypted_logs_hash", "type": { "kind": "array", "length": 2, "type": { "kind": "field" } } },
1452
+ {
1453
+ "name": "unencrypted_logs_hash",
1454
+ "type": { "kind": "array", "length": 2, "type": { "kind": "field" } }
1455
+ },
1456
+ { "name": "encrypted_log_preimages_length", "type": { "kind": "field" } },
1457
+ { "name": "unencrypted_log_preimages_length", "type": { "kind": "field" } },
1458
+ {
1459
+ "name": "block_header",
1460
+ "type": {
1461
+ "kind": "struct",
1462
+ "path": "authwit::aztec::protocol_types::abis::block_header::BlockHeader",
1463
+ "fields": [
1464
+ { "name": "note_hash_tree_root", "type": { "kind": "field" } },
1465
+ { "name": "nullifier_tree_root", "type": { "kind": "field" } },
1466
+ { "name": "contract_tree_root", "type": { "kind": "field" } },
1467
+ { "name": "l1_to_l2_message_tree_root", "type": { "kind": "field" } },
1468
+ { "name": "archive_root", "type": { "kind": "field" } },
1469
+ { "name": "public_data_tree_root", "type": { "kind": "field" } },
1470
+ { "name": "global_variables_hash", "type": { "kind": "field" } }
1471
+ ]
1472
+ }
1473
+ },
1474
+ {
1475
+ "name": "contract_deployment_data",
1476
+ "type": {
1477
+ "kind": "struct",
1478
+ "path": "authwit::aztec::protocol_types::contrakt::deployment_data::ContractDeploymentData",
1479
+ "fields": [
1480
+ {
1481
+ "name": "deployer_public_key",
1482
+ "type": {
1483
+ "kind": "struct",
1484
+ "path": "authwit::aztec::protocol_types::grumpkin_point::GrumpkinPoint",
1485
+ "fields": [
1486
+ { "name": "x", "type": { "kind": "field" } },
1487
+ { "name": "y", "type": { "kind": "field" } }
1488
+ ]
1489
+ }
1490
+ },
1491
+ { "name": "constructor_vk_hash", "type": { "kind": "field" } },
1492
+ { "name": "function_tree_root", "type": { "kind": "field" } },
1493
+ { "name": "contract_address_salt", "type": { "kind": "field" } },
1494
+ {
1495
+ "name": "portal_contract_address",
1496
+ "type": {
1497
+ "kind": "struct",
1498
+ "path": "authwit::aztec::protocol_types::address::EthAddress",
1499
+ "fields": [{ "name": "inner", "type": { "kind": "field" } }]
1500
+ }
1501
+ }
1502
+ ]
1503
+ }
1504
+ },
1505
+ { "name": "chain_id", "type": { "kind": "field" } },
1506
+ { "name": "version", "type": { "kind": "field" } }
1507
+ ]
1508
+ },
1509
+ "visibility": "public"
1510
+ },
1511
+ "return_witnesses": [
1512
+ 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
1513
+ 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241,
1514
+ 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263,
1515
+ 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285,
1516
+ 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307,
1517
+ 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329,
1518
+ 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351,
1519
+ 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373,
1520
+ 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386
1521
+ ]
1522
+ },
1523
+ "bytecode": "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",
1524
+ "debug_symbols": "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"
829
1525
  }
830
1526
  ],
831
1527
  "events": [],
832
- "debug": {
833
- "debugSymbols": [
834
- "eJyrVsrJT04syczPK1ayqq6tBQAz9wY7",
835
- "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",
836
- "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",
837
- "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DldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdl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dVpz47O77vV+rLnx2V33eo/V3Pjsrst2UyW2myqx3VSJ7aZKbDdVYrupEttNldhuqsR2UyW2myqx3VSJ7aZKbDdVYrupEttNldhuqsR2UyW2myqx3VSJ7aZKbDdVYrupEttNldhuqsR2UyW2myqx3VSJ7aZKbDdVYrupEttNldhuqsR2UyW2myqx3VSJ7aZKbDdVYrupEttNldhuqsR2UyW2myqx3VSJ7aZKbDdVYrupEttNldhuqsR2UyW2myqx3VSJ7aZKbDdVYrupEttNldhuqsR2UyW2myqz3VSZ7abKbDdVZrup8m3truuPHJ7i+/iD67Z+v2z/Slxuj52u3aCv3OnavfzKna7d9n9sp1FGO137DuHKna59M3HhTq+3tOQnO418v3S0r8+6jcLfot2vnNLt+3+JN3/s4PKzmr2D610t03dw+e3f9B1cfgc4fQeX3wRO38Hl94HTd3D5/d30HVx+3zZ9B5ffj03fAb4nX69xmb2D600u03eA78nX+1ym7wDfk6+3ukzfwfSevP2ft69U/q/30Gu6bzf1Jxfudv9s96/P+gOkXS+BWXer07v857Y6/Xbgc1udft/wsa1eL61Zd6vsPw6xBTeZLbjJbMFNZgtuMltwk9mCm8wW3GS24CazBTeZLbjJbMFNZgtuMltwk9mCm8wW3GS24CazBTeZLbjJbMFNZgtuMltwk9mCm8wW3GS24CazBTeZLbjJbMFNZgtuMltwk9mCm8wW3GS24CazBTeZLbjJbMFNZgtuMltwk9mCm8wW3GS24CazBTeZLbjJbMFNZgtuMltwk9mCm8wW3GS24CazBTeZLbjJbMFNZgtuMltwk9mCm8wW3GS24CazBTeZLbgxtuDG2IIbYwtujC24sRu669ri1pqn8dFd1xb3yzyNj+66trgJ5ln8xO66id11E7vrJnbXTeyum9hdN7G7bmJ33eu1XnPjs7vu9UKvufHZXfd6ldfc+Oyue73Ea258dte9Xt81Nz67614v7pobn911r1d2zY3P7rrXy7rmxmd33es1XXPjs7vu9d6tufHZXfd6P9bc+Oyue73Ham58dtdlu6mM7aYytpvK2G4qY7upjO2mMrabythuKmO7qYztpjK2m8rYbipju6mM7aYytpvK2G4qY7upjO2mMrabythuKmO7qYztpjK2m8rYbipju6mM7aYytpvK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",
838
- "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1zGH65jDdczhOuZwHXO4jjlcxxyuYw7XMYfrmMN1zOE65nAdc7iOOVzHHK5jDtcxh+uYw3XM4TrmcB1zuI45XMccrmMO1zGH65jDdczhOuZwHXO4jjlcxxyuYw7XMYfrmMMNzOEG5nADc7iBOdzAHG5gDjcwhxuYww3M4QbmcANzuIE53MAcbmAONzCHG5jDDczhBuZwA3O4gTncwBxuYA43MIcbmMMNzOEG5nADc7iBOdzAHG5gDjcwhxuYww3M4QbmcANzuIE53MAcbmAONzCHG5jDDczhBuZwA3O4gTncwBxuYA43MIcbmMMNzOEG5nADc7iBOdzAHG5gDjcwhxuYww3M4QbmcANzuIE53MAcbmAONzCHG5jDDczhBuZwA3O4gTncwBxuYA43MIcbmMMNzOEG5nADc7iBOdzAHG5gDjcwhxuYww3M4QbmcANzuIE53MAcbmAONzCHG5jDDczhBuZwA3O4gTncwBxuYA43MIcbmMMNzOEG5nADc7iBOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI453MQcbmIONzGHm5jDTczhJuZwE3O4iTncxBxuYg43MYebmMNNzOEm5nATc7iJOdzEHG5iDjcxh5uYw03M4SbmcBNzuIk53MQcbmIONzGHm5jDTczhJuZwE3O4iTncxBxuYg43MYebmMNNzOEm5nATc7iJOdzEHG5iDjcxh5uYw03M4SbmcBNzuIk53MQcbmIONzGHm5jDTczhJuZwE3O4iTncxBxuYg43MYebmMNNzOEm5nATc7iJOdzEHG5iDjcxh5uYw03M4SbmcBNzuIk53MQcbmIONzGHm5jDTczhJuZwE3O4iTncxBxuYg43MYebmMNNzOEm5nATc7iJOdzEHG5iDjcxh5uYw03M4SbmcBNzuIk53MQcbmIONzGHm5jDBeZwgTlcYA4XmMMF5nCBOVxgDheYwwXmcIE5XGAOF5jDBeZwgTlcYA4XmMMF5nCBOVxgDheYwwXmcIE5XGAOF5jDBeZwgTlcYA4XmMMF5nCBOVxgDheYwwXmcIE5XGAOF5jDBeZwgTlcYA4XmMMF5nCBOVxgDheYwwXmcIE5XGAOF5jDBeZwgTlcYA4XmMMF5nCBOVxgDheYwwXmcIE5XGAOF5jDBeZwgTlcYA4XmMMF5nCBOVxgDheYwwXmcIE5XGAOF5jDBeZwgTlcYA4XmMMF5nCBOVxgDheYwwXmcIE5XGAOF5jDBeZwgTlcYA4XmMMF5nCBOVxgDheYwwXmcIE5XGAOF5jDBeZwgTlcYA4XmMOVBwZxRwnd9aOEbvtRQvf9KKEbf5TQnT9K6NYfJXTvjxK6+UcJ332M5I4SvvsYyh0lfPcxljtK+O5jMHeU8N3HaO4o4buP4dxRwncf47mjhO8+BnRHCd99jOiOEr77GNIdJXz3MaY7SvjuY1B3lPDdx6juKOG7j2HdUcJ3H+O6o4TvPgZ2RwnffYzsjhK++xjaHSV89zG2O0r47mNwd5Tw3cfo7ijhu4/h3VHCdx/ju6OE7z4GeEcJ332M8I4SvvsY4h0lfPcxxjtK+O5jkHeU8N3HKO8o4buPYd5Rwncf47yjhO8+BnpHCd99jPSOEr77GOodJXz3MdY7SvjuY7B3lPDdx2jvKOG7j+HeUcJ3H+O9o4TvPgZ8RwnffYz4jhK++xjyHSV89zHmO0r47mPQd5Tw3ceo7yjBu1846yuc9RXO+gpnfYWzvsJZX+Gsr3DWVzjrK5z1Fc76Cmd9hbO+wllf4ayvcNZXOOsrnPUVzvoKZ32Fs77CWV/hrK9w1lc46yuc9RXO+gpnfYWzvsJZX+Gsr3DWVzjrK5z1Fc76Cmd9hbO+wllf4ayvcNZXOOsrnPUVzvoKZ32Fs77CWV/hrK9w1lfWrO/46JVn1bHa+g+FPy1e7e3j1S3889VlzsWr63C358uPf/75Nc/Xj7F6c/ePFz9+tQL/XMDysyi0gDUHVVrA8jpVWsCyaygtYNnDlBaw7KhKC1j2d6UFLE8bpQUszz6lBaifxOtfgYQWsP5NSmkB6ifx+vc6pQWon8Tr3zKVFqB+Eq9/51VagPpJvP4NXGkB6ifx+v4ApQWon8TreyeUFqB+Eq/vK1FagPpJvL7nRmkB6ifx+n4kpQWon8Tre7WUFqB+Eq/vY1NagPpJvL7HT2kB6ifx+v5HpQWon8Tre0OVFqB+Eq/vm1VagPpJvL6nWGkB6ifx+n5rpQWon8Tre9GVFqB+Eq/v01dagPhJXNczDEoLED+J63q+Q2kB4idxfYifxHU9iaO0APGTuK6nlJQWIH4S1/UEl9AC1vNkSgtQP4nXs3ZKC1A/iddziEoLUD+J1zOaSgtQP4nX86tKC1A/idezvUoLUD+J13PPSgtQP4nXM+FKC1A/idfz8koLUD+J1y4BpQWon8Rrz4LSAtRP4rWDQmkB6ifx2s+htAD1k3jtLlFagPpJvPa6KC1A/SReO2+UFqB+Eq99QEoLUD+J164kpQWon8Rrj5TSAtRPYnXHVlV3bFV1x1ZVd2xVdcdWVXdsVXXHVlV3bFV1x1ZVd2xVdcdWVXdsVXXHVlV3bFV1x1ZVd2xVdcdWVXdsVXXHVlV3bFV1x1ZVd2xVdcdWVXdsVXXHVlV3bFV1x1ZVd2xVdcdWVXdsVXXHVlV3bFV1x1ZVd2xVdcdWVXdsVXXHVlV3bFV1x1ZVd2xVdcdWVXdsVXXHVlV3bFV1x1ZVd2xVdcdWVXdsVXXHVlV3bFV1x1ZVd2w1dcdWU3dsNXXHVlN3bLWH+Enc1B1bTd2x1dQdW03dsdXUHVtN3bHV1B1bTd2x1dQdW03dsdXUHVtN3bHV1B1bTd2x1dQdW03dsdXUHVtN3bHV1B1bTd2x1dQdW03dsdXUHVtN3bHV1B1bTd2x1dQdW03dsdXUHVtN3bHV1B1bTd2x1dQdW03dsdXUHVtN3bHV1B1bTd2x1dQdW03dsdXUHVtN3bHV1B1bTd2x1dQdW03dsdXUHVtN3bHV1B1bTd2x1dQdW03dsdXUHVtN3bHV1B1bTd2x1dQdW03dsdXUHVtN3bHV1B1bTd2x1dQdW03dsdXUHVtN3bHV1B1bTd2x1dQdW03dsdXUHVtN3bHV1B1bTd2x1dQdW03dsdXUHVtN3bHV1B1bTd2x1dQdW03dsdXUHVtN3bHV1B1bTd2x1dQdW03dsdXUHVtN3bHV1B1bTd2x1dQdW03dsdXUHVum7tgydceWqTu2TN2xZQ/xk9jUHVum7tgydceWqTu2TN2xZeqOLVN3bJm6Y8vUHVum7tgydceWqTu2TN2xZeqOLVN3bJm6Y8vUHVum7tgydceWqTu2TN2xZeqOLVN3bJm6Y8vUHVum7tgydceWqTu2TN2xZeqOLVN3bJm6Y8vUHVum7tgydceWqTu2TN2xZeqOLVN3bJm6Y8vUHVum7tgydceWqTu2TN2xZeqOLVN3bJm6Y8vUHVum7tgydceWqTu2TN2xZeqOLVN3bJm6Y8vUHVum7tgydceWqTu2TN2xZeqOLVN3bJm6Y8vUHVum7tgydceWqTu2TN2xZeqOLVN3bJm6Y8vUHVum7tgydceWqTu2TN2xZeqOLVN3bJm6Y8vUHVum7tgydceWqTu2TN2xZeqOLVN3bJm6Y8vUHVum7tgydceWqTu2TN2xZeqOLVN3bHV1x1ZXd2x1dcdWV3ds9Yf4SdzVHVtd3bHV1R1bXd2x1dUdW13dsdXVHVtd3bHV1R1bXd2x1dUdW13dsdXVHVtd3bHV1R1bXd2x1dUdW13dsdXVHVtd3bHV1R1bXd2x1dUdW13dsdXVHVtd3bHV1R1bXd2x1dUdW13dsdXVHVtd3bHV1R1bXd2x1dUdW13dsdXVHVtd3bHV1R1bXd2x1dUdW13dsdXVHVtd3bHV1R1bXd2x1dUdW13dsdXVHVtd3bHV1R1bXd2x1dUdW13dsdXVHVtd3bHV1R1bXd2x1dUdW13dsdXVHVtd3bHV1R1bXd2x1dUdW13dsdXVHVtd3bHV1R1bXd2x1dUdW13dsdXVHVtd3bHV1R1bXd2x1dUdW13dsdXVHVtd3bHV1R1bXd2x1dUdW13dsdXVHVtd3bHV1R1bXd2x1dUdW13dsdXVHVtd3bHV1R1bXd2x1dUdW0PdsTXUHVtD3bE11B1b4yF+Eg91x9ZQd2wNdcfWUHdsDXXH1lB3bA11x9ZQd2wNdcfWUHdsDXXH1lB3bA11x9ZQd2wNdcfWUHdsDXXH1lB3bA11x9ZQd2wNdcfWUHdsDXXH1lB3bA11x9ZQd2wNdcfWUHdsDXXH1lB3bA11x9ZQd2wNdcfWUHdsDXXH1lB3bA11x9ZQd2wNdcfWUHdsDXXH1lB3bA11x9ZQd2wNdcfWUHdsDXXH1lB3bA11x9ZQd2wNdcfWUHdsDXXH1lB3bA11x9ZQd2wNdcfWUHdsDXXH1lB3bA11x9ZQd2wNdcfWUHdsDXXH1lB3bA11x9ZQd2wNdcfWUHdsDXXH1lB3bA11x9ZQd2wNdcfWUHdsDXXH1lB3bA11x9ZQd2wNdcfWUHdsDXXH1lB3bA11x9ZQd2wNdcfWUHdsDXXH1lB3bA11x9ZQd2wNdcfWUHdsDXXHlqs7tlzdseXqji1Xd2z5Q/wkdnXHlqs7tlzdseXqji1Xd2y5umPL1R1bru7YcnXHlqs7tlzdseXqji1Xd2y5umPL1R1bru7YcnXHlqs7tlzdseXqji1Xd2y5umPL1R1bru7YcnXHlqs7tlzdseXqji1Xd2y5umPL1R1bru7YcnXHlqs7tlzdseXqji1Xd2y5umPL1R1bru7YcnXHlqs7tlzdseXqji1Xd2y5umPL1R1bru7YcnXHlqs7tlzdseXqji1Xd2y5umPL1R1bru7YcnXHlqs7tlzdseXqji1Xd2y5umPL1R1bru7YcnXHlqs7tlzdseXqji1Xd2y5umPL1R1bru7YcnXHlqs7tlzdseXqji1Xd2y5umPL1R1bru7YcnXHlqs7tlzdseXqji1Xd2y5umPL1R1bru7YcnXHlqs7tlzdseXqji1Xd2y5umPL1R1bU92xNdUdW1PdsTXVHVvzIX4ST3XH1lR3bE11x9ZUd2xNdcfWVHdsTXXH1lR3bE11x9ZUd2xNdcfWVHdsTXXH1lR3bE11x9ZUd2xNdcfWVHdsTXXH1lR3bE11x9ZUd2xNdcfWVHdsTXXH1lR3bE11x9ZUd2xNdcfWVHdsTXXH1lR3bE11x9ZUd2xNdcfWVHdsTXXH1lR3bE11x9ZUd2xNdcfWVHdsTXXH1lR3bE11x9ZUd2xNdcfWVHdsTXXH1lR3bE11x9ZUd2xNdcfWVHdsTXXH1lR3bE11x9ZUd2xNdcfWVHdsTXXH1lR3bE11x9ZUd2xNdcfWVHdsTXXH1lR3bE11x9ZUd2xNdcfWVHdsTXXH1lR3bE11x9ZUd2xNdcfWVHdsTXXH1lR3bE11x9ZUd2xNdcfWVHdsTXXH1lR3bE11x9ZUd2xNdcfWVHdsTXXH1lR3bE11x9ZUd2xNdcdWqDu2Qt2xFeqOrVB3bMVD/CQOdcdWqDu2Qt2xFeqOrVB3bIW6YyvUHVuh7tgKdcdWqDu2Qt2xFeqOrVB3bIW6YyvUHVuh7tgKdcdWqDu2Qt2xFeqOrVB3bIW6YyvUHVuh7tgKdcdWqDu2Qt2xFeqOrVB3bIW6YyvUHVuh7tgKdcdWqDu2Qt2xFeqOrVB3bIW6YyvUHVuh7tgKdcdWqDu2Qt2xFeqOrVB3bIW6YyvUHVuh7tgKdcdWqDu2Qt2xFeqOrVB3bIW6YyvUHVuh7tgKdcdWqDu2Qt2xFeqOrVB3bIW6YyvUHVuh7tgKdcdWqDu2Qt2xFeqOrVB3bIW6YyvUHVuh7tgKdcdWqDu2Qt2xFeqOrVB3bIW6YyvUHVuh7tgKdcdWqDu2Qt2xFeqOrVB3bIW6YyvUHVuh7tgKdcdWqDu2Qt2xFeqOrVB3bIW6YyvEHVvH37RP4uNv2ifx8Tftk/j4m/ZJfPxN+yQ+/qZ9Eh9/0z6Jj79pn8TH37RP4uNv6iexuGPrWID6SSzu2DoWoH4Sizu2jgWon8Tijq1jAeonsbhj61iA+kks7tg6FqB+Eos7to4FqJ/E4o6tYwHqJ7G4Y+tYgPpJfOLYsl4/IvXyeLGA2h4fr66txYsFRH08Xxz+/f8aa6vwj/D+kaM8fv3WD/tcwfooFlrBiWVLaQXrw1hpBevTWGkF6+NYaQXr81hpBesDWWkF6xNZaQXrI1lpBfJn8oluS2gFJ74tpRXIn8knxi2lFcifySfOrS9cwfEv9++p7F+vYX7+h1aU+eKNZ/t47bTvrz3+8+xjqdsP7/uWuv2Uv2+p278O3LfUd39v6PXVUkf/aDdl/MwfvmdakYv58c7z+xv3x2f8d39puBDfx8d7exmL/0tPZF/3Znr3wf6OTO8+qt+R6d2H7zsyvfs4fUemd59778j07gPqHZnefZK8I9MNLf9lpoR9/EQVdW+mhH38ROh0b6aEffxEu3RvpoR9/ESOdG+mhH38RGF0b6aEffxENHRvpoR9/EQHdG+mhH38RNpzb6aEffxErXNvpoR9/ESAc2+mhH38RFNzb6aEffxEJnNvpoR9/ET5cm+mhH38RMxyb6aEffxEn3JvpoR9/ERycm+mhH38REVyb6aEffxEGHJvpoR9/ETrcW+mhH38RL5xb6Z8fbycKDLuzZSvj5cTkcW9mfL18fLI18fLiUHi3kz5+ng58TzcmylfHy8nNoZbM50IFu7NlLCPn2gQ7s2UsI+fyAruzZSwj58oBe7NlLCPnwz+35spYR8/Gc+/N1PCPn4yRH9vpoR9/GTU/d5MCfv4yUD6vZkS9vG3j42/I1PCPv720e53ZErYx98+fv2OTAn7+NtHpN+RKWEff/sY8zsyJezjbx81fkemhH387ePA78iUsI+/fWT3HZkS9vG3j9W+I1PCPv72QdV3ZErYx+8Y/XyZKWEfTzjPWRLOc5aE85wl4TxnSTjPWRLOc5aE85wl4TxnSTjPWRLOc5aE85wl4TxnSTjPWRLOc5aE85wl4TxnSTjPWRLOc5aE85wl4TxnSTjPWRLOc5aE85wl4TxnSTjPWRLOc5aE85wl4TxnSTjPWRLOc5aE85wl4TxnSTjPWRLOc5aE85wl4TxnSTjPWRLOc5aE85wl4TxnSTjPWRLOc5aE85wnj7v/8HO+TPN4fMiAf36syff3f6zCzO+K01+7SL+Lg0+eXX9bmuV5clua5UlyW5rlGXJbmuXp8UVp5uclFaUu0yzPjdvSLE+Me9K0k8eq35ZmeUrclmZnL36dZmMvjhqfacbiCm8njyK/Lc2+fvPzA5w/X/yrrwe/TrOv31xJs6/fXEiznm28Lc2+fnMlzb5+cyXNvn5zJc2+fnMlzb7vflfS7PvudyVNql68nlW8LU2qXryeT7wtTapevJ5JvC1Nql68nkO8LU2qXryePbwtTapevJ43vC1Nql68njG8LU2qXryeK7wtTapevJ4lvC1Nql68nh+8LU2qXryeGbwtTapevJ4TvC1Nql68ng28LU2qXryeB7wtTapevJ4BvC1Nql68nvu7LU2qXrye9bstTapevJ7vuy1Nql68num7LU2qXrye47stTapevJ7duy1Nql68nte7LU2qXrye0bstTapevJ7Luy1Nql68nsW7LU2qXryev7stTapevJ65uy1Nql68nrO7LU2qXryerbstTapevJ6nuy1Nql68nqG7LU2qXryem7stTapevJ6Vuy1Nql68no+7LU2qXryeibstTapevJ6Duy1Nql68nn27LU2qXrxxtuxKmlS9eONs2ZU0qXrxxtmyK2lS9eKNs2VX0mTqxSfPI7wtTaZefPIMwtvSZOrFJ88dvC1Npl588qzB29Jk6sUnzxe8LU2qXpxq7u7kaYK3pUnVi1PN3Z08O/C2NKl6caq5u5MnBd6WJlUvTjV3d/JcwNvSpOrFqebuTp4CeFuaVL041dzdyTP/bkuTqhenmrs7ecLfXWlSzd2dPNXvtjSpenGqubuTZ/jdliZVL041d3fyxL7b0qTqxanm7k6ez3dbmlS9ONXc3cnT+G5Lk6oXp5q7O3n23m1pUvXiVHN3J09r+6I04/uLpy/T7LzCX6fZ+Cmun/rf4x/bMs3GT/GFNBs/xRfSbPxG8TrNzomlC2n2faOYx0Y8XzyPf+/ni2N+htnXbi6E2dhtmtnHi+1R/mGf/vnV5RH+8d6lPFos93Xj948vSL/x+8oXpN94MnxB+o0nyRek33jy/Iv0zzQ7J6IupNn4X48X0mz8bnkhTY5u/5EmR/f+SJOjG3+k2dhdzdpnGrNlmo3d8kKajd3vQpqN37tfp9k5EXUhzcZefCHNxl58Ic3GXnwhzcZefCHNxl58IU2qXrxzIupCmlS9eOdE1Os0OyeiLqRJ1Yt3TkRdSJOqF++ciLqQJlUv3jkRdSFNql68cyLqQppMvbjunIi6kCZTL647J6IupMnUi+sjUy+uOyeiLqTJ1Ivrzomo12l2Tv2U+vFUyFqWv3/VnVM/F9Js7DcX0mzsNxfSbOw3F9Js7DcX0mzsN/+QZnVnRN059XMhzcbvfhfSbPzu9zrNzqmfC2l29uL5/c6Isjyndk79XEizs9+8TrOz37xOs7PfvE6zs9+8TrOz37xMs3OypfbPflN9eWrunGy5kGZjv7mQZuN3vwtpNn73u5BmYy++kGbrfagv02y9D/Vlmq33ob5Ms/U+1Fdpdk62XEiTqhfvnGy5kCZVL9452XIhTapevHOy5UKaVL1452TLhTSpevHOJ0pdSLO1F7+YUKg7Z5AupNnai1+m2dqLX6bZ2otfpsk0n1VTzWfVVPNZNdV8Vk01n1V3PlHqQppUvXjnhNaFNKl68c4JqgtpUvXinRNOF9Kk6sU7nyj1Os3O+akLaVL14p3zUxfSpOrFO+enLqRJ1Yt3zk9dSJOqF++cn7qQJlUv3jk/dSFNqu63c2LpQprlFV6Gj2dh8TK+/1vqZ93yWrxQt7xqxvjI6Y/vPwbH96rlp/tV1Xpy5GXV8uR+WbX8jJ1X/f3v/w+w50aW"
839
- ],
840
- "fileMap": {
841
- "15": {
842
- "source": "impl Field {\n pub fn to_le_bits(self: Self, bit_size: u32) -> [u1] {\n crate::assert_constant(bit_size);\n self.__to_le_bits(bit_size)\n }\n \n pub fn to_be_bits(self: Self, bit_size: u32) -> [u1] {\n crate::assert_constant(bit_size);\n self.__to_be_bits(bit_size)\n }\n\n #[builtin(to_le_bits)]\n fn __to_le_bits(_self: Self, _bit_size: u32) -> [u1] {}\n \n #[builtin(to_be_bits)]\n fn __to_be_bits(_self: Self, _bit_size: u32) -> [u1] {}\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(_self: Self, _bit_size: u32) {}\n\n pub fn assert_max_bit_size(self: Self, bit_size: u32) {\n crate::assert_constant(bit_size);\n assert(bit_size < modulus_num_bits() as u32);\n self.__assert_max_bit_size(bit_size);\n }\n\n pub fn to_le_bytes(self: Self, byte_size: u32) -> [u8] {\n self.to_le_radix(256, byte_size)\n }\n\n pub fn to_be_bytes(self: Self, byte_size: u32) -> [u8] {\n self.to_be_radix(256, byte_size)\n }\n\n\n pub fn to_le_radix(self: Self, radix: u32, result_len: u32) -> [u8] {\n crate::assert_constant(radix);\n crate::assert_constant(result_len);\n self.__to_le_radix(radix, result_len)\n }\n\n pub fn to_be_radix(self: Self, radix: u32, result_len: u32) -> [u8] {\n crate::assert_constant(radix);\n crate::assert_constant(result_len);\n self.__to_be_radix(radix, result_len)\n }\n\n\n\n // decompose `_self` into a `_result_len` vector over the `_radix` basis\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(_self: Self, _radix: u32, _result_len: u32) -> [u8] {}\n \n #[builtin(to_be_radix)]\n fn __to_be_radix(_self: Self, _radix: u32, _result_len: u32) -> [u8] {}\n\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b = exponent.to_le_bits(32);\n\n for i in 1..33 {\n r *= r;\n r = (b[32-i] as Field) * (r * self) + (1 - b[32-i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x ∈ {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n}\n\n#[builtin(modulus_num_bits)]\npub fn modulus_num_bits() -> Field {}\n\n#[builtin(modulus_be_bits)]\npub fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub fn modulus_le_bytes() -> [u8] {}\n// Convert a 32 byte array to a field element\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n",
843
- "path": "std/field.nr"
844
- },
845
- "27": {
846
- "source": "struct Option<T> {\n _is_some: bool,\n _value: T,\n}\n\nimpl<T> Option<T> {\n /// Constructs a None value\n pub fn none() -> Self {\n Self { _is_some: false, _value: crate::unsafe::zeroed() }\n }\n\n /// Constructs a Some wrapper around the given value\n pub fn some(_value: T) -> Self {\n Self { _is_some: true, _value }\n }\n\n /// True if this Option is None\n pub fn is_none(self) -> bool {\n !self._is_some\n }\n\n /// True if this Option is Some\n pub fn is_some(self) -> bool {\n self._is_some\n }\n\n /// Asserts `self.is_some()` and returns the wrapped value.\n pub fn unwrap(self) -> T {\n assert(self._is_some);\n self._value\n }\n\n /// Returns the inner value without asserting `self.is_some()`\n /// Note that if `self` is `None`, there is no guarantee what value will be returned,\n /// only that it will be of type `T`.\n pub fn unwrap_unchecked(self) -> T {\n self._value\n }\n\n /// Returns the wrapped value if `self.is_some()`. Otherwise, returns the given default value.\n pub fn unwrap_or(self, default: T) -> T {\n if self._is_some {\n self._value\n } else {\n default\n }\n }\n\n /// Returns the wrapped value if `self.is_some()`. Otherwise, calls the given function to return\n /// a default value.\n pub fn unwrap_or_else<Env>(self, default: fn[Env]() -> T) -> T {\n if self._is_some {\n self._value\n } else {\n default()\n }\n }\n\n /// If self is `Some(x)`, this returns `Some(f(x))`. Otherwise, this returns `None`.\n pub fn map<U, Env>(self, f: fn[Env](T) -> U) -> Option<U> {\n if self._is_some {\n Option::some(f(self._value))\n } else {\n Option::none()\n }\n }\n\n /// If self is `Some(x)`, this returns `f(x)`. Otherwise, this returns the given default value.\n pub fn map_or<U, Env>(self, default: U, f: fn[Env](T) -> U) -> U {\n if self._is_some {\n f(self._value)\n } else {\n default\n }\n }\n\n /// If self is `Some(x)`, this returns `f(x)`. Otherwise, this returns `default()`.\n pub fn map_or_else<U, Env1, Env2>(self, default: fn[Env1]() -> U, f: fn[Env2](T) -> U) -> U {\n if self._is_some {\n f(self._value)\n } else {\n default()\n }\n }\n\n /// Returns None if self is None. Otherwise, this returns `other`.\n pub fn and(self, other: Self) -> Self {\n if self.is_none() {\n Option::none()\n } else {\n other\n }\n }\n\n /// If self is None, this returns None. Otherwise, this calls the given function\n /// with the Some value contained within self, and returns the result of that call.\n ///\n /// In some languages this function is called `flat_map` or `bind`.\n pub fn and_then<U, Env>(self, f: fn[Env](T) -> Option<U>) -> Option<U> {\n if self._is_some {\n f(self._value)\n } else {\n Option::none()\n }\n }\n\n /// If self is Some, return self. Otherwise, return `other`.\n pub fn or(self, other: Self) -> Self {\n if self._is_some {\n self\n } else {\n other\n }\n }\n\n /// If self is Some, return self. Otherwise, return `default()`.\n pub fn or_else<U, Env>(self, default: fn[Env]() -> Self) -> Self {\n if self._is_some {\n self\n } else {\n default()\n }\n }\n\n // If only one of the two Options is Some, return that option.\n // Otherwise, if both options are Some or both are None, None is returned.\n pub fn xor(self, other: Self) -> Self {\n if self._is_some {\n if other._is_some {\n Option::none()\n } else {\n self\n }\n } else if other._is_some {\n other\n } else {\n Option::none()\n }\n }\n\n /// Returns `Some(x)` if self is `Some(x)` and `predicate(x)` is true.\n /// Otherwise, this returns `None`\n pub fn filter<Env>(self, predicate: fn[Env](T) -> bool) -> Self {\n if self._is_some {\n if predicate(self._value) {\n self\n } else {\n Option::none()\n }\n } else {\n Option::none()\n }\n }\n\n /// Flattens an Option<Option<T>> into a Option<T>.\n /// This returns None if the outer Option is None. Otherwise, this returns the inner Option.\n pub fn flatten(option: Option<Option<T>>) -> Option<T> {\n if option._is_some {\n option._value\n } else {\n Option::none()\n }\n }\n}\n",
847
- "path": "std/option.nr"
848
- },
849
- "40": {
850
- "source": "use dep::protocol_types::{\n abis::{\n block_header::BlockHeader,\n call_context::CallContext,\n private_circuit_public_inputs::PrivateCircuitPublicInputs,\n public_circuit_public_inputs::PublicCircuitPublicInputs,\n },\n contrakt::deployment_data::ContractDeploymentData,\n hash::hash_args,\n};\n\n// docs:start:private-global-variables\nstruct PrivateGlobalVariables {\n chain_id: Field,\n version: Field,\n}\n// docs:end:private-global-variables\n\nimpl PrivateGlobalVariables {\n fn serialize(self) -> [Field; 2] {\n [self.chain_id, self.version]\n }\n}\n\n// docs:start:public-global-variables\nstruct PublicGlobalVariables {\n chain_id: Field,\n version: Field,\n block_number: Field,\n timestamp: Field,\n}\n// docs:end:public-global-variables\n\nimpl PublicGlobalVariables {\n fn serialize(self) -> [Field; 4] {\n [self.chain_id, self.version, self.block_number, self.timestamp]\n }\n}\n\n// PrivateContextInputs are expected to be provided to each private function\n// docs:start:private-context-inputs\nstruct PrivateContextInputs {\n call_context : CallContext,\n block_header: BlockHeader,\n contract_deployment_data: ContractDeploymentData,\n private_global_variables: PrivateGlobalVariables,\n}\n// docs:end:private-context-inputs\n\n// PublicContextInputs are expected to be provided to each public function\n// docs:start:public-context-inputs\nstruct PublicContextInputs {\n call_context: CallContext,\n block_header: BlockHeader,\n\n public_global_variables: PublicGlobalVariables,\n}\n// docs:end:public-context-inputs\n\nstruct Hasher {\n fields: [Field],\n}\n\nimpl Hasher {\n pub fn new()-> Self {\n Self { fields: [] }\n }\n\n pub fn add(&mut self, field: Field) {\n self.fields = self.fields.push_back(field);\n }\n\n pub fn add_multiple<N>(&mut self, fields: [Field; N]) {\n for i in 0..N {\n self.fields = self.fields.push_back(fields[i]);\n }\n }\n\n pub fn hash(self) -> Field {\n hash_args(self.fields)\n }\n}\n",
851
- "path": "/usr/src/yarn-project/aztec-nr/aztec/src/abi.nr"
852
- },
853
- "42": {
854
- "source": "use crate::context::{Context};\nuse crate::oracle::storage::storage_read;\nuse crate::oracle::storage::storage_write;\nuse crate::types::type_serialization::TypeSerializationInterface;\nuse dep::std::option::Option;\n\n// docs:start:public_state_struct\nstruct PublicState<T, T_SERIALIZED_LEN> {\n context: Context,\n storage_slot: Field,\n serialization_methods: TypeSerializationInterface<T, T_SERIALIZED_LEN>,\n}\n// docs:end:public_state_struct\n\nimpl<T, T_SERIALIZED_LEN> PublicState<T, T_SERIALIZED_LEN> {\n // docs:start:public_state_struct_new\n pub fn new(\n // Note: Passing the contexts to new(...) just to have an interface compatible with a Map.\n context: Context,\n storage_slot: Field,\n serialization_methods: TypeSerializationInterface<T, T_SERIALIZED_LEN>,\n ) -> Self {\n assert(storage_slot != 0, \"Storage slot 0 not allowed. Storage slots must start from 1.\");\n PublicState {\n context,\n storage_slot,\n serialization_methods,\n }\n }\n // docs:end:public_state_struct_new\n\n // docs:start:public_state_struct_read\n pub fn read(self) -> T {\n assert(self.context.private.is_none(), \"Public state writes only supported in public functions\");\n storage_read(self.storage_slot, self.serialization_methods.deserialize)\n }\n // docs:end:public_state_struct_read\n\n // docs:start:public_state_struct_write\n pub fn write(self, value: T) {\n assert(self.context.private.is_none(), \"Public state writes only supported in public functions\");\n let serialize = self.serialization_methods.serialize;\n let fields = serialize(value);\n storage_write(self.storage_slot, fields);\n }\n // docs:end:public_state_struct_write\n}\n",
855
- "path": "/usr/src/yarn-project/aztec-nr/aztec/src/state_vars/public_state.nr"
856
- },
857
- "43": {
858
- "source": "use crate::context::{PrivateContext, PublicContext, Context};\nuse dep::std::option::Option;\nuse dep::protocol_types::{\n hash::pedersen_hash,\n traits::{ToField}\n};\n\n// docs:start:map\nstruct Map<K, V> {\n context: Context,\n storage_slot: Field,\n state_var_constructor: fn(Context, Field) -> V,\n}\n// docs:end:map\n\nimpl<K, V> Map<K, V> {\n // docs:start:new\n pub fn new(\n context: Context,\n storage_slot: Field,\n state_var_constructor: fn(Context, Field) -> V,\n ) -> Self {\n assert(storage_slot != 0, \"Storage slot 0 not allowed. Storage slots must start from 1.\");\n Map {\n context,\n storage_slot,\n state_var_constructor,\n }\n }\n // docs:end:new\n\n // docs:start:at\n pub fn at(self, key: K) -> V where K: ToField {\n // TODO(#1204): use a generator index for the storage slot\n let derived_storage_slot = pedersen_hash([self.storage_slot, key.to_field()],0);\n\n let state_var_constructor = self.state_var_constructor;\n state_var_constructor(self.context, derived_storage_slot)\n }\n // docs:end:at\n}\n",
859
- "path": "/usr/src/yarn-project/aztec-nr/aztec/src/state_vars/map.nr"
860
- },
861
- "50": {
862
- "source": "use crate::types::type_serialization::TypeSerializationInterface;\n\nglobal BOOL_SERIALIZED_LEN: Field = 1;\n\nfn deserializeBool(fields: [Field; BOOL_SERIALIZED_LEN]) -> bool {\n fields[0] as bool\n}\n\nfn serializeBool(value: bool) -> [Field; BOOL_SERIALIZED_LEN] {\n [value as Field]\n}\n\nglobal BoolSerializationMethods = TypeSerializationInterface {\n deserialize: deserializeBool,\n serialize: serializeBool,\n};\n",
863
- "path": "/usr/src/yarn-project/aztec-nr/aztec/src/types/type_serialization/bool_serialization.nr"
864
- },
865
- "52": {
866
- "source": "struct BoundedVec<T, MaxLen> {\n storage: [T; MaxLen],\n len: Field,\n}\n\nimpl<T, MaxLen> BoundedVec<T, MaxLen> {\n pub fn new(initial_value: T) -> Self {\n BoundedVec { storage: [initial_value; MaxLen], len: 0 }\n }\n\n pub fn get(mut self: Self, index: Field) -> T {\n assert(index as u64 < self.len as u64);\n self.storage[index]\n }\n\n pub fn get_unchecked(mut self: Self, index: Field) -> T {\n self.storage[index]\n }\n\n pub fn push(&mut self, elem: T) {\n assert(self.len as u64 < MaxLen as u64);\n\n self.storage[self.len] = elem;\n self.len += 1;\n }\n\n pub fn push_array<Len>(&mut self, array: [T; Len]) {\n let newLen = self.len + array.len();\n assert(newLen as u64 <= MaxLen as u64);\n for i in 0..array.len() {\n self.storage[self.len + i] = array[i];\n }\n self.len = newLen;\n }\n\n pub fn pop(&mut self) -> T {\n assert(self.len as u64 > 0);\n\n let elem = self.storage[self.len - 1];\n self.len -= 1;\n elem\n }\n\n pub fn any<Env>(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n let mut exceeded_len = false;\n for i in 0..MaxLen {\n exceeded_len |= i == self.len;\n if (!exceeded_len) {\n ret |= predicate(self.storage[i]);\n }\n }\n ret\n }\n}\n\n#[test]\nfn test_vec_push_pop() {\n let mut vec: BoundedVec<Field, 3> = BoundedVec::new(0);\n assert(vec.len == 0);\n vec.push(2);\n assert(vec.len == 1);\n vec.push(4);\n assert(vec.len == 2);\n vec.push(6);\n assert(vec.len == 3);\n let x = vec.pop();\n assert(x == 6);\n assert(vec.len == 2);\n assert(vec.get(0) == 2);\n assert(vec.get(1) == 4);\n}\n\n#[test]\nfn test_vec_push_array() {\n let mut vec: BoundedVec<Field, 3> = BoundedVec::new(0);\n vec.push_array([2, 4]);\n assert(vec.len == 2);\n assert(vec.get(0) == 2);\n assert(vec.get(1) == 4);\n}\n\n#[test(should_fail)]\nfn test_vec_get_out_of_bound() {\n let mut vec: BoundedVec<Field, 2> = BoundedVec::new(0);\n vec.push_array([2, 4]);\n let _x = vec.get(2);\n}\n\n#[test(should_fail)]\nfn test_vec_get_not_declared() {\n let mut vec: BoundedVec<Field, 2> = BoundedVec::new(0);\n vec.push_array([2]);\n let _x = vec.get(1);\n}\n\n#[test(should_fail)]\nfn test_vec_get_uninitialized() {\n let mut vec: BoundedVec<Field, 2> = BoundedVec::new(0);\n let _x = vec.get(0);\n}\n\n#[test(should_fail)]\nfn test_vec_push_overflow() {\n let mut vec: BoundedVec<Field, 1> = BoundedVec::new(0);\n vec.push(1);\n vec.push(2);\n}\n\n#[test]\nfn test_vec_any() {\n let mut vec: BoundedVec<Field, 3> = BoundedVec::new(0);\n vec.push_array([2, 4, 6]);\n assert(vec.any(|v| v == 2) == true);\n assert(vec.any(|v| v == 4) == true);\n assert(vec.any(|v| v == 6) == true);\n assert(vec.any(|v| v == 3) == false);\n}\n\n#[test]\nfn test_vec_any_not_default() {\n let default_value = 1;\n let mut vec: BoundedVec<Field, 3> = BoundedVec::new(default_value);\n vec.push_array([2, 4]);\n assert(vec.any(|v| v == default_value) == false);\n}\n",
867
- "path": "/usr/src/yarn-project/aztec-nr/aztec/src/types/vec.nr"
868
- },
869
- "64": {
870
- "source": "pub fn arr_copy_slice<T, N, M>(src: [T; N], mut dst: [T; M], offset: Field) -> [T; M] {\n for i in 0..dst.len() {\n dst[i] = src[i + offset];\n }\n dst\n}\n\n// TODO(#3470): Copied over from https://github.com/AztecProtocol/aztec-packages/blob/a07c4bd47313be6aa604a63f37857eb0136b41ba/yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/base/base_rollup_inputs.nr#L599\n// move to a shared place?\n\n// TODO to radix returns u8, so we cannot use bigger radixes. It'd be ideal to use a radix of the maximum range-constrained integer noir supports\npub fn full_field_less_than(lhs: Field, rhs: Field) -> bool {\n dep::std::eddsa::lt_bytes32(lhs, rhs)\n}\n\npub fn full_field_greater_than(lhs: Field, rhs: Field) -> bool {\n dep::std::eddsa::lt_bytes32(rhs, lhs)\n}\n\nstruct Reader<N> {\n data: [Field; N],\n offset: Field,\n}\n\nimpl<N> Reader<N> {\n pub fn new(data: [Field; N]) -> Self {\n Self { data, offset: 0 }\n }\n\n pub fn read(&mut self) -> Field {\n let result = self.data[self.offset];\n self.offset += 1;\n result\n }\n\n pub fn read_array<K>(&mut self, mut result: [Field; K]) -> [Field; K] {\n for i in 0..K {\n result[i] = self.data[self.offset + i];\n }\n self.offset += K;\n result\n }\n\n pub fn read_struct<T, K>(&mut self, deserialise: fn([Field; K]) -> T) -> T {\n let result = deserialise(self.read_array([0; K]));\n result\n }\n\n pub fn read_struct_array<T, K, C>(&mut self, deserialise: fn([Field; K]) -> T, mut result: [T; C]) -> [T; C] {\n for i in 0..C {\n result[i] = self.read_struct(deserialise);\n }\n result\n }\n\n pub fn finish(self) {\n assert(self.offset == self.data.len(), \"Reader did not read all data\");\n } \n}\n",
871
- "path": "/usr/src/yarn-project/aztec-nr/aztec/src/utils.nr"
872
- },
873
- "66": {
874
- "source": "use dep::protocol_types::{\n abis::{\n block_header::BlockHeader,\n call_context::CallContext,\n function_data::FunctionData,\n function_selector::FunctionSelector,\n private_circuit_public_inputs::PrivateCircuitPublicInputs,\n public_circuit_public_inputs::PublicCircuitPublicInputs,\n call_stack_item::PrivateCallStackItem,\n call_stack_item::PublicCallStackItem,\n side_effect::{SideEffect, SideEffectLinkedToNoteHash},\n },\n address::{\n AztecAddress,\n EthAddress,\n },\n constants::{\n MAX_NEW_COMMITMENTS_PER_CALL,\n MAX_NEW_L2_TO_L1_MSGS_PER_CALL,\n MAX_NEW_NULLIFIERS_PER_CALL,\n MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL,\n MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL,\n MAX_PUBLIC_DATA_READS_PER_CALL,\n MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL,\n MAX_READ_REQUESTS_PER_CALL,\n NUM_FIELDS_PER_SHA256,\n RETURN_VALUES_LENGTH,\n },\n contrakt::{\n deployment_data::ContractDeploymentData,\n storage_read::StorageRead,\n storage_update_request::StorageUpdateRequest,\n },\n hash::hash_args,\n grumpkin_point::GrumpkinPoint,\n};\n\n// TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n// use dep::std::collections::vec::Vec;\n\nuse crate::abi::{\n PrivateContextInputs,\n PublicContextInputs,\n};\n\n// l1 to l2 messaging\nuse crate::messaging::process_l1_to_l2_message;\n\nuse crate::types::{\n vec::BoundedVec,\n};\n\nuse crate::utils::Reader;\n\nuse crate::oracle::{\n arguments,\n call_private_function::call_private_function_internal,\n public_call::call_public_function_internal,\n enqueue_public_function_call::enqueue_public_function_call_internal,\n context::get_portal_address,\n get_block_header::get_block_header,\n};\n\nuse dep::std::option::Option;\n\n// When finished, one can call .finish() to convert back to the abi\nstruct PrivateContext {\n // docs:start:private-context\n inputs: PrivateContextInputs,\n side_effect_counter: u32,\n\n args_hash : Field,\n return_values : BoundedVec<Field, RETURN_VALUES_LENGTH>,\n\n read_requests: BoundedVec<SideEffect, MAX_READ_REQUESTS_PER_CALL>,\n\n new_commitments: BoundedVec<SideEffect, MAX_NEW_COMMITMENTS_PER_CALL>,\n new_nullifiers: BoundedVec<SideEffectLinkedToNoteHash, MAX_NEW_NULLIFIERS_PER_CALL>,\n\n private_call_stack_hashes : BoundedVec<Field, MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL>,\n public_call_stack_hashes : BoundedVec<Field, MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL>,\n new_l2_to_l1_msgs : BoundedVec<Field, MAX_NEW_L2_TO_L1_MSGS_PER_CALL>,\n // docs:end:private-context\n\n block_header: BlockHeader,\n\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n // encrypted_logs_preimages: Vec<Field>,\n // unencrypted_logs_preimages: Vec<Field>,\n}\n\nimpl PrivateContext {\n pub fn new(inputs: PrivateContextInputs, args_hash: Field) -> PrivateContext {\n PrivateContext {\n inputs: inputs,\n side_effect_counter: inputs.call_context.start_side_effect_counter,\n\n args_hash: args_hash,\n return_values: BoundedVec::new(0),\n\n read_requests: BoundedVec::new(SideEffect::empty()),\n\n new_commitments: BoundedVec::new(SideEffect::empty()),\n new_nullifiers: BoundedVec::new(SideEffectLinkedToNoteHash::empty()),\n\n block_header: inputs.block_header,\n\n private_call_stack_hashes: BoundedVec::new(0),\n public_call_stack_hashes: BoundedVec::new(0),\n new_l2_to_l1_msgs: BoundedVec::new(0),\n\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n // encrypted_logs_preimages: Vec::new(),\n // unencrypted_logs_preimages: Vec::new(),\n }\n }\n\n pub fn msg_sender(self) -> AztecAddress {\n self.inputs.call_context.msg_sender\n }\n\n pub fn this_address(self) -> AztecAddress {\n self.inputs.call_context.storage_contract_address\n }\n\n pub fn this_portal_address(self) -> EthAddress {\n self.inputs.call_context.portal_contract_address\n }\n\n pub fn chain_id(self) -> Field {\n self.inputs.private_global_variables.chain_id\n }\n\n pub fn version(self) -> Field {\n self.inputs.private_global_variables.version\n }\n\n pub fn selector(self) -> FunctionSelector {\n self.inputs.call_context.function_selector\n }\n\n pub fn get_block_header(self, block_number: u32) -> BlockHeader {\n get_block_header(block_number, self)\n }\n\n pub fn finish(self) -> PrivateCircuitPublicInputs {\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n let encrypted_logs_hash = [0; NUM_FIELDS_PER_SHA256];\n let unencrypted_logs_hash = [0; NUM_FIELDS_PER_SHA256];\n let encrypted_log_preimages_length = 0;\n let unencrypted_log_preimages_length = 0;\n\n let priv_circuit_pub_inputs = PrivateCircuitPublicInputs {\n call_context: self.inputs.call_context,\n args_hash: self.args_hash,\n return_values: self.return_values.storage,\n read_requests: self.read_requests.storage,\n new_commitments: self.new_commitments.storage,\n new_nullifiers: self.new_nullifiers.storage,\n private_call_stack_hashes: self.private_call_stack_hashes.storage,\n public_call_stack_hashes: self.public_call_stack_hashes.storage,\n new_l2_to_l1_msgs: self.new_l2_to_l1_msgs.storage,\n end_side_effect_counter: self.side_effect_counter,\n encrypted_logs_hash: encrypted_logs_hash,\n unencrypted_logs_hash: unencrypted_logs_hash,\n encrypted_log_preimages_length: encrypted_log_preimages_length,\n unencrypted_log_preimages_length: unencrypted_log_preimages_length,\n block_header: self.block_header,\n contract_deployment_data: self.inputs.contract_deployment_data,\n chain_id: self.inputs.private_global_variables.chain_id,\n version: self.inputs.private_global_variables.version,\n };\n priv_circuit_pub_inputs\n }\n\n pub fn push_read_request(&mut self, read_request: Field) {\n let side_effect = SideEffect {\n value: read_request,\n counter: self.side_effect_counter,\n };\n self.read_requests.push(side_effect);\n self.side_effect_counter = self.side_effect_counter + 1;\n }\n\n pub fn push_new_note_hash(&mut self, note_hash: Field) {\n let side_effect = SideEffect {\n value: note_hash,\n counter: self.side_effect_counter,\n };\n self.new_commitments.push(side_effect);\n self.side_effect_counter = self.side_effect_counter + 1;\n }\n\n pub fn push_new_nullifier(&mut self, nullifier: Field, nullified_commitment: Field) {\n let side_effect = SideEffectLinkedToNoteHash {\n value: nullifier,\n note_hash: nullified_commitment,\n counter: self.side_effect_counter,\n };\n self.new_nullifiers.push(side_effect);\n self.side_effect_counter = self.side_effect_counter + 1;\n }\n\n // docs:start:context_message_portal\n pub fn message_portal(&mut self, content: Field) \n // docs:end:context_message_portal\n {\n self.new_l2_to_l1_msgs.push(content);\n }\n\n // PrivateContextInputs must be temporarily passed in to prevent too many unknowns\n // Note this returns self to get around an issue where mutable structs do not maintain mutations unless reassigned\n // docs:start:context_consume_l1_to_l2_message\n // docs:start:consume_l1_to_l2_message\n pub fn consume_l1_to_l2_message(\n &mut self,\n msg_key: Field,\n content: Field,\n secret: Field\n ) \n // docs:end:context_consume_l1_to_l2_message\n {\n let nullifier = process_l1_to_l2_message(self.block_header.l1_to_l2_message_tree_root, self.this_address(), self.this_portal_address(), self.chain_id(), self.version(), msg_key, content, secret);\n\n // Push nullifier (and the \"commitment\" corresponding to this can be \"empty\")\n self.push_new_nullifier(nullifier, 0)\n }\n // docs:end:consume_l1_to_l2_message\n\n pub fn accumulate_encrypted_logs<N>(&mut self, log: [Field; N]) {\n let _void1 = self.inputs;\n let _void2 = log;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n }\n\n pub fn accumulate_unencrypted_logs<T>(&mut self, log: T) {\n let _void1 = self.inputs;\n let _void2 = log;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n }\n\n pub fn call_private_function<ARGS_COUNT>(\n &mut self,\n contract_address: AztecAddress, \n function_selector: FunctionSelector, \n args: [Field; ARGS_COUNT]\n ) -> [Field; RETURN_VALUES_LENGTH] {\n let args_hash = hash_args(args);\n assert(args_hash == arguments::pack_arguments(args));\n self.call_private_function_with_packed_args(contract_address, function_selector, args_hash)\n }\n\n pub fn call_private_function_no_args(\n &mut self,\n contract_address: AztecAddress, \n function_selector: FunctionSelector, \n ) -> [Field; RETURN_VALUES_LENGTH] {\n self.call_private_function_with_packed_args(contract_address, function_selector, 0)\n }\n\n pub fn call_private_function_with_packed_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field\n ) -> [Field; RETURN_VALUES_LENGTH] {\n let fields = call_private_function_internal(\n contract_address,\n function_selector, \n args_hash,\n self.side_effect_counter,\n );\n let mut reader = Reader::new(fields);\n\n let item = PrivateCallStackItem {\n contract_address: AztecAddress::from_field(reader.read()),\n function_data: FunctionData {\n selector: FunctionSelector::from_field(reader.read()),\n is_internal: reader.read() as bool,\n is_private: reader.read() as bool,\n is_constructor: reader.read() as bool,\n },\n public_inputs: PrivateCircuitPublicInputs {\n call_context: CallContext {\n msg_sender : AztecAddress::from_field(reader.read()),\n storage_contract_address : AztecAddress::from_field(reader.read()),\n portal_contract_address : EthAddress::from_field(reader.read()),\n function_selector: FunctionSelector::from_field(reader.read()), // practically same as fields[1]\n is_delegate_call : reader.read() as bool,\n is_static_call : reader.read() as bool,\n is_contract_deployment: reader.read() as bool,\n start_side_effect_counter: reader.read() as u32,\n },\n args_hash: reader.read(),\n return_values: reader.read_array([0; RETURN_VALUES_LENGTH]), // +1\n read_requests: reader.read_struct_array(SideEffect::deserialise, [SideEffect::empty(); MAX_READ_REQUESTS_PER_CALL]),\n new_commitments: reader.read_struct_array(SideEffect::deserialise, [SideEffect::empty(); MAX_NEW_COMMITMENTS_PER_CALL]),\n new_nullifiers: reader.read_struct_array(SideEffectLinkedToNoteHash::deserialise, [SideEffectLinkedToNoteHash::empty(); MAX_NEW_NULLIFIERS_PER_CALL]),\n private_call_stack_hashes: reader.read_array([0; MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL]),\n public_call_stack_hashes: reader.read_array([0; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL]),\n new_l2_to_l1_msgs: reader.read_array([0; MAX_NEW_L2_TO_L1_MSGS_PER_CALL]),\n end_side_effect_counter: reader.read() as u32,\n encrypted_logs_hash: reader.read_array([0; NUM_FIELDS_PER_SHA256]),\n unencrypted_logs_hash: reader.read_array([0; NUM_FIELDS_PER_SHA256]),\n encrypted_log_preimages_length: reader.read(),\n unencrypted_log_preimages_length: reader.read(),\n block_header: BlockHeader{\n // Must match order in `private_circuit_public_inputs.hpp`\n note_hash_tree_root : reader.read(),\n nullifier_tree_root : reader.read(),\n contract_tree_root : reader.read(),\n l1_to_l2_message_tree_root : reader.read(),\n archive_root : reader.read(),\n public_data_tree_root: reader.read(),\n global_variables_hash: reader.read(),\n },\n contract_deployment_data: ContractDeploymentData {\n deployer_public_key: GrumpkinPoint {\n x: reader.read(), \n y: reader.read()\n },\n constructor_vk_hash : reader.read(),\n function_tree_root : reader.read(),\n contract_address_salt : reader.read(),\n portal_contract_address : EthAddress::from_field(reader.read()),\n },\n chain_id: reader.read(),\n version: reader.read(),\n },\n is_execution_request: reader.read() as bool,\n };\n\n reader.finish();\n\n assert_eq(item.public_inputs.call_context.start_side_effect_counter, self.side_effect_counter);\n self.side_effect_counter = item.public_inputs.end_side_effect_counter + 1;\n \n assert(contract_address.eq(item.contract_address));\n assert(function_selector.eq(item.function_data.selector));\n\n assert(args_hash == item.public_inputs.args_hash);\n\n assert(item.is_execution_request == false);\n\n // Assert that the call context of the enqueued call generated by the oracle matches our request.\n // We are issuing a regular call which is not delegate, static, or deployment. We also constrain\n // the msg_sender in the nested call to be equal to our address, and the execution context address\n // for the nested call to be equal to the address we actually called.\n assert(item.public_inputs.call_context.is_delegate_call == false);\n assert(item.public_inputs.call_context.is_static_call == false);\n assert(item.public_inputs.call_context.is_contract_deployment == false);\n assert(item.public_inputs.call_context.msg_sender.eq(self.inputs.call_context.storage_contract_address));\n assert(item.public_inputs.call_context.storage_contract_address.eq(contract_address));\n\n self.private_call_stack_hashes.push(item.hash());\n\n item.public_inputs.return_values\n }\n\n pub fn call_public_function<ARGS_COUNT>(\n &mut self,\n contract_address: AztecAddress, \n function_selector: FunctionSelector, \n args: [Field; ARGS_COUNT]\n ) {\n let args_hash = hash_args(args);\n assert(args_hash == arguments::pack_arguments(args));\n self.call_public_function_with_packed_args(contract_address, function_selector, args_hash)\n }\n\n pub fn call_public_function_no_args(\n &mut self,\n contract_address: AztecAddress, \n function_selector: FunctionSelector,\n ) {\n self.call_public_function_with_packed_args(contract_address, function_selector, 0)\n }\n\n pub fn call_public_function_with_packed_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field\n ) {\n let fields = enqueue_public_function_call_internal(\n contract_address, \n function_selector, \n args_hash,\n self.side_effect_counter\n );\n\n let mut reader = Reader::new(fields);\n\n let item = PublicCallStackItem {\n contract_address: AztecAddress::from_field(reader.read()),\n function_data: FunctionData {\n selector: FunctionSelector::from_field(reader.read()),\n is_internal: reader.read() as bool,\n is_private: reader.read() as bool,\n is_constructor: reader.read() as bool,\n },\n public_inputs: PublicCircuitPublicInputs {\n call_context: CallContext {\n msg_sender : AztecAddress::from_field(reader.read()),\n storage_contract_address : AztecAddress::from_field(reader.read()),\n portal_contract_address : EthAddress::from_field(reader.read()),\n function_selector: FunctionSelector::from_field(reader.read()), // practically same as fields[1]\n is_delegate_call : reader.read() as bool,\n is_static_call : reader.read() as bool,\n is_contract_deployment: reader.read() as bool,\n start_side_effect_counter: reader.read() as u32,\n },\n args_hash: reader.read(),\n return_values: [0; RETURN_VALUES_LENGTH],\n contract_storage_update_requests: [StorageUpdateRequest::empty(); MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL],\n contract_storage_reads: [StorageRead::empty(); MAX_PUBLIC_DATA_READS_PER_CALL],\n public_call_stack_hashes: [0; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL],\n new_commitments: [SideEffect::empty(); MAX_NEW_COMMITMENTS_PER_CALL],\n new_nullifiers: [SideEffectLinkedToNoteHash::empty(); MAX_NEW_NULLIFIERS_PER_CALL],\n new_l2_to_l1_msgs:[0; MAX_NEW_L2_TO_L1_MSGS_PER_CALL],\n unencrypted_logs_hash:[0; NUM_FIELDS_PER_SHA256],\n unencrypted_log_preimages_length: 0,\n block_header: BlockHeader::empty(),\n prover_address: AztecAddress::zero(),\n },\n is_execution_request: true,\n };\n reader.finish();\n\n assert(contract_address.eq(item.contract_address));\n assert(function_selector.eq(item.function_data.selector));\n\n assert_eq(item.public_inputs.call_context.start_side_effect_counter, self.side_effect_counter);\n // We increment the sideffect counter by one, to account for the call itself being a side effect.\n self.side_effect_counter = self.side_effect_counter + 1;\n \n assert(args_hash == item.public_inputs.args_hash);\n\n // Assert that the call context of the enqueued call generated by the oracle matches our request.\n // We are issuing a regular call which is not delegate, static, or deployment. We also constrain\n // the msg_sender in the nested call to be equal to our address, and the execution context address\n // for the nested call to be equal to the address we actually called.\n assert(item.public_inputs.call_context.is_delegate_call == false);\n assert(item.public_inputs.call_context.is_static_call == false);\n assert(item.public_inputs.call_context.is_contract_deployment == false);\n assert(item.public_inputs.call_context.msg_sender.eq(self.inputs.call_context.storage_contract_address));\n assert(item.public_inputs.call_context.storage_contract_address.eq(contract_address));\n\n self.public_call_stack_hashes.push(item.hash());\n }\n}\n\nstruct PublicContext {\n inputs: PublicContextInputs,\n side_effect_counter: u32,\n\n args_hash : Field,\n return_values : BoundedVec<Field, RETURN_VALUES_LENGTH>,\n\n contract_storage_update_requests: BoundedVec<StorageUpdateRequest, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL>,\n contract_storage_reads: BoundedVec<StorageRead, MAX_PUBLIC_DATA_READS_PER_CALL>,\n public_call_stack_hashes: BoundedVec<Field, MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL>,\n\n new_commitments: BoundedVec<SideEffect, MAX_NEW_COMMITMENTS_PER_CALL>,\n new_nullifiers: BoundedVec<SideEffectLinkedToNoteHash, MAX_NEW_NULLIFIERS_PER_CALL>,\n\n new_l2_to_l1_msgs: BoundedVec<Field, MAX_NEW_L2_TO_L1_MSGS_PER_CALL>,\n\n unencrypted_logs_hash: BoundedVec<Field, NUM_FIELDS_PER_SHA256>,\n unencrypted_logs_preimages_length: Field,\n\n block_header: BlockHeader,\n prover_address: AztecAddress,\n}\n\nimpl PublicContext {\n pub fn new(inputs: PublicContextInputs, args_hash: Field) -> PublicContext {\n let empty_storage_read = StorageRead::empty();\n let empty_storage_update = StorageUpdateRequest::empty();\n PublicContext {\n inputs: inputs,\n side_effect_counter: inputs.call_context.start_side_effect_counter,\n\n args_hash: args_hash,\n return_values: BoundedVec::new(0),\n\n contract_storage_update_requests: BoundedVec::new(empty_storage_update),\n contract_storage_reads: BoundedVec::new(empty_storage_read),\n public_call_stack_hashes: BoundedVec::new(0),\n\n new_commitments: BoundedVec::new(SideEffect::empty()),\n new_nullifiers: BoundedVec::new(SideEffectLinkedToNoteHash::empty()),\n\n new_l2_to_l1_msgs: BoundedVec::new(0),\n\n \n unencrypted_logs_hash: BoundedVec::new(0),\n unencrypted_logs_preimages_length: 0,\n\n block_header: inputs.block_header,\n prover_address: AztecAddress::zero(),\n\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n // encrypted_logs_preimages: Vec::new(),\n // unencrypted_logs_preimages: Vec::new(),\n }\n }\n\n pub fn msg_sender(self) -> AztecAddress {\n self.inputs.call_context.msg_sender\n }\n\n pub fn this_address(self) -> AztecAddress {\n self.inputs.call_context.storage_contract_address\n }\n\n pub fn this_portal_address(self) -> EthAddress {\n self.inputs.call_context.portal_contract_address\n }\n\n pub fn chain_id(self) -> Field {\n self.inputs.public_global_variables.chain_id\n }\n\n pub fn version(self) -> Field {\n self.inputs.public_global_variables.version\n }\n\n pub fn selector(self) -> FunctionSelector {\n self.inputs.call_context.function_selector\n }\n\n pub fn block_number(self) -> Field {\n self.inputs.public_global_variables.block_number\n }\n\n pub fn timestamp(self) -> Field {\n self.inputs.public_global_variables.timestamp\n }\n\n pub fn finish(self) -> PublicCircuitPublicInputs {\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n let unencrypted_logs_hash = [0; NUM_FIELDS_PER_SHA256];\n let unencrypted_log_preimages_length = 0;\n\n\n // Compute the public call stack hashes\n let pub_circuit_pub_inputs = PublicCircuitPublicInputs {\n call_context: self.inputs.call_context, // Done\n args_hash: self.args_hash, // Done\n contract_storage_update_requests: self.contract_storage_update_requests.storage,\n contract_storage_reads: self.contract_storage_reads.storage,\n return_values: self.return_values.storage,\n new_commitments: self.new_commitments.storage,\n new_nullifiers: self.new_nullifiers.storage,\n public_call_stack_hashes: self.public_call_stack_hashes.storage,\n new_l2_to_l1_msgs: self.new_l2_to_l1_msgs.storage,\n unencrypted_logs_hash: unencrypted_logs_hash,\n unencrypted_log_preimages_length: unencrypted_log_preimages_length,\n block_header: self.inputs.block_header,\n prover_address: self.prover_address,\n };\n pub_circuit_pub_inputs\n }\n\n pub fn push_new_note_hash(&mut self, note_hash: Field) {\n let side_effect = SideEffect {\n value: note_hash,\n counter: self.side_effect_counter\n };\n self.new_commitments.push(side_effect);\n self.side_effect_counter = self.side_effect_counter + 1;\n }\n\n pub fn push_new_nullifier(&mut self, nullifier: Field, _nullified_commitment: Field) {\n let side_effect = SideEffectLinkedToNoteHash {\n value: nullifier,\n note_hash: 0, // cannot nullify pending notes in public context\n counter: self.side_effect_counter\n };\n self.new_nullifiers.push(side_effect);\n self.side_effect_counter = self.side_effect_counter + 1;\n }\n\n pub fn message_portal(&mut self, content: Field) {\n self.new_l2_to_l1_msgs.push(content);\n }\n\n // PrivateContextInputs must be temporarily passed in to prevent too many unknowns\n // Note this returns self to get around an issue where mutable structs do not maintain mutations unless reassigned\n pub fn consume_l1_to_l2_message(&mut self, msg_key: Field, content: Field, secret: Field) {\n let this = (*self).this_address();\n let nullifier = process_l1_to_l2_message(self.block_header.l1_to_l2_message_tree_root, this, self.this_portal_address(), self.chain_id(), self.version(), msg_key, content, secret);\n\n // Push nullifier (and the \"commitment\" corresponding to this can be \"empty\")\n self.push_new_nullifier(nullifier, 0)\n }\n\n pub fn accumulate_encrypted_logs<N>(&mut self, log: [Field; N]) {\n let _void1 = self;\n let _void2 = log;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n }\n\n pub fn accumulate_unencrypted_logs<T>(&mut self, log: T) {\n let _void1 = self;\n let _void2 = log;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n }\n\n pub fn call_public_function<ARGS_COUNT>(\n _self: Self,\n contract_address: AztecAddress, \n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT],\n ) -> [Field; RETURN_VALUES_LENGTH] {\n let args_hash = hash_args(args);\n assert(args_hash == arguments::pack_arguments(args));\n call_public_function_internal(\n contract_address, \n function_selector, \n args_hash,\n )\n }\n\n pub fn call_public_function_no_args(\n _self: Self,\n contract_address: AztecAddress, \n function_selector: FunctionSelector,\n ) -> [Field; RETURN_VALUES_LENGTH] {\n call_public_function_internal(\n contract_address, \n function_selector, \n 0,\n )\n }\n\n}\n\nstruct Context {\n private: Option<&mut PrivateContext>,\n public: Option<&mut PublicContext>,\n}\n\nimpl Context {\n pub fn private(context: &mut PrivateContext) -> Context {\n Context {\n private: Option::some(context),\n public: Option::none()\n }\n }\n\n pub fn public(context: &mut PublicContext) -> Context {\n Context {\n public: Option::some(context),\n private: Option::none()\n }\n }\n\n pub fn none() -> Context {\n Context {\n public: Option::none(),\n private: Option::none()\n }\n }\n}\n",
875
- "path": "/usr/src/yarn-project/aztec-nr/aztec/src/context.nr"
876
- },
877
- "80": {
878
- "source": "use dep::protocol_types::{\n abis::function_selector::FunctionSelector,\n address::AztecAddress,\n};\n\n// contract_address + \n// args_hash +\n// crate::abi::FUNCTION_DATA_SIZE +\n// crate::abi::CALL_CONTEXT_SIZE\n// = 2 + 4 + 8\nglobal ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_SIZE: Field = 14;\n\n#[oracle(enqueuePublicFunctionCall)]\nfn enqueue_public_function_call_oracle(\n _contract_address: AztecAddress,\n _function_selector: FunctionSelector,\n _args_hash: Field,\n _side_effect_counter: u32\n) -> [Field; ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_SIZE] {}\n\nunconstrained pub fn enqueue_public_function_call_internal(\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n side_effect_counter: u32\n) -> [Field; ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_SIZE] {\n enqueue_public_function_call_oracle(\n contract_address,\n function_selector,\n args_hash,\n side_effect_counter\n )\n}\n",
879
- "path": "/usr/src/yarn-project/aztec-nr/aztec/src/oracle/enqueue_public_function_call.nr"
880
- },
881
- "85": {
882
- "source": "use dep::protocol_types::{\n abis::function_selector::FunctionSelector,\n address::AztecAddress,\n constants::CALL_PRIVATE_FUNCTION_RETURN_SIZE,\n};\n\n#[oracle(callPrivateFunction)]\nfn call_private_function_oracle(\n _contract_address: AztecAddress,\n _function_selector: FunctionSelector,\n _args_hash: Field,\n _start_side_effect_counter: u32\n) -> [Field; CALL_PRIVATE_FUNCTION_RETURN_SIZE] {}\n\nunconstrained pub fn call_private_function_internal(\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n start_side_effect_counter: u32\n) -> [Field; CALL_PRIVATE_FUNCTION_RETURN_SIZE] {\n call_private_function_oracle(\n contract_address,\n function_selector,\n args_hash,\n start_side_effect_counter\n )\n}\n",
883
- "path": "/usr/src/yarn-project/aztec-nr/aztec/src/oracle/call_private_function.nr"
884
- },
885
- "92": {
886
- "source": "#[oracle(storageRead)]\nfn storage_read_oracle<N>(_storage_slot: Field, _number_of_elements: Field) -> [Field; N] {}\n\nunconstrained fn storage_read_oracle_wrapper<N>(_storage_slot: Field) -> [Field; N] {\n storage_read_oracle(_storage_slot, N)\n}\n\npub fn storage_read<T, N>(storage_slot: Field, deserialize: fn([Field; N]) -> T) -> T {\n let fields = storage_read_oracle_wrapper(storage_slot);\n deserialize(fields)\n}\n\n#[oracle(storageWrite)]\nfn storage_write_oracle<N>(_storage_slot: Field, _values: [Field; N]) -> [Field; N] {}\n\n// TODO: Remove return value.\nunconstrained pub fn storage_write<N>(storage_slot: Field, fields: [Field; N]) {\n let _hash = storage_write_oracle(storage_slot, fields);\n}\n",
887
- "path": "/usr/src/yarn-project/aztec-nr/aztec/src/oracle/storage.nr"
888
- },
889
- "98": {
890
- "source": "global ARGS_LENGTH: Field = 16;\nglobal RETURN_VALUES_LENGTH: Field = 4;\n\n/**\n * Convention for constant array lengths are mainly divided in 2 classes:\n * - FUNCTION CALL\n * - TRANSACTION\n *\n * Agreed convention is to use MAX_XXX_PER_CALL resp. MAX_XXX_PER_TX, where XXX denotes a type of element such as\n * commitment, or nullifier, e.g.,:\n * - MAX_NEW_NULLIFIERS_PER_CALL\n * - MAX_NEW_COMMITMENTS_PER_TX\n *\n * In the kernel circuits, we accumulate elements such as commitments and the nullifiers from all functions calls in a\n * transaction. Therefore, we always must have:\n * MAX_XXX_PER_TX ≥ MAX_XXX_PER_CALL\n *\n * For instance:\n * MAX_NEW_COMMITMENTS_PER_TX MAX_NEW_COMMITMENTS_PER_CALL\n * MAX_NEW_NULLIFIERS_PER_TX MAX_NEW_NULLIFIERS_PER_CALL\n *\n */\n\n// docs:start:constants\n// \"PER CALL\" CONSTANTS\nglobal MAX_NEW_COMMITMENTS_PER_CALL: Field = 16;\nglobal MAX_NEW_NULLIFIERS_PER_CALL: Field = 16;\nglobal MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL: Field = 4;\nglobal MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL: Field = 4;\nglobal MAX_NEW_L2_TO_L1_MSGS_PER_CALL: Field = 2;\nglobal MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL: Field = 16;\nglobal MAX_PUBLIC_DATA_READS_PER_CALL: Field = 16;\nglobal MAX_READ_REQUESTS_PER_CALL: Field = 32;\n\n// \"PER TRANSACTION\" CONSTANTS\nglobal MAX_NEW_COMMITMENTS_PER_TX: Field = 64;\nglobal MAX_NEW_NULLIFIERS_PER_TX: Field = 64;\nglobal MAX_PRIVATE_CALL_STACK_LENGTH_PER_TX: Field = 8;\nglobal MAX_PUBLIC_CALL_STACK_LENGTH_PER_TX: Field = 8;\nglobal MAX_NEW_L2_TO_L1_MSGS_PER_TX: Field = 2;\nglobal MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX: Field = 16;\nglobal MAX_PUBLIC_DATA_READS_PER_TX: Field = 16;\nglobal MAX_NEW_CONTRACTS_PER_TX: Field = 1;\nglobal MAX_OPTIONALLY_REVEALED_DATA_LENGTH_PER_TX: Field = 4;\nglobal MAX_READ_REQUESTS_PER_TX: Field = 128;\nglobal NUM_ENCRYPTED_LOGS_HASHES_PER_TX: Field = 1;\nglobal NUM_UNENCRYPTED_LOGS_HASHES_PER_TX: Field = 1;\n// docs:end:constants\n\n// ROLLUP CONTRACT CONSTANTS - constants used only in l1-contracts\nglobal NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP: Field = 16;\n\n// TREES RELATED CONSTANTS\nglobal VK_TREE_HEIGHT: Field = 3;\nglobal FUNCTION_TREE_HEIGHT: Field = 5;\nglobal CONTRACT_TREE_HEIGHT: Field = 16;\nglobal NOTE_HASH_TREE_HEIGHT: Field = 32;\nglobal PUBLIC_DATA_TREE_HEIGHT: Field = 40;\nglobal NULLIFIER_TREE_HEIGHT: Field = 20;\nglobal L1_TO_L2_MSG_TREE_HEIGHT: Field = 16;\nglobal ROLLUP_VK_TREE_HEIGHT: Field = 8;\n\n// SUB-TREES RELATED CONSTANTS\nglobal CONTRACT_SUBTREE_HEIGHT: Field = 0;\nglobal CONTRACT_SUBTREE_SIBLING_PATH_LENGTH: Field = 16;\nglobal NOTE_HASH_SUBTREE_HEIGHT: Field = 6;\nglobal NOTE_HASH_SUBTREE_SIBLING_PATH_LENGTH: Field = 26;\nglobal NULLIFIER_SUBTREE_HEIGHT: Field = 6;\nglobal PUBLIC_DATA_SUBTREE_HEIGHT: Field = 4;\nglobal ARCHIVE_HEIGHT: Field = 16;\nglobal NULLIFIER_SUBTREE_SIBLING_PATH_LENGTH: Field = 14;\nglobal PUBLIC_DATA_SUBTREE_SIBLING_PATH_LENGTH: Field = 36;\nglobal L1_TO_L2_MSG_SUBTREE_HEIGHT: Field = 4;\nglobal L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH: Field = 12;\n\n// MISC CONSTANTS\nglobal FUNCTION_SELECTOR_NUM_BYTES: Field = 4;\nglobal MAPPING_SLOT_PEDERSEN_SEPARATOR: Field = 4;\n// sha256 hash is stored in two fields to accommodate all 256-bits of the hash\nglobal NUM_FIELDS_PER_SHA256: Field = 2;\nglobal ARGS_HASH_CHUNK_LENGTH: u32 = 32;\nglobal ARGS_HASH_CHUNK_COUNT: u32 = 16;\n\n// NOIR CONSTANTS - constants used only in yarn-packages/noir-contracts\n// Some are defined here because Noir doesn't yet support globals referencing other globals yet.\n// Move these constants to a noir file once the issue bellow is resolved:\n// https://github.com/noir-lang/noir/issues/1734\nglobal L1_TO_L2_MESSAGE_LENGTH: Field = 8;\nglobal L1_TO_L2_MESSAGE_ORACLE_CALL_LENGTH: Field = 26;\nglobal MAX_NOTE_FIELDS_LENGTH: Field = 20;\n// GET_NOTE_ORACLE_RETURN_LENGT = MAX_NOTE_FIELDS_LENGTH + 1 + 2\n// The plus 1 is 1 extra field for nonce.\n// + 2 for EXTRA_DATA: [number_of_return_notes, contract_address]\nglobal GET_NOTE_ORACLE_RETURN_LENGTH: Field = 23;\nglobal MAX_NOTES_PER_PAGE: Field = 10;\n// VIEW_NOTE_ORACLE_RETURN_LENGTH = MAX_NOTES_PER_PAGE * (MAX_NOTE_FIELDS_LENGTH + 1) + 2;\nglobal VIEW_NOTE_ORACLE_RETURN_LENGTH: Field = 212;\nglobal CALL_CONTEXT_LENGTH: Field = 8;\nglobal BLOCK_HEADER_LENGTH: Field = 7;\nglobal FUNCTION_DATA_LENGTH: Field = 4;\nglobal CONTRACT_DEPLOYMENT_DATA_LENGTH: Field = 6;\n// Change this ONLY if you have changed the PrivateCircuitPublicInputs structure.\n// In other words, if the structure/size of the public inputs of a function call changes then we\n// should change this constant as well as the offsets in private_call_stack_item.nr\nglobal PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH: Field = 189;\nglobal CONTRACT_STORAGE_UPDATE_REQUEST_LENGTH: Field = 3;\nglobal CONTRACT_STORAGE_READ_LENGTH: Field = 2;\n// Change this ONLY if you have changed the PublicCircuitPublicInputs structure.\nglobal PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH: Field = 190;\nglobal GET_NOTES_ORACLE_RETURN_LENGTH: Field = 674;\nglobal CALL_PRIVATE_FUNCTION_RETURN_SIZE: Field = 195;\nglobal PUBLIC_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH: Field = 87;\nglobal PRIVATE_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH: Field = 177;\nglobal COMMITMENTS_NUM_BYTES_PER_BASE_ROLLUP: Field = 2048;\nglobal NULLIFIERS_NUM_BYTES_PER_BASE_ROLLUP: Field = 2048;\nglobal PUBLIC_DATA_WRITES_NUM_BYTES_PER_BASE_ROLLUP: Field = 1024;\nglobal CONTRACTS_NUM_BYTES_PER_BASE_ROLLUP: Field = 32;\nglobal CONTRACT_DATA_NUM_BYTES_PER_BASE_ROLLUP: Field = 64;\nglobal CONTRACT_DATA_NUM_BYTES_PER_BASE_ROLLUP_UNPADDED: Field = 52;\nglobal L2_TO_L1_MSGS_NUM_BYTES_PER_BASE_ROLLUP: Field = 64;\nglobal LOGS_HASHES_NUM_BYTES_PER_BASE_ROLLUP: Field = 64;\n\n/**\n * Enumerate the hash_indices which are used for pedersen hashing.\n * We start from 1 to avoid the default generators. The generator indices are listed\n * based on the number of elements each index hashes. The following conditions must be met:\n *\n * +-----------+-------------------------------+----------------------+\n * | Hash size | Number of elements hashed (n) | Condition to use |\n * |-----------+-------------------------------+----------------------|\n * | LOW | n ≤ 8 | 0 < hash_index ≤ 32 |\n * | MID | 8 < n ≤ 16 | 32 < hash_index ≤ 40 |\n * | HIGH | 16 < n ≤ 48 | 40 < hash_index ≤ 48 |\n * +-----------+-------------------------------+----------------------+\n *\n * Note: When modifying, modify `GeneratorIndexPacker` in packer.hpp accordingly.\n */\n// Indices with size ≤ 8\nglobal GENERATOR_INDEX__COMMITMENT = 1;\nglobal GENERATOR_INDEX__COMMITMENT_NONCE = 2;\nglobal GENERATOR_INDEX__UNIQUE_COMMITMENT = 3;\nglobal GENERATOR_INDEX__SILOED_COMMITMENT = 4;\nglobal GENERATOR_INDEX__NULLIFIER = 5;\nglobal GENERATOR_INDEX__INITIALIZATION_NULLIFIER = 6;\nglobal GENERATOR_INDEX__OUTER_NULLIFIER = 7;\nglobal GENERATOR_INDEX__PUBLIC_DATA_READ = 8;\nglobal GENERATOR_INDEX__PUBLIC_DATA_UPDATE_REQUEST = 9;\nglobal GENERATOR_INDEX__FUNCTION_DATA = 10;\nglobal GENERATOR_INDEX__FUNCTION_LEAF = 11;\nglobal GENERATOR_INDEX__CONTRACT_DEPLOYMENT_DATA = 12;\nglobal GENERATOR_INDEX__CONSTRUCTOR = 13;\nglobal GENERATOR_INDEX__CONSTRUCTOR_ARGS = 14;\nglobal GENERATOR_INDEX__CONTRACT_ADDRESS = 15;\nglobal GENERATOR_INDEX__CONTRACT_LEAF = 16;\nglobal GENERATOR_INDEX__CALL_CONTEXT = 17;\nglobal GENERATOR_INDEX__CALL_STACK_ITEM = 18;\nglobal GENERATOR_INDEX__CALL_STACK_ITEM_2 = 19;\nglobal GENERATOR_INDEX__L1_TO_L2_MESSAGE_SECRET = 20;\nglobal GENERATOR_INDEX__L2_TO_L1_MSG = 21;\nglobal GENERATOR_INDEX__TX_CONTEXT = 22;\nglobal GENERATOR_INDEX__PUBLIC_LEAF_INDEX = 23;\nglobal GENERATOR_INDEX__PUBLIC_DATA_LEAF = 24;\nglobal GENERATOR_INDEX__SIGNED_TX_REQUEST = 25;\nglobal GENERATOR_INDEX__GLOBAL_VARIABLES = 26;\nglobal GENERATOR_INDEX__PARTIAL_ADDRESS = 27;\nglobal GENERATOR_INDEX__BLOCK_HASH = 28;\nglobal GENERATOR_INDEX__SIDE_EFFECT = 29;\n// Indices with size ≤ 16\nglobal GENERATOR_INDEX__TX_REQUEST = 33;\nglobal GENERATOR_INDEX__SIGNATURE_PAYLOAD = 34;\n// Indices with size ≤ 44\nglobal GENERATOR_INDEX__VK = 41;\nglobal GENERATOR_INDEX__PRIVATE_CIRCUIT_PUBLIC_INPUTS = 42;\nglobal GENERATOR_INDEX__PUBLIC_CIRCUIT_PUBLIC_INPUTS = 43;\nglobal GENERATOR_INDEX__FUNCTION_ARGS = 44;\n",
891
- "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/constants.nr"
892
- },
893
- "104": {
894
- "source": "use crate::address::{AztecAddress, EthAddress};\nuse crate::mocked::VerificationKey;\nuse crate::abis::function_selector::FunctionSelector;\nuse crate::abis::function_leaf_preimage::FunctionLeafPreimage;\nuse crate::abis::new_contract_data::NewContractData as ContractLeafPreimage;\nuse crate::abis::function_data::FunctionData;\nuse crate::abis::side_effect::{SideEffect};\nuse crate::utils::uint256::U256;\nuse crate::utils::bounded_vec::BoundedVec;\nuse crate::constants::{\n ARGS_HASH_CHUNK_COUNT,\n ARGS_HASH_CHUNK_LENGTH,\n CONTRACT_TREE_HEIGHT, \n FUNCTION_TREE_HEIGHT, \n NOTE_HASH_TREE_HEIGHT,\n NUM_FIELDS_PER_SHA256,\n GENERATOR_INDEX__SILOED_COMMITMENT,\n GENERATOR_INDEX__OUTER_NULLIFIER,\n GENERATOR_INDEX__VK,\n GENERATOR_INDEX__CONSTRUCTOR,\n GENERATOR_INDEX__PARTIAL_ADDRESS,\n GENERATOR_INDEX__CONTRACT_ADDRESS,\n GENERATOR_INDEX__COMMITMENT_NONCE,\n GENERATOR_INDEX__UNIQUE_COMMITMENT,\n GENERATOR_INDEX__FUNCTION_ARGS,\n};\n\nuse dep::std::hash::{pedersen_hash_with_separator, sha256};\n\npub fn sha256_to_field<N>(bytes_to_hash: [u8; N]) -> Field {\n let sha256_hashed = sha256(bytes_to_hash);\n\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (sha256_hashed[15 - i] as Field) * v;\n low = low + (sha256_hashed[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n let hash_in_a_field = low + high * v;\n\n hash_in_a_field\n}\n\npub fn hash_args<N>(args: [Field; N]) -> Field {\n if args.len() == 0 {\n 0\n } else {\n let mut chunks_hashes = [0; ARGS_HASH_CHUNK_COUNT];\n for i in 0..ARGS_HASH_CHUNK_COUNT {\n let mut chunk_hash = 0;\n let start_chunk_index = i * ARGS_HASH_CHUNK_LENGTH;\n if start_chunk_index < (args.len() as u32) {\n let mut chunk_args = [0; ARGS_HASH_CHUNK_LENGTH];\n for j in 0..ARGS_HASH_CHUNK_LENGTH {\n let item_index = i * ARGS_HASH_CHUNK_LENGTH + j;\n if item_index < (args.len() as u32) {\n chunk_args[j] = args[item_index];\n }\n }\n chunk_hash = pedersen_hash(chunk_args, GENERATOR_INDEX__FUNCTION_ARGS);\n }\n chunks_hashes[i] = chunk_hash;\n }\n pedersen_hash(chunks_hashes, GENERATOR_INDEX__FUNCTION_ARGS)\n }\n}\n\n// Checks that `value` is a member of a merkle tree with root `root` at position `index`\n// The witness being the `sibling_path`\npub fn assert_check_membership<N>(value: Field, index: Field, sibling_path: [Field; N], root: Field) {\n let calculated_root = root_from_sibling_path(value, index, sibling_path);\n assert(calculated_root == root, \"membership check failed\");\n}\n\n// Calculate the Merkle tree root from the sibling path and leaf.\n//\n// The leaf is hashed with its sibling, and then the result is hashed\n// with the next sibling etc in the path. The last hash is the root.\n//\n// TODO(David/Someone): The cpp code is using a uint256, whereas its\n// TODO a bit simpler in Noir to just have a bit array.\n// TODO: I'd generally like to avoid u256 for algorithms like \n// this because it means we never even need to consider cases where \n// the index is greater than p.\npub fn root_from_sibling_path<N>(leaf: Field, leaf_index: Field, sibling_path: [Field; N]) -> Field {\n let mut node = leaf;\n let indices = leaf_index.to_le_bits(N);\n\n for i in 0..N {\n let (hash_left, hash_right) = if indices[i] == 1 {\n (sibling_path[i], node)\n } else {\n (node, sibling_path[i])\n };\n node = merkle_hash(hash_left, hash_right);\n }\n node\n}\n\n// Calculate the function tree root from the sibling path and leaf preimage.\n//\n// TODO: The cpp code passes in components of the FunctionLeafPreimage and then \n// builds it up. We should build it up and then pass the leaf preimage as a parameter.\n// We can then choose to have a general method that takes in anything hashable\n// and deduplicate the logic in `contract_tree_root_from_siblings`\npub fn function_tree_root_from_siblings(\n selector: FunctionSelector,\n is_internal: bool,\n is_private: bool,\n vk_hash: Field,\n acir_hash: Field,\n function_leaf_index: Field,\n function_leaf_sibling_path: [Field; FUNCTION_TREE_HEIGHT]\n) -> Field {\n let function_leaf_preimage = FunctionLeafPreimage { selector, is_internal, is_private, vk_hash, acir_hash };\n\n let function_leaf = function_leaf_preimage.hash();\n\n let function_tree_root = root_from_sibling_path(function_leaf, function_leaf_index, function_leaf_sibling_path);\n\n function_tree_root\n}\n\n// Calculate the contract tree root from the sibling path and leaf preimage.\npub fn contract_tree_root_from_siblings(\n function_tree_root: Field,\n storage_contract_address: AztecAddress,\n portal_contract_address: EthAddress,\n contract_leaf_index: Field,\n contract_leaf_sibling_path: [Field; CONTRACT_TREE_HEIGHT]\n) -> Field {\n //TODO(Kev): if we use shorthand syntax here, we get an error as expected,\n // since variable name is `storage_contract_address` but the span is incorrect.\n let contract_leaf_preimage = ContractLeafPreimage { contract_address: storage_contract_address, portal_contract_address, function_tree_root };\n\n let contract_leaf = contract_leaf_preimage.hash();\n\n let computed_contract_tree_root = root_from_sibling_path(contract_leaf, contract_leaf_index, contract_leaf_sibling_path);\n\n computed_contract_tree_root\n}\n\npub fn read_request_root_from_siblings(\n read_request: Field,\n leaf_index: Field,\n sibling_path: [Field; NOTE_HASH_TREE_HEIGHT]\n) -> Field {\n root_from_sibling_path(read_request, leaf_index, sibling_path)\n}\n\npub fn silo_commitment(address: AztecAddress, inner_commitment: Field) -> Field {\n pedersen_hash(\n [\n address.to_field(),\n inner_commitment\n ],\n GENERATOR_INDEX__SILOED_COMMITMENT\n )\n}\n\npub fn silo_nullifier(address: AztecAddress, nullifier: Field) -> Field {\n pedersen_hash(\n [\n address.to_field(),\n nullifier\n ],\n GENERATOR_INDEX__OUTER_NULLIFIER\n )\n}\n\nfn merkle_hash(left: Field, right: Field) -> Field {\n pedersen_hash([left, right], 0)\n}\n\npub fn stdlib_recursion_verification_key_compress_native_vk(_vk: VerificationKey) -> Field {\n // Original cpp code\n // stdlib::recursion::verification_key<CT::bn254>::compress_native(private_call.vk, GeneratorIndex::VK);\n // The above cpp method is only ever called on verification key, so it has been special cased here\n let _hash_index = GENERATOR_INDEX__VK;\n 0\n}\n\n// TODO CPP uses blake2s for this\npub fn compute_new_contract_address_hash(new_contract_address: AztecAddress) -> Field {\n dep::std::hash::pedersen_hash([new_contract_address.to_field()])\n}\n\npub fn compute_l2_to_l1_hash(\n contract_address: AztecAddress,\n rollup_version_id: Field,\n portal_contract_address: EthAddress,\n chain_id: Field,\n content: Field\n) -> Field {\n let mut bytes: BoundedVec<u8, 160> = BoundedVec::new(0);\n\n let inputs = [\n contract_address.to_field(), rollup_version_id, portal_contract_address.to_field(), chain_id, content\n ];\n for i in 0..inputs.len() {\n // TODO are bytes be in fr.to_buffer() ?\n let item_bytes = inputs[i].to_be_bytes(32);\n for j in 0..32 {\n bytes.push(item_bytes[j]);\n }\n }\n\n sha256_to_field(bytes.storage)\n}\n\npub fn compute_constructor_hash(\n function_data: FunctionData,\n args_hash: Field,\n constructor_vk_hash: Field\n) -> Field {\n let function_data_hash = function_data.hash();\n\n pedersen_hash(\n [\n function_data_hash,\n args_hash,\n constructor_vk_hash\n ],\n GENERATOR_INDEX__CONSTRUCTOR\n )\n}\n\n// Computes sha256 hash of 2 input hashes stored in 4 fields.\n// \n// This method is bn254 specific. Two fields is needed in order to \n// encode the sha256 output. It can be abstracted away with any 4-2 hash function.\n//\n// TODO(Jan and David): This is used for the encrypted_log hashes.\n// Can we check to see if we can just use hash_to_field or pedersen_compress here?\n//\n// Returning a Field would be desirable because then this can be replaced with \n// poseidon without changing the rest of the code\n//\npub fn accumulate_sha256(input: [U128; 4]) -> [Field; NUM_FIELDS_PER_SHA256] {\n // This is a note about the cpp code, since it takes an array of Fields\n // instead of a U128.\n // 4 Field elements when converted to bytes will usually \n // occupy 4 * 32 = 128 bytes.\n // However, this function is making the assumption that each Field \n // only occupies 128 bits.\n //\n // TODO(David): This does not seem to be getting guaranteed anywhere in the code?\n //\n // Concatenate 4 u128 bit integers into a byte array.\n let mut hash_input_flattened = [0; 64];\n for offset in 0..4 {\n let input_as_bytes = input[offset].to_be_bytes();\n for byte_index in 0..16 {\n hash_input_flattened[offset * 16 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n let sha_digest = dep::std::hash::sha256(hash_input_flattened);\n\n U256::from_bytes32(sha_digest).to_u128_limbs()\n}\n\npub fn compute_logs_hash(\n previous_log_hash: [Field; 2],\n current_log_hash: [Field; 2]\n) -> [Field; NUM_FIELDS_PER_SHA256] {\n accumulate_sha256(\n [\n U128::from_integer(previous_log_hash[0]),\n U128::from_integer(previous_log_hash[1]),\n U128::from_integer(current_log_hash[0]),\n U128::from_integer(current_log_hash[1])\n ]\n )\n}\n\npub fn compute_commitment_nonce(first_nullifier: Field, commitment_index: Field) -> Field {\n pedersen_hash(\n [\n first_nullifier,\n commitment_index\n ],\n GENERATOR_INDEX__COMMITMENT_NONCE\n )\n}\n\npub fn compute_unique_siloed_commitment(nonce: Field, siloed_commitment: Field) -> Field {\n pedersen_hash(\n [\n nonce,\n siloed_commitment\n ],\n GENERATOR_INDEX__UNIQUE_COMMITMENT\n )\n}\n\npub fn compute_unique_siloed_commitments<N>(\n first_nullifier: Field,\n siloed_commitments: [SideEffect; N]\n) -> [SideEffect; N] {\n let mut unique_siloed_commitments = [SideEffect::empty(); N];\n for i in 0..N {\n let siloed_commitment = siloed_commitments[i];\n if siloed_commitment.value != 0 {\n let nonce = compute_commitment_nonce(first_nullifier, i);\n unique_siloed_commitments[i] = SideEffect {\n value: compute_unique_siloed_commitment(nonce, siloed_commitment.value),\n counter: siloed_commitment.counter\n };\n }\n }\n unique_siloed_commitments\n}\n\npub fn pedersen_hash<N>(inputs: [Field; N], hash_index: u32) -> Field {\n dep::std::hash::pedersen_hash_with_separator(inputs, hash_index)\n}\n",
895
- "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/hash.nr"
896
- },
897
- "120": {
898
- "source": "use crate::{\n constants::{\n GENERATOR_INDEX__CONTRACT_ADDRESS,\n GENERATOR_INDEX__PARTIAL_ADDRESS,\n },\n hash::pedersen_hash,\n utils,\n grumpkin_point::GrumpkinPoint,\n};\nuse dep::std::cmp::Eq;\nuse crate::traits::{Empty, ToField};\n\n// Aztec address\nstruct AztecAddress {\n inner : Field\n}\n\nimpl Eq for AztecAddress {\n fn eq(self, other : Self) -> bool {\n self.to_field() == other.to_field()\n }\n}\n\nimpl Empty for AztecAddress {\n fn empty() -> Self {\n Self {\n inner : 0\n }\n }\n}\n\nimpl ToField for AztecAddress {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl AztecAddress {\n pub fn zero() -> Self {\n Self {\n inner: 0\n }\n }\n\n pub fn from_field(field : Field) -> Self {\n Self {\n inner : field\n }\n }\n\n pub fn compute(pub_key: GrumpkinPoint, partial_address: PartialAddress) -> AztecAddress {\n AztecAddress::from_field(\n pedersen_hash(\n [pub_key.x, pub_key.y, partial_address.to_field()],\n GENERATOR_INDEX__CONTRACT_ADDRESS\n )\n )\n }\n\n pub fn is_zero(self) -> bool {\n self.inner == 0\n }\n \n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n\n pub fn conditional_assign(predicate: bool, lhs : Self, rhs : Self) -> Self{\n let result = utils::conditional_assign(predicate, rhs.to_field(), lhs.to_field());\n Self {\n inner : result\n }\n }\n\n pub fn serialize(self: Self) -> [Field; 1] {\n [self.inner]\n }\n\n pub fn deserialize(fields: [Field; 1]) -> Self {\n Self {\n inner: fields[0]\n }\n }\n}\n\nstruct EthAddress{\n inner : Field\n}\n\nimpl Eq for EthAddress {\n fn eq(self, other : Self) -> bool {\n self.to_field() == other.to_field()\n }\n}\n\nimpl Empty for EthAddress {\n fn empty() -> Self {\n Self {\n inner : 0\n }\n }\n}\n\nimpl ToField for EthAddress {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl EthAddress{\n pub fn zero() -> Self {\n Self {\n inner: 0\n }\n }\n\n pub fn from_field(field : Field) -> Self {\n Self {\n inner : field\n }\n }\n\n pub fn is_zero(self) -> bool {\n self.inner == 0\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n\n pub fn conditional_assign(predicate: bool, lhs : Self, rhs : Self) -> Self{\n let result = utils::conditional_assign(predicate, rhs.to_field(), lhs.to_field());\n Self {\n inner : result\n }\n }\n\n pub fn serialize(self: Self) -> [Field; 1] {\n [self.inner]\n }\n\n pub fn deserialize(fields: [Field; 1]) -> Self {\n Self {\n inner: fields[0]\n }\n }\n}\n\n// Partial address\nstruct PartialAddress {\n inner : Field\n}\n\nimpl ToField for PartialAddress {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl PartialAddress {\n pub fn from_field(field : Field) -> Self {\n Self {\n inner : field\n }\n }\n\n pub fn compute(contract_address_salt : Field, function_tree_root : Field, constructor_hash : Field) -> Self {\n PartialAddress::from_field(\n pedersen_hash([\n // TODO why the zeroes?\n 0,\n 0,\n contract_address_salt,\n function_tree_root,\n constructor_hash\n ], GENERATOR_INDEX__PARTIAL_ADDRESS)\n )\n }\n\n pub fn to_field(self) -> Field {\n self.inner\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n}\n",
899
- "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/address.nr"
900
- },
901
- "125": {
902
- "source": "use crate::address::EthAddress;\nuse crate::constants::{\n CONTRACT_DEPLOYMENT_DATA_LENGTH,\n GENERATOR_INDEX__CONTRACT_DEPLOYMENT_DATA,\n};\nuse crate::hash::pedersen_hash;\nuse crate::grumpkin_point::GrumpkinPoint;\nuse crate::traits::Hash;\n\n// docs:start:contract-deployment-data\nstruct ContractDeploymentData {\n deployer_public_key : GrumpkinPoint,\n constructor_vk_hash : Field,\n function_tree_root : Field,\n contract_address_salt : Field,\n portal_contract_address : EthAddress,\n}\n// docs:end:contract-deployment-data\n\nimpl Hash for ContractDeploymentData {\n fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__CONTRACT_DEPLOYMENT_DATA)\n }\n}\n\nimpl ContractDeploymentData {\n fn serialize(self) -> [Field; CONTRACT_DEPLOYMENT_DATA_LENGTH] {\n [\n self.deployer_public_key.x,\n self.deployer_public_key.y,\n self.constructor_vk_hash,\n self.function_tree_root,\n self.contract_address_salt,\n self.portal_contract_address.to_field(),\n ]\n }\n\n fn assert_is_zero(self) {\n self.deployer_public_key.assert_is_zero();\n assert(self.constructor_vk_hash == 0);\n assert(self.function_tree_root == 0);\n assert(self.contract_address_salt == 0);\n self.portal_contract_address.assert_is_zero();\n }\n\n}\n",
903
- "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/contrakt/deployment_data.nr"
904
- },
905
- "126": {
906
- "source": "use crate::{\n constants::{\n CONTRACT_STORAGE_UPDATE_REQUEST_LENGTH,\n GENERATOR_INDEX__PUBLIC_DATA_UPDATE_REQUEST,\n },\n hash::pedersen_hash,\n};\nuse dep::std::cmp::Eq;\nuse crate::traits::{Hash, Empty};\n\nstruct StorageUpdateRequest{\n storage_slot : Field,\n old_value : Field,\n new_value : Field,\n}\n\nimpl Eq for StorageUpdateRequest {\n fn eq(self, request: Self) -> bool {\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/3595)\n (request.storage_slot == self.storage_slot)\n & (request.old_value == self.old_value)\n & (request.new_value == self.new_value)\n }\n}\n\nimpl Empty for StorageUpdateRequest {\n fn empty() -> Self {\n StorageUpdateRequest {\n storage_slot: 0,\n old_value: 0,\n new_value: 0,\n }\n }\n}\n\nimpl Hash for StorageUpdateRequest {\n fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__PUBLIC_DATA_UPDATE_REQUEST)\n }\n}\n\nimpl StorageUpdateRequest {\n pub fn serialize(self) -> [Field; CONTRACT_STORAGE_UPDATE_REQUEST_LENGTH] {\n [self.storage_slot, self.old_value, self.new_value]\n }\n\n pub fn is_empty(self) -> bool {\n self.storage_slot == 0\n }\n}\n",
907
- "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/contrakt/storage_update_request.nr"
908
- },
909
- "127": {
910
- "source": "use crate::{\n constants::{\n CONTRACT_STORAGE_READ_LENGTH,\n GENERATOR_INDEX__PUBLIC_DATA_READ,\n },\n hash::pedersen_hash,\n};\nuse crate::traits::Empty;\n\nstruct StorageRead {\n storage_slot: Field,\n current_value: Field,\n}\n\nimpl Empty for StorageRead { \n fn empty() -> Self {\n Self {\n storage_slot: 0,\n current_value: 0,\n }\n }\n}\n\nimpl StorageRead {\n\n pub fn serialize(self) -> [Field; CONTRACT_STORAGE_READ_LENGTH] {\n [self.storage_slot, self.current_value]\n }\n\n pub fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__PUBLIC_DATA_READ)\n }\n\n pub fn is_empty(self) -> bool {\n self.storage_slot == 0\n }\n}\n",
911
- "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/contrakt/storage_read.nr"
912
- },
913
- "135": {
914
- "source": "use crate::abis::{\n function_data::FunctionData,\n private_circuit_public_inputs::PrivateCircuitPublicInputs,\n public_circuit_public_inputs::PublicCircuitPublicInputs,\n};\nuse crate::address::AztecAddress;\nuse crate::constants::{\n GENERATOR_INDEX__CALL_STACK_ITEM,\n};\nuse crate::traits::Hash;\n\nstruct PrivateCallStackItem {\n // This is the _actual_ contract address relating to where this function's code resides in the\n // contract tree. Regardless of whether this is a call or delegatecall, this\n // `contract_address` _does not change_. Amongst other things, it's used as a lookup for\n // getting the correct code from the tree. There is a separate `storage_contract_address`\n // within a CallStackItem which varies depending on whether this is a call or delegatecall.\n contract_address: AztecAddress,\n public_inputs: PrivateCircuitPublicInputs,\n function_data: FunctionData,\n // Not really needed for PrivateCallStackItem.\n is_execution_request: bool,\n}\n\nimpl Hash for PrivateCallStackItem {\n fn hash(self) -> Field {\n dep::std::hash::pedersen_hash_with_separator([\n self.contract_address.to_field(),\n self.function_data.hash(),\n self.public_inputs.hash(),\n ], GENERATOR_INDEX__CALL_STACK_ITEM)\n }\n}\n\nstruct PublicCallStackItem {\n contract_address: AztecAddress,\n public_inputs: PublicCircuitPublicInputs,\n function_data: FunctionData,\n // True if this call stack item represents a request to execute a function rather than a\n // fulfilled execution. Used when enqueuing calls from private to public functions.\n is_execution_request: bool,\n}\n\nimpl Hash for PublicCallStackItem {\n fn hash(self) -> Field {\n let item = if self.is_execution_request {\n self.as_execution_request()\n } else {\n self\n };\n\n dep::std::hash::pedersen_hash_with_separator([\n item.contract_address.to_field(),\n item.function_data.hash(),\n item.public_inputs.hash(),\n ], GENERATOR_INDEX__CALL_STACK_ITEM)\n }\n}\n\nimpl PublicCallStackItem {\n fn as_execution_request(self) -> Self {\n let public_inputs = self.public_inputs;\n let mut request_public_inputs: PublicCircuitPublicInputs = dep::std::unsafe::zeroed();\n request_public_inputs.call_context = public_inputs.call_context;\n request_public_inputs.args_hash = public_inputs.args_hash;\n\n let call_stack_item = PublicCallStackItem {\n contract_address: self.contract_address,\n function_data: self.function_data,\n is_execution_request: true,\n public_inputs: request_public_inputs,\n };\n call_stack_item\n }\n}\n",
915
- "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/call_stack_item.nr"
916
- },
917
- "140": {
918
- "source": "use crate::constants::{GENERATOR_INDEX__SIDE_EFFECT};\nuse dep::std::cmp::Eq;\nuse crate::traits::{Empty, Hash};\n\ntrait Ordered {\n fn counter(self) -> u32;\n}\n\nstruct SideEffect{\n value: Field,\n counter: u32,\n}\n\nimpl Ordered for SideEffect {\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl Eq for SideEffect {\n fn eq(self, side_effect: SideEffect) -> bool {\n (self.value == side_effect.value)\n & (self.counter == side_effect.counter)\n }\n}\n\nimpl Empty for SideEffect {\n fn empty() -> Self {\n SideEffect {\n value: 0,\n counter: 0,\n }\n }\n}\n\nimpl Hash for SideEffect {\n fn hash(self) -> Field {\n dep::std::hash::pedersen_hash_with_separator(\n self.serialize() , GENERATOR_INDEX__SIDE_EFFECT)\n }\n}\n\nimpl SideEffect {\n pub fn serialize(self) -> [Field; 2] {\n [self.value, self.counter as Field]\n }\n\n pub fn deserialise(values: [Field; 2]) -> Self {\n Self {\n value: values[0],\n counter: values[1] as u32,\n }\n }\n\n pub fn is_empty(self) -> bool {\n (self.value == 0)\n & (self.counter == 0)\n }\n}\n\nstruct SideEffectLinkedToNoteHash{\n value: Field,\n note_hash: Field,\n counter: u32,\n}\n\nimpl Ordered for SideEffectLinkedToNoteHash {\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl Eq for SideEffectLinkedToNoteHash {\n fn eq(self, side_effect: SideEffectLinkedToNoteHash) -> bool {\n (self.value == side_effect.value)\n & (self.note_hash == side_effect.note_hash) \n & (self.counter == side_effect.counter)\n }\n}\n\nimpl Empty for SideEffectLinkedToNoteHash {\n fn empty() -> Self {\n SideEffectLinkedToNoteHash {\n value: 0,\n note_hash: 0,\n counter: 0,\n }\n }\n}\n\nimpl Hash for SideEffectLinkedToNoteHash {\n fn hash(self) -> Field {\n dep::std::hash::pedersen_hash_with_separator(\n self.serialize(),\n GENERATOR_INDEX__SIDE_EFFECT)\n }\n}\n\nimpl SideEffectLinkedToNoteHash{\n pub fn serialize(self) -> [Field; 3] {\n [self.value, self.note_hash, self.counter as Field]\n }\n\n pub fn deserialise(values: [Field; 3]) -> Self {\n Self {\n value: values[0],\n note_hash: values[1],\n counter: values[2] as u32,\n }\n }\n\n pub fn is_empty(self) -> bool {\n (self.value == 0)\n & (self.note_hash == 0)\n & (self.counter == 0)\n }\n}\n\n",
919
- "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/side_effect.nr"
920
- },
921
- "143": {
922
- "source": "use crate::constants::{\n MAX_NEW_L2_TO_L1_MSGS_PER_CALL,\n MAX_NEW_NULLIFIERS_PER_CALL,\n MAX_NEW_COMMITMENTS_PER_CALL,\n MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL,\n MAX_PUBLIC_DATA_READS_PER_CALL,\n MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL,\n NUM_FIELDS_PER_SHA256,\n RETURN_VALUES_LENGTH,\n GENERATOR_INDEX__PUBLIC_CIRCUIT_PUBLIC_INPUTS,\n PUBLIC_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH,\n PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH,\n};\nuse crate::{\n abis::{\n call_context::CallContext,\n side_effect::{SideEffect, SideEffectLinkedToNoteHash},\n block_header::BlockHeader,\n },\n address::AztecAddress,\n contrakt::{\n storage_read::StorageRead,\n storage_update_request::StorageUpdateRequest,\n },\n utils::bounded_vec::BoundedVec,\n};\n\nstruct PublicCircuitPublicInputs{\n call_context: CallContext,\n\n args_hash: Field,\n return_values: [Field; RETURN_VALUES_LENGTH],\n\n contract_storage_update_requests: [StorageUpdateRequest; MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL],\n contract_storage_reads: [StorageRead; MAX_PUBLIC_DATA_READS_PER_CALL],\n\n // todo: add sideeffect ranges for the input to these hashes\n public_call_stack_hashes: [Field; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL],\n new_commitments: [SideEffect; MAX_NEW_COMMITMENTS_PER_CALL],\n new_nullifiers: [SideEffectLinkedToNoteHash; MAX_NEW_NULLIFIERS_PER_CALL],\n new_l2_to_l1_msgs: [Field; MAX_NEW_L2_TO_L1_MSGS_PER_CALL],\n\n unencrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n\n // Here so that the gas cost of this request can be measured by circuits, without actually needing to feed in the\n // variable-length data.\n unencrypted_log_preimages_length: Field,\n\n block_header: BlockHeader,\n\n prover_address: AztecAddress,\n}\n\nimpl PublicCircuitPublicInputs{\n fn hash(self) -> Field { \n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/3595) have mercy por favor \n let mut inputs: BoundedVec<Field, PUBLIC_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH> = BoundedVec::new(0);\n inputs.push(self.call_context.hash());\n inputs.push(self.args_hash);\n inputs.push_array(self.return_values);\n for i in 0..MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL {\n inputs.push(self.contract_storage_update_requests[i].hash());\n }\n for i in 0..MAX_PUBLIC_DATA_READS_PER_CALL {\n inputs.push(self.contract_storage_reads[i].hash());\n }\n inputs.push_array(self.public_call_stack_hashes);\n\n for i in 0..MAX_NEW_COMMITMENTS_PER_CALL{\n inputs.push(self.new_commitments[i].hash());\n }\n for i in 0..MAX_NEW_NULLIFIERS_PER_CALL{\n inputs.push(self.new_nullifiers[i].hash());\n }\n inputs.push_array(self.new_l2_to_l1_msgs);\n inputs.push_array(self.unencrypted_logs_hash);\n inputs.push(self.unencrypted_log_preimages_length);\n inputs.push_array(self.block_header.serialize());\n inputs.push(self.prover_address.to_field());\n\n assert_eq(inputs.len(), PUBLIC_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH, \"Incorrect number of input fields when hashing PublicCircuitPublicInputs\");\n\n dep::std::hash::pedersen_hash_with_separator(inputs.storage, GENERATOR_INDEX__PUBLIC_CIRCUIT_PUBLIC_INPUTS)\n }\n\n pub fn serialize(self) -> [Field; PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH] {\n let mut fields: BoundedVec<Field, PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH> = BoundedVec::new(0); \n fields.push_array(self.call_context.serialize()); \n fields.push(self.args_hash);\n fields.push_array(self.return_values);\n for i in 0..MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL {\n fields.push_array(self.contract_storage_update_requests[i].serialize());\n }\n for i in 0..MAX_PUBLIC_DATA_READS_PER_CALL {\n fields.push_array(self.contract_storage_reads[i].serialize());\n }\n fields.push_array(self.public_call_stack_hashes);\n\n for i in 0..MAX_NEW_COMMITMENTS_PER_CALL{\n fields.push_array(self.new_commitments[i].serialize());\n }\n for i in 0..MAX_NEW_NULLIFIERS_PER_CALL{\n fields.push_array(self.new_nullifiers[i].serialize());\n }\n fields.push_array(self.new_l2_to_l1_msgs);\n fields.push_array(self.unencrypted_logs_hash);\n fields.push(self.unencrypted_log_preimages_length);\n fields.push_array(self.block_header.serialize());\n fields.push(self.prover_address.to_field());\n fields.storage\n }\n}\n",
923
- "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/public_circuit_public_inputs.nr"
924
- },
925
- "145": {
926
- "source": "use crate::{\n abis::{\n call_context::CallContext,\n block_header::BlockHeader,\n side_effect::{SideEffect, SideEffectLinkedToNoteHash},\n },\n contrakt::deployment_data::ContractDeploymentData,\n hash::{\n pedersen_hash,\n },\n utils::bounded_vec::BoundedVec,\n};\nuse crate::constants::{\n MAX_READ_REQUESTS_PER_CALL,\n MAX_NEW_COMMITMENTS_PER_CALL,\n MAX_NEW_NULLIFIERS_PER_CALL,\n MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL,\n MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL,\n MAX_NEW_L2_TO_L1_MSGS_PER_CALL,\n NUM_FIELDS_PER_SHA256,\n RETURN_VALUES_LENGTH,\n PRIVATE_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH,\n PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH,\n GENERATOR_INDEX__PRIVATE_CIRCUIT_PUBLIC_INPUTS,\n};\nuse crate::traits::Hash;\n\nstruct PrivateCircuitPublicInputs {\n call_context: CallContext,\n \n args_hash: Field,\n return_values: [Field; RETURN_VALUES_LENGTH],\n\n read_requests: [SideEffect; MAX_READ_REQUESTS_PER_CALL],\n\n new_commitments: [SideEffect; MAX_NEW_COMMITMENTS_PER_CALL],\n new_nullifiers: [SideEffectLinkedToNoteHash; MAX_NEW_NULLIFIERS_PER_CALL],\n private_call_stack_hashes: [Field; MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL],\n public_call_stack_hashes: [Field; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL],\n new_l2_to_l1_msgs: [Field; MAX_NEW_L2_TO_L1_MSGS_PER_CALL],\n end_side_effect_counter : u32,\n\n encrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n unencrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n\n // Here so that the gas cost of this request can be measured by circuits, without actually needing to feed in the\n // variable-length data.\n encrypted_log_preimages_length: Field,\n unencrypted_log_preimages_length: Field,\n\n block_header: BlockHeader,\n\n contract_deployment_data: ContractDeploymentData,\n\n chain_id: Field,\n version: Field,\n}\n\nimpl Hash for PrivateCircuitPublicInputs {\n fn hash(self) -> Field {\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/3595)\n let mut fields: BoundedVec<Field, PRIVATE_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH> = BoundedVec::new(0); \n fields.push(self.call_context.hash());\n fields.push(self.args_hash);\n fields.push_array(self.return_values);\n\n for i in 0..MAX_READ_REQUESTS_PER_CALL{\n fields.push_array(self.read_requests[i].serialize());\n }\n for i in 0..MAX_NEW_COMMITMENTS_PER_CALL{\n fields.push_array(self.new_commitments[i].serialize());\n }\n for i in 0..MAX_NEW_NULLIFIERS_PER_CALL{\n fields.push_array(self.new_nullifiers[i].serialize());\n }\n fields.push_array(self.private_call_stack_hashes);\n fields.push_array(self.public_call_stack_hashes);\n fields.push_array(self.new_l2_to_l1_msgs);\n fields.push(self.end_side_effect_counter as Field);\n fields.push_array(self.encrypted_logs_hash);\n fields.push_array(self.unencrypted_logs_hash);\n fields.push(self.encrypted_log_preimages_length);\n fields.push(self.unencrypted_log_preimages_length);\n fields.push_array(self.block_header.serialize());\n fields.push(self.contract_deployment_data.hash());\n fields.push(self.chain_id);\n fields.push(self.version);\n\n assert_eq(fields.len(), PRIVATE_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH, \"Incorrect number of input fields when hashing PrivateCircuitPublicInputs\");\n\n pedersen_hash(fields.storage, GENERATOR_INDEX__PRIVATE_CIRCUIT_PUBLIC_INPUTS)\n }\n}\n\nimpl PrivateCircuitPublicInputs {\n fn serialize(self) -> [Field; PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH] {\n let mut fields: BoundedVec<Field, PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH> = BoundedVec::new(0); \n fields.push_array(self.call_context.serialize());\n fields.push(self.args_hash);\n fields.push_array(self.return_values);\n\n for i in 0..MAX_READ_REQUESTS_PER_CALL{\n fields.push_array(self.read_requests[i].serialize());\n }\n for i in 0..MAX_NEW_COMMITMENTS_PER_CALL{\n fields.push_array(self.new_commitments[i].serialize());\n }\n for i in 0..MAX_NEW_NULLIFIERS_PER_CALL{\n fields.push_array(self.new_nullifiers[i].serialize());\n }\n fields.push_array(self.private_call_stack_hashes);\n fields.push_array(self.public_call_stack_hashes);\n fields.push_array(self.new_l2_to_l1_msgs);\n fields.push(self.end_side_effect_counter as Field);\n fields.push_array(self.encrypted_logs_hash);\n fields.push_array(self.unencrypted_logs_hash);\n fields.push(self.encrypted_log_preimages_length);\n fields.push(self.unencrypted_log_preimages_length);\n fields.push_array(self.block_header.serialize());\n fields.push_array(self.contract_deployment_data.serialize());\n fields.push(self.chain_id);\n fields.push(self.version);\n\n assert_eq(fields.len(), PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH);\n\n fields.storage\n }\n}\n\n#[test]\nfn serialization_smoke() {\n let pcpi: PrivateCircuitPublicInputs = dep::std::unsafe::zeroed();\n let _serialized = pcpi.serialize();\n}\n\n#[test]\nfn hash_smoke() {\n let pcpi: PrivateCircuitPublicInputs = dep::std::unsafe::zeroed();\n let _hashed = pcpi.hash();\n}\n",
927
- "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/private_circuit_public_inputs.nr"
928
- },
929
- "148": {
930
- "source": "use crate::abis::function_selector::FunctionSelector;\nuse crate::constants::GENERATOR_INDEX__FUNCTION_DATA;\n\nstruct FunctionData {\n // First four bytes of the abi encoding \n // of a function. \n selector : FunctionSelector,\n is_internal : bool,\n is_private : bool,\n is_constructor : bool,\n}\n\nimpl FunctionData {\n // A field is ~256 bits\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/3057): Since, function data can fit into a Field,\n // This method will simply return a bit packed Field instead of hashing\n fn hash(self) -> Field {\n dep::std::hash::pedersen_hash_with_separator([\n self.selector.to_field(),\n self.is_internal as Field,\n self.is_private as Field,\n self.is_constructor as Field,\n ], GENERATOR_INDEX__FUNCTION_DATA)\n }\n}\n",
931
- "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/function_data.nr"
932
- },
933
- "153": {
934
- "source": "use crate::{\n abis::function_selector::FunctionSelector,\n address::{EthAddress,AztecAddress},\n constants::{\n CALL_CONTEXT_LENGTH,\n GENERATOR_INDEX__CALL_CONTEXT,\n },\n hash::pedersen_hash,\n};\nuse dep::std::cmp::Eq;\nuse crate::traits::Hash;\n\n// docs:start:call-context\nstruct CallContext {\n msg_sender : AztecAddress,\n storage_contract_address : AztecAddress,\n portal_contract_address : EthAddress,\n\n function_selector : FunctionSelector,\n\n is_delegate_call : bool,\n is_static_call : bool,\n is_contract_deployment : bool,\n\n start_side_effect_counter : u32,\n}\n// docs:end:call-context\n\nimpl Eq for CallContext {\n fn eq(self, call_context: CallContext) -> bool {\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/3595)\n call_context.msg_sender.eq(self.msg_sender)\n & call_context.storage_contract_address.eq(self.storage_contract_address)\n & call_context.portal_contract_address.eq(self.portal_contract_address)\n & call_context.function_selector.eq(self.function_selector)\n & (call_context.is_delegate_call == self.is_delegate_call)\n & (call_context.is_static_call == self.is_static_call)\n & (call_context.is_contract_deployment == self.is_contract_deployment)\n & (call_context.start_side_effect_counter == self.start_side_effect_counter)\n }\n}\n\nimpl Hash for CallContext {\n fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__CALL_CONTEXT)\n }\n}\n\nimpl CallContext {\n fn serialize(self) -> [Field; CALL_CONTEXT_LENGTH] {\n [\n self.msg_sender.to_field(),\n self.storage_contract_address.to_field(),\n self.portal_contract_address.to_field(),\n self.function_selector.to_field(),\n self.is_delegate_call as Field,\n self.is_static_call as Field,\n self.is_contract_deployment as Field,\n self.start_side_effect_counter as Field,\n ]\n }\n\n fn assert_is_zero(self) {\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/3595)\n assert(self.msg_sender.to_field() == 0);\n assert(self.storage_contract_address.to_field() == 0);\n assert(self.portal_contract_address.to_field() == 0);\n assert(self.function_selector.to_field() == 0);\n assert(self.is_delegate_call == false);\n assert(self.is_static_call == false);\n assert(self.is_contract_deployment == false);\n assert(self.start_side_effect_counter == 0);\n }\n}\n",
935
- "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/call_context.nr"
936
- },
937
- "159": {
938
- "source": "use crate::utils::field::field_from_bytes;\nuse dep::std::cmp::Eq;\n\nglobal SELECTOR_SIZE = 4;\n\nstruct FunctionSelector {\n // 1st 4-bytes of abi-encoding of function.\n inner: u32,\n}\n\nimpl Eq for FunctionSelector {\n fn eq(self, function_selector: FunctionSelector) -> bool {\n function_selector.inner == self.inner\n }\n}\n\nimpl FunctionSelector {\n fn to_field(self) -> Field {\n self.inner as Field\n }\n\n pub fn from_u32(value: u32) -> Self {\n Self {\n inner : value,\n }\n }\n\n pub fn from_field(value : Field) -> Self {\n Self {\n inner : value as u32,\n }\n }\n\n pub fn from_signature<N>(signature: str<N>) -> Self {\n let bytes = signature.as_bytes();\n let hash = dep::std::hash::keccak256(bytes, bytes.len() as u32);\n\n let mut selector_be_bytes = [0; SELECTOR_SIZE];\n for i in 0..SELECTOR_SIZE {\n selector_be_bytes[i] = hash[i];\n }\n\n FunctionSelector::from_field(field_from_bytes(selector_be_bytes, true))\n }\n\n pub fn zero() -> Self {\n Self { inner: 0 }\n }\n\n pub fn serialize(self: Self) -> [Field; 1] {\n [self.inner as Field]\n }\n\n pub fn deserialize(fields: [Field; 1]) -> Self {\n Self {\n inner: fields[0] as u32\n }\n }\n}\n",
939
- "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/function_selector.nr"
940
- },
941
- "187": {
942
- "source": "use dep::aztec::abi;\nuse dep::aztec::types::vec::BoundedVec;\nuse dep::aztec::context::PrivateContext;\nuse dep::aztec::protocol_types::{\n abis::{\n call_stack_item::{\n PrivateCallStackItem,\n PublicCallStackItem,\n },\n function_selector::FunctionSelector,\n },\n address::AztecAddress,\n constants::GENERATOR_INDEX__SIGNATURE_PAYLOAD,\n hash::pedersen_hash,\n};\n\nglobal ACCOUNT_MAX_CALLS: Field = 4;\n// 1 (ARGS_HASH) + 1 (FUNCTION_SELECTOR) + 1 (TARGET_ADDRESS) + 1 (IS_PUBLIC)\nglobal FUNCTION_CALL_SIZE: Field = 4;\n// 3 * 32 + 1\nglobal FUNCTION_CALL_SIZE_IN_BYTES: Field = 97;\n\nstruct FunctionCall {\n args_hash: Field,\n function_selector: FunctionSelector,\n target_address: AztecAddress,\n is_public: bool,\n}\n\nimpl FunctionCall {\n fn serialize(self) -> [Field; FUNCTION_CALL_SIZE] {\n [self.args_hash, self.function_selector.to_field(), self.target_address.to_field(), self.is_public as Field]\n }\n\n fn to_be_bytes(self) -> [u8; FUNCTION_CALL_SIZE_IN_BYTES] {\n let mut bytes: [u8; FUNCTION_CALL_SIZE_IN_BYTES] = [0; FUNCTION_CALL_SIZE_IN_BYTES];\n let args_hash_bytes = self.args_hash.to_be_bytes(32);\n for i in 0..32 { bytes[i] = args_hash_bytes[i]; }\n let function_selector_bytes = self.function_selector.to_field().to_be_bytes(32);\n for i in 0..32 { bytes[i + 32] = function_selector_bytes[i]; }\n let target_address_bytes = self.target_address.to_field().to_be_bytes(32);\n for i in 0..32 { bytes[i + 64] = target_address_bytes[i]; }\n bytes[96] = self.is_public as u8;\n bytes\n }\n}\n\n// FUNCTION_CALL_SIZE * ACCOUNT_MAX_CALLS + 1\nglobal ENTRYPOINT_PAYLOAD_SIZE: Field = 17;\n// FUNCTION_CALL_SIZE_IN_BYTES * ACCOUNT_MAX_CALLS + 32\nglobal ENTRYPOINT_PAYLOAD_SIZE_IN_BYTES: Field = 420;\n\n// Note: If you change the following struct you have to update default_entrypoint.ts\n// docs:start:entrypoint-struct\nstruct EntrypointPayload {\n function_calls: [FunctionCall; ACCOUNT_MAX_CALLS],\n nonce: Field,\n}\n// docs:end:entrypoint-struct\n\nimpl EntrypointPayload {\n fn hash(self) -> Field {\n pedersen_hash(\n self.serialize(), \n GENERATOR_INDEX__SIGNATURE_PAYLOAD\n )\n }\n\n // Serializes the entrypoint struct\n fn serialize(self) -> [Field; ENTRYPOINT_PAYLOAD_SIZE] {\n let mut fields: BoundedVec<Field, ENTRYPOINT_PAYLOAD_SIZE> = BoundedVec::new(0); \n for call in self.function_calls {\n fields.push_array(call.serialize());\n }\n fields.push(self.nonce);\n fields.storage\n }\n\n // Serializes the payload as an array of bytes. Useful for hashing with sha256.\n fn to_be_bytes(self) -> [u8; ENTRYPOINT_PAYLOAD_SIZE_IN_BYTES] {\n let mut bytes: [u8; ENTRYPOINT_PAYLOAD_SIZE_IN_BYTES] = [0; ENTRYPOINT_PAYLOAD_SIZE_IN_BYTES];\n\n for i in 0..ACCOUNT_MAX_CALLS {\n let item_bytes = self.function_calls[i].to_be_bytes();\n for j in 0..FUNCTION_CALL_SIZE_IN_BYTES { \n bytes[i * FUNCTION_CALL_SIZE_IN_BYTES + j] = item_bytes[j];\n }\n }\n\n let nonce_bytes = self.nonce.to_be_bytes(32);\n let nonce_offset = FUNCTION_CALL_SIZE_IN_BYTES * ACCOUNT_MAX_CALLS;\n for j in 0..32 {\n bytes[nonce_offset + j] = nonce_bytes[j];\n }\n \n bytes\n }\n\n // Executes all private and public calls \n // docs:start:entrypoint-execute-calls\n fn execute_calls(self, context: &mut PrivateContext) {\n for call in self.function_calls {\n if !call.target_address.is_zero() {\n if call.is_public {\n context.call_public_function_with_packed_args(\n call.target_address, call.function_selector, call.args_hash\n );\n } else {\n let _result = context.call_private_function_with_packed_args(\n call.target_address, call.function_selector, call.args_hash\n );\n }\n }\n }\n }\n // docs:end:entrypoint-execute-calls\n}\n",
943
- "path": "/usr/src/yarn-project/aztec-nr/authwit/src/entrypoint.nr"
944
- },
945
- "188": {
946
- "source": "use dep::aztec::context::{PrivateContext, PublicContext, Context};\nuse dep::aztec::state_vars::{map::Map, public_state::PublicState};\nuse dep::aztec::types::type_serialization::bool_serialization::{BoolSerializationMethods,BOOL_SERIALIZED_LEN};\n\nuse crate::entrypoint::EntrypointPayload;\nuse crate::auth::IS_VALID_SELECTOR;\n\nstruct AccountActions {\n context: Context,\n is_valid_impl: fn(&mut PrivateContext, Field) -> bool,\n approved_action: Map<Field, PublicState<bool, BOOL_SERIALIZED_LEN>>,\n}\n\nimpl AccountActions {\n pub fn init(context: Context, approved_action_storage_slot: Field, is_valid_impl: fn(&mut PrivateContext, Field) -> bool) -> Self {\n AccountActions {\n context: context,\n is_valid_impl: is_valid_impl,\n approved_action: Map::new(\n context,\n approved_action_storage_slot,\n |context, slot| {\n PublicState::new(context, slot, BoolSerializationMethods)\n },\n ),\n }\n }\n\n pub fn private(context: &mut PrivateContext, approved_action_storage_slot: Field, is_valid_impl: fn(&mut PrivateContext, Field) -> bool) -> Self {\n AccountActions::init(Context::private(context), approved_action_storage_slot, is_valid_impl)\n }\n\n pub fn public(context: &mut PublicContext, approved_action_storage_slot: Field, is_valid_impl: fn(&mut PrivateContext, Field) -> bool) -> Self {\n AccountActions::init(Context::public(context), approved_action_storage_slot, is_valid_impl)\n }\n \n // docs:start:entrypoint\n pub fn entrypoint(self, payload: EntrypointPayload) {\n let message_hash = payload.hash();\n let valid_fn = self.is_valid_impl;\n let private_context = self.context.private.unwrap();\n assert(valid_fn(private_context, message_hash));\n payload.execute_calls(private_context);\n }\n // docs:end:entrypoint\n\n pub fn is_valid(self, message_hash: Field) -> Field {\n let valid_fn = self.is_valid_impl;\n if (valid_fn(self.context.private.unwrap(), message_hash)) {\n IS_VALID_SELECTOR\n } else {\n 0\n }\n }\n\n pub fn is_valid_public(self, message_hash: Field) -> Field {\n let value = self.approved_action.at(message_hash).read();\n if (value){\n IS_VALID_SELECTOR\n } else {\n 0\n }\n }\n\n pub fn internal_set_is_valid_storage(self, message_hash: Field, value: bool) {\n self.approved_action.at(message_hash).write(value);\n }\n}\n",
947
- "path": "/usr/src/yarn-project/aztec-nr/authwit/src/account.nr"
948
- },
949
- "191": {
950
- "source": "#[oracle(getAuthWitness)]\nfn get_auth_witness_oracle<N>(_message_hash: Field) -> [Field; N] {}\n\nunconstrained pub fn get_auth_witness<N>(message_hash: Field) -> [Field; N] {\n get_auth_witness_oracle(message_hash)\n}\n",
951
- "path": "/usr/src/yarn-project/aztec-nr/authwit/src/auth_witness.nr"
952
- },
953
- "212": {
954
- "source": "mod util;\nmod auth_oracle;\n\ncontract SchnorrSingleKeyAccount {\n use dep::std::{\n option::Option,\n };\n use dep::aztec::context::{ PrivateContext, PublicContext, Context };\n\n use dep::authwit::{\n entrypoint::EntrypointPayload,\n account::AccountActions,\n };\n\n use crate::{ util::recover_address, auth_oracle::get_auth_witness };\n\n global ACCOUNT_ACTIONS_STORAGE_SLOT = 1;\n\n #[aztec(private)]\n fn constructor() {}\n\n // Note: If you globally change the entrypoint signature don't forget to update default_entrypoint.ts\n #[aztec(private)]\n fn entrypoint(payload: pub EntrypointPayload) {\n let actions = AccountActions::private(&mut context, ACCOUNT_ACTIONS_STORAGE_SLOT, is_valid_impl);\n actions.entrypoint(payload);\n }\n\n #[aztec(private)]\n fn is_valid(message_hash: Field) -> Field {\n let actions = AccountActions::private(&mut context, ACCOUNT_ACTIONS_STORAGE_SLOT, is_valid_impl);\n actions.is_valid(message_hash)\n }\n\n #[aztec(public)]\n fn is_valid_public(message_hash: Field) -> Field {\n let actions = AccountActions::public(&mut context, ACCOUNT_ACTIONS_STORAGE_SLOT, is_valid_impl);\n actions.is_valid_public(message_hash)\n }\n\n #[aztec(public)]\n internal fn set_is_valid_storage(message_hash: Field, value: bool) {\n let actions = AccountActions::public(&mut context, ACCOUNT_ACTIONS_STORAGE_SLOT, is_valid_impl);\n actions.internal_set_is_valid_storage(message_hash, value)\n }\n\n #[contract_library_method]\n fn is_valid_impl(context: &mut PrivateContext, message_hash: Field) -> pub bool {\n let witness = get_auth_witness(message_hash);\n assert(recover_address(message_hash, witness).eq(context.this_address()));\n true\n }\n}\n",
955
- "path": "/usr/src/yarn-project/noir-contracts/contracts/schnorr_single_key_account_contract/src/main.nr"
956
- },
957
- "213": {
958
- "source": "use dep::authwit::auth_witness;\nuse dep::aztec::protocol_types::{\n address::PartialAddress,\n grumpkin_point::GrumpkinPoint,\n};\n\nstruct AuthWitness {\n owner: GrumpkinPoint,\n signature: [u8; 64],\n partial_address: PartialAddress,\n}\n\nimpl AuthWitness {\n fn deserialize(values: [Field; 67]) -> Self {\n let mut signature = [0; 64];\n for i in 0..64 {\n signature[i] = values[i + 2] as u8;\n }\n Self {\n owner: GrumpkinPoint::new(values[0], values[1]),\n signature,\n partial_address: PartialAddress::from_field(values[66]),\n }\n }\n}\n\nunconstrained pub fn get_auth_witness(message_hash: Field) -> AuthWitness {\n let witness: [Field; 67] = auth_witness::get_auth_witness(message_hash);\n AuthWitness::deserialize(witness)\n}\n",
959
- "path": "/usr/src/yarn-project/noir-contracts/contracts/schnorr_single_key_account_contract/src/auth_oracle.nr"
960
- },
961
- "214": {
962
- "source": "use dep::aztec::protocol_types::address::AztecAddress;\nuse dep::std::{schnorr::verify_signature};\nuse crate::auth_oracle::{AuthWitness};\n\npub fn recover_address(message_hash: Field, witness: AuthWitness) -> AztecAddress {\n let message_bytes = message_hash.to_be_bytes(32);\n let verification = verify_signature(\n witness.owner.x,\n witness.owner.y,\n witness.signature,\n message_bytes\n );\n assert(verification == true);\n\n AztecAddress::compute(witness.owner, witness.partial_address)\n}\n",
963
- "path": "/usr/src/yarn-project/noir-contracts/contracts/schnorr_single_key_account_contract/src/util.nr"
964
- }
1528
+ "file_map": {
1529
+ "16": {
1530
+ "source": "mod bn254;\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n pub fn to_le_bits(self: Self, bit_size: u32) -> [u1] {\n crate::assert_constant(bit_size);\n self.__to_le_bits(bit_size)\n }\n \n pub fn to_be_bits(self: Self, bit_size: u32) -> [u1] {\n crate::assert_constant(bit_size);\n self.__to_be_bits(bit_size)\n }\n\n #[builtin(to_le_bits)]\n fn __to_le_bits(_self: Self, _bit_size: u32) -> [u1] {}\n \n #[builtin(to_be_bits)]\n fn __to_be_bits(_self: Self, _bit_size: u32) -> [u1] {}\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(_self: Self, _bit_size: u32) {}\n\n pub fn assert_max_bit_size(self: Self, bit_size: u32) {\n crate::assert_constant(bit_size);\n assert(bit_size < modulus_num_bits() as u32);\n self.__assert_max_bit_size(bit_size);\n }\n\n pub fn to_le_bytes(self: Self, byte_size: u32) -> [u8] {\n self.to_le_radix(256, byte_size)\n }\n\n pub fn to_be_bytes(self: Self, byte_size: u32) -> [u8] {\n self.to_be_radix(256, byte_size)\n }\n\n\n pub fn to_le_radix(self: Self, radix: u32, result_len: u32) -> [u8] {\n crate::assert_constant(radix);\n crate::assert_constant(result_len);\n self.__to_le_radix(radix, result_len)\n }\n\n pub fn to_be_radix(self: Self, radix: u32, result_len: u32) -> [u8] {\n crate::assert_constant(radix);\n crate::assert_constant(result_len);\n self.__to_be_radix(radix, result_len)\n }\n\n\n\n // decompose `_self` into a `_result_len` vector over the `_radix` basis\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(_self: Self, _radix: u32, _result_len: u32) -> [u8] {}\n \n #[builtin(to_be_radix)]\n fn __to_be_radix(_self: Self, _radix: u32, _result_len: u32) -> [u8] {}\n\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b = exponent.to_le_bits(32);\n\n for i in 1..33 {\n r *= r;\n r = (b[32-i] as Field) * (r * self) + (1 - b[32-i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x ∈ {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n}\n\n#[builtin(modulus_num_bits)]\npub fn modulus_num_bits() -> Field {}\n\n#[builtin(modulus_be_bits)]\npub fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub fn modulus_le_bytes() -> [u8] {}\n// Convert a 32 byte array to a field element\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n let num_bytes = (modulus_num_bits() as u32 + 7) / 8;\n let x_bytes = x.to_le_bytes(num_bytes);\n let y_bytes = y.to_le_bytes(num_bytes);\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..num_bytes {\n if (!done) {\n let x_byte = x_bytes[num_bytes - 1 - i] as u8;\n let y_byte = y_bytes[num_bytes - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n}\n\n",
1531
+ "path": "std/field.nr"
1532
+ },
1533
+ "28": {
1534
+ "source": "struct Option<T> {\n _is_some: bool,\n _value: T,\n}\n\nimpl<T> Option<T> {\n /// Constructs a None value\n pub fn none() -> Self {\n Self { _is_some: false, _value: crate::unsafe::zeroed() }\n }\n\n /// Constructs a Some wrapper around the given value\n pub fn some(_value: T) -> Self {\n Self { _is_some: true, _value }\n }\n\n /// True if this Option is None\n pub fn is_none(self) -> bool {\n !self._is_some\n }\n\n /// True if this Option is Some\n pub fn is_some(self) -> bool {\n self._is_some\n }\n\n /// Asserts `self.is_some()` and returns the wrapped value.\n pub fn unwrap(self) -> T {\n assert(self._is_some);\n self._value\n }\n\n /// Returns the inner value without asserting `self.is_some()`\n /// Note that if `self` is `None`, there is no guarantee what value will be returned,\n /// only that it will be of type `T`.\n pub fn unwrap_unchecked(self) -> T {\n self._value\n }\n\n /// Returns the wrapped value if `self.is_some()`. Otherwise, returns the given default value.\n pub fn unwrap_or(self, default: T) -> T {\n if self._is_some {\n self._value\n } else {\n default\n }\n }\n\n /// Returns the wrapped value if `self.is_some()`. Otherwise, calls the given function to return\n /// a default value.\n pub fn unwrap_or_else<Env>(self, default: fn[Env]() -> T) -> T {\n if self._is_some {\n self._value\n } else {\n default()\n }\n }\n\n /// If self is `Some(x)`, this returns `Some(f(x))`. Otherwise, this returns `None`.\n pub fn map<U, Env>(self, f: fn[Env](T) -> U) -> Option<U> {\n if self._is_some {\n Option::some(f(self._value))\n } else {\n Option::none()\n }\n }\n\n /// If self is `Some(x)`, this returns `f(x)`. Otherwise, this returns the given default value.\n pub fn map_or<U, Env>(self, default: U, f: fn[Env](T) -> U) -> U {\n if self._is_some {\n f(self._value)\n } else {\n default\n }\n }\n\n /// If self is `Some(x)`, this returns `f(x)`. Otherwise, this returns `default()`.\n pub fn map_or_else<U, Env1, Env2>(self, default: fn[Env1]() -> U, f: fn[Env2](T) -> U) -> U {\n if self._is_some {\n f(self._value)\n } else {\n default()\n }\n }\n\n /// Returns None if self is None. Otherwise, this returns `other`.\n pub fn and(self, other: Self) -> Self {\n if self.is_none() {\n Option::none()\n } else {\n other\n }\n }\n\n /// If self is None, this returns None. Otherwise, this calls the given function\n /// with the Some value contained within self, and returns the result of that call.\n ///\n /// In some languages this function is called `flat_map` or `bind`.\n pub fn and_then<U, Env>(self, f: fn[Env](T) -> Option<U>) -> Option<U> {\n if self._is_some {\n f(self._value)\n } else {\n Option::none()\n }\n }\n\n /// If self is Some, return self. Otherwise, return `other`.\n pub fn or(self, other: Self) -> Self {\n if self._is_some {\n self\n } else {\n other\n }\n }\n\n /// If self is Some, return self. Otherwise, return `default()`.\n pub fn or_else<U, Env>(self, default: fn[Env]() -> Self) -> Self {\n if self._is_some {\n self\n } else {\n default()\n }\n }\n\n // If only one of the two Options is Some, return that option.\n // Otherwise, if both options are Some or both are None, None is returned.\n pub fn xor(self, other: Self) -> Self {\n if self._is_some {\n if other._is_some {\n Option::none()\n } else {\n self\n }\n } else if other._is_some {\n other\n } else {\n Option::none()\n }\n }\n\n /// Returns `Some(x)` if self is `Some(x)` and `predicate(x)` is true.\n /// Otherwise, this returns `None`\n pub fn filter<Env>(self, predicate: fn[Env](T) -> bool) -> Self {\n if self._is_some {\n if predicate(self._value) {\n self\n } else {\n Option::none()\n }\n } else {\n Option::none()\n }\n }\n\n /// Flattens an Option<Option<T>> into a Option<T>.\n /// This returns None if the outer Option is None. Otherwise, this returns the inner Option.\n pub fn flatten(option: Option<Option<T>>) -> Option<T> {\n if option._is_some {\n option._value\n } else {\n Option::none()\n }\n }\n}\n",
1535
+ "path": "std/option.nr"
1536
+ },
1537
+ "41": {
1538
+ "source": "use dep::protocol_types::{\n abis::{\n block_header::BlockHeader,\n call_context::CallContext,\n private_circuit_public_inputs::PrivateCircuitPublicInputs,\n public_circuit_public_inputs::PublicCircuitPublicInputs,\n },\n contrakt::deployment_data::ContractDeploymentData,\n hash::hash_args,\n};\n\n// docs:start:private-global-variables\nstruct PrivateGlobalVariables {\n chain_id: Field,\n version: Field,\n}\n// docs:end:private-global-variables\n\nimpl PrivateGlobalVariables {\n fn serialize(self) -> [Field; 2] {\n [self.chain_id, self.version]\n }\n}\n\n// docs:start:public-global-variables\nstruct PublicGlobalVariables {\n chain_id: Field,\n version: Field,\n block_number: Field,\n timestamp: Field,\n}\n// docs:end:public-global-variables\n\nimpl PublicGlobalVariables {\n fn serialize(self) -> [Field; 4] {\n [self.chain_id, self.version, self.block_number, self.timestamp]\n }\n}\n\n// PrivateContextInputs are expected to be provided to each private function\n// docs:start:private-context-inputs\nstruct PrivateContextInputs {\n call_context : CallContext,\n block_header: BlockHeader,\n contract_deployment_data: ContractDeploymentData,\n private_global_variables: PrivateGlobalVariables,\n}\n// docs:end:private-context-inputs\n\n// PublicContextInputs are expected to be provided to each public function\n// docs:start:public-context-inputs\nstruct PublicContextInputs {\n call_context: CallContext,\n block_header: BlockHeader,\n\n public_global_variables: PublicGlobalVariables,\n}\n// docs:end:public-context-inputs\n\nstruct Hasher {\n fields: [Field],\n}\n\nimpl Hasher {\n pub fn new()-> Self {\n Self { fields: [] }\n }\n\n pub fn add(&mut self, field: Field) {\n self.fields = self.fields.push_back(field);\n }\n\n pub fn add_multiple<N>(&mut self, fields: [Field; N]) {\n for i in 0..N {\n self.fields = self.fields.push_back(fields[i]);\n }\n }\n\n pub fn hash(self) -> Field {\n hash_args(self.fields)\n }\n}\n",
1539
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/abi.nr"
1540
+ },
1541
+ "43": {
1542
+ "source": "use crate::context::{Context};\nuse crate::oracle::storage::storage_read;\nuse crate::oracle::storage::storage_write;\nuse crate::types::type_serialization::TypeSerializationInterface;\nuse dep::std::option::Option;\n\n// docs:start:public_state_struct\nstruct PublicState<T, T_SERIALIZED_LEN> {\n context: Context,\n storage_slot: Field,\n serialization_methods: TypeSerializationInterface<T, T_SERIALIZED_LEN>,\n}\n// docs:end:public_state_struct\n\nimpl<T, T_SERIALIZED_LEN> PublicState<T, T_SERIALIZED_LEN> {\n // docs:start:public_state_struct_new\n pub fn new(\n // Note: Passing the contexts to new(...) just to have an interface compatible with a Map.\n context: Context,\n storage_slot: Field,\n serialization_methods: TypeSerializationInterface<T, T_SERIALIZED_LEN>,\n ) -> Self {\n assert(storage_slot != 0, \"Storage slot 0 not allowed. Storage slots must start from 1.\");\n PublicState {\n context,\n storage_slot,\n serialization_methods,\n }\n }\n // docs:end:public_state_struct_new\n\n // docs:start:public_state_struct_read\n pub fn read(self) -> T {\n assert(self.context.private.is_none(), \"Public state reads only supported in public functions\");\n storage_read(self.storage_slot, self.serialization_methods.deserialize)\n }\n // docs:end:public_state_struct_read\n\n // docs:start:public_state_struct_write\n pub fn write(self, value: T) {\n assert(self.context.private.is_none(), \"Public state writes only supported in public functions\");\n let serialize = self.serialization_methods.serialize;\n let fields = serialize(value);\n storage_write(self.storage_slot, fields);\n }\n // docs:end:public_state_struct_write\n}\n",
1543
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/state_vars/public_state.nr"
1544
+ },
1545
+ "44": {
1546
+ "source": "use crate::context::{PrivateContext, PublicContext, Context};\nuse dep::std::option::Option;\nuse dep::protocol_types::{\n hash::pedersen_hash,\n traits::{ToField}\n};\n\n// docs:start:map\nstruct Map<K, V> {\n context: Context,\n storage_slot: Field,\n state_var_constructor: fn(Context, Field) -> V,\n}\n// docs:end:map\n\nimpl<K, V> Map<K, V> {\n // docs:start:new\n pub fn new(\n context: Context,\n storage_slot: Field,\n state_var_constructor: fn(Context, Field) -> V,\n ) -> Self {\n assert(storage_slot != 0, \"Storage slot 0 not allowed. Storage slots must start from 1.\");\n Map {\n context,\n storage_slot,\n state_var_constructor,\n }\n }\n // docs:end:new\n\n // docs:start:at\n pub fn at(self, key: K) -> V where K: ToField {\n // TODO(#1204): use a generator index for the storage slot\n let derived_storage_slot = pedersen_hash([self.storage_slot, key.to_field()],0);\n\n let state_var_constructor = self.state_var_constructor;\n state_var_constructor(self.context, derived_storage_slot)\n }\n // docs:end:at\n}\n",
1547
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/state_vars/map.nr"
1548
+ },
1549
+ "51": {
1550
+ "source": "use crate::types::type_serialization::TypeSerializationInterface;\n\nglobal BOOL_SERIALIZED_LEN: Field = 1;\n\nfn deserializeBool(fields: [Field; BOOL_SERIALIZED_LEN]) -> bool {\n fields[0] as bool\n}\n\nfn serializeBool(value: bool) -> [Field; BOOL_SERIALIZED_LEN] {\n [value as Field]\n}\n\nglobal BoolSerializationMethods = TypeSerializationInterface {\n deserialize: deserializeBool,\n serialize: serializeBool,\n};\n",
1551
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/types/type_serialization/bool_serialization.nr"
1552
+ },
1553
+ "53": {
1554
+ "source": "struct BoundedVec<T, MaxLen> {\n storage: [T; MaxLen],\n len: Field,\n}\n\nimpl<T, MaxLen> BoundedVec<T, MaxLen> {\n pub fn new(initial_value: T) -> Self {\n BoundedVec { storage: [initial_value; MaxLen], len: 0 }\n }\n\n pub fn get(mut self: Self, index: Field) -> T {\n assert(index as u64 < self.len as u64);\n self.storage[index]\n }\n\n pub fn get_unchecked(mut self: Self, index: Field) -> T {\n self.storage[index]\n }\n\n pub fn push(&mut self, elem: T) {\n assert(self.len as u64 < MaxLen as u64);\n\n self.storage[self.len] = elem;\n self.len += 1;\n }\n\n pub fn push_array<Len>(&mut self, array: [T; Len]) {\n let newLen = self.len + array.len();\n assert(newLen as u64 <= MaxLen as u64);\n for i in 0..array.len() {\n self.storage[self.len + i] = array[i];\n }\n self.len = newLen;\n }\n\n pub fn pop(&mut self) -> T {\n assert(self.len as u64 > 0);\n\n let elem = self.storage[self.len - 1];\n self.len -= 1;\n elem\n }\n\n pub fn any<Env>(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n let mut exceeded_len = false;\n for i in 0..MaxLen {\n exceeded_len |= i == self.len;\n if (!exceeded_len) {\n ret |= predicate(self.storage[i]);\n }\n }\n ret\n }\n}\n\n#[test]\nfn test_vec_push_pop() {\n let mut vec: BoundedVec<Field, 3> = BoundedVec::new(0);\n assert(vec.len == 0);\n vec.push(2);\n assert(vec.len == 1);\n vec.push(4);\n assert(vec.len == 2);\n vec.push(6);\n assert(vec.len == 3);\n let x = vec.pop();\n assert(x == 6);\n assert(vec.len == 2);\n assert(vec.get(0) == 2);\n assert(vec.get(1) == 4);\n}\n\n#[test]\nfn test_vec_push_array() {\n let mut vec: BoundedVec<Field, 3> = BoundedVec::new(0);\n vec.push_array([2, 4]);\n assert(vec.len == 2);\n assert(vec.get(0) == 2);\n assert(vec.get(1) == 4);\n}\n\n#[test(should_fail)]\nfn test_vec_get_out_of_bound() {\n let mut vec: BoundedVec<Field, 2> = BoundedVec::new(0);\n vec.push_array([2, 4]);\n let _x = vec.get(2);\n}\n\n#[test(should_fail)]\nfn test_vec_get_not_declared() {\n let mut vec: BoundedVec<Field, 2> = BoundedVec::new(0);\n vec.push_array([2]);\n let _x = vec.get(1);\n}\n\n#[test(should_fail)]\nfn test_vec_get_uninitialized() {\n let mut vec: BoundedVec<Field, 2> = BoundedVec::new(0);\n let _x = vec.get(0);\n}\n\n#[test(should_fail)]\nfn test_vec_push_overflow() {\n let mut vec: BoundedVec<Field, 1> = BoundedVec::new(0);\n vec.push(1);\n vec.push(2);\n}\n\n#[test]\nfn test_vec_any() {\n let mut vec: BoundedVec<Field, 3> = BoundedVec::new(0);\n vec.push_array([2, 4, 6]);\n assert(vec.any(|v| v == 2) == true);\n assert(vec.any(|v| v == 4) == true);\n assert(vec.any(|v| v == 6) == true);\n assert(vec.any(|v| v == 3) == false);\n}\n\n#[test]\nfn test_vec_any_not_default() {\n let default_value = 1;\n let mut vec: BoundedVec<Field, 3> = BoundedVec::new(default_value);\n vec.push_array([2, 4]);\n assert(vec.any(|v| v == default_value) == false);\n}\n",
1555
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/types/vec.nr"
1556
+ },
1557
+ "66": {
1558
+ "source": "pub fn arr_copy_slice<T, N, M>(src: [T; N], mut dst: [T; M], offset: Field) -> [T; M] {\n for i in 0..dst.len() {\n dst[i] = src[i + offset];\n }\n dst\n}\n\n// TODO(#3470): Copied over from https://github.com/AztecProtocol/aztec-packages/blob/a07c4bd47313be6aa604a63f37857eb0136b41ba/yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/base/base_rollup_inputs.nr#L599\n// move to a shared place?\n\n// TODO to radix returns u8, so we cannot use bigger radixes. It'd be ideal to use a radix of the maximum range-constrained integer noir supports\npub fn full_field_less_than(lhs: Field, rhs: Field) -> bool {\n lhs.lt(rhs)\n}\n\npub fn full_field_greater_than(lhs: Field, rhs: Field) -> bool {\n rhs.lt(lhs)\n}\n\nstruct Reader<N> {\n data: [Field; N],\n offset: Field,\n}\n\nimpl<N> Reader<N> {\n pub fn new(data: [Field; N]) -> Self {\n Self { data, offset: 0 }\n }\n\n pub fn read(&mut self) -> Field {\n let result = self.data[self.offset];\n self.offset += 1;\n result\n }\n\n pub fn read_array<K>(&mut self, mut result: [Field; K]) -> [Field; K] {\n for i in 0..K {\n result[i] = self.data[self.offset + i];\n }\n self.offset += K;\n result\n }\n\n pub fn read_struct<T, K>(&mut self, deserialise: fn([Field; K]) -> T) -> T {\n let result = deserialise(self.read_array([0; K]));\n result\n }\n\n pub fn read_struct_array<T, K, C>(&mut self, deserialise: fn([Field; K]) -> T, mut result: [T; C]) -> [T; C] {\n for i in 0..C {\n result[i] = self.read_struct(deserialise);\n }\n result\n }\n\n pub fn finish(self) {\n assert(self.offset == self.data.len(), \"Reader did not read all data\");\n } \n}\n",
1559
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/utils.nr"
1560
+ },
1561
+ "68": {
1562
+ "source": "use crate::{\n abi::{\n PrivateContextInputs,\n PublicContextInputs,\n },\n key::nullifier_key::validate_nullifier_key_against_address,\n messaging::process_l1_to_l2_message,\n oracle::{\n arguments,\n call_private_function::call_private_function_internal,\n public_call::call_public_function_internal,\n enqueue_public_function_call::enqueue_public_function_call_internal,\n context::get_portal_address,\n get_block_header::get_block_header,\n nullifier_key::get_nullifier_key_pair,\n },\n types::vec::BoundedVec,\n utils::Reader,\n};\nuse dep::protocol_types::{\n abis::{\n block_header::BlockHeader,\n call_context::CallContext,\n function_data::FunctionData,\n function_selector::FunctionSelector,\n private_circuit_public_inputs::PrivateCircuitPublicInputs,\n public_circuit_public_inputs::PublicCircuitPublicInputs,\n call_stack_item::PrivateCallStackItem,\n call_stack_item::PublicCallStackItem,\n side_effect::{SideEffect, SideEffectLinkedToNoteHash},\n },\n address::{\n AztecAddress,\n EthAddress,\n },\n constants::{\n MAX_NEW_COMMITMENTS_PER_CALL,\n MAX_NEW_L2_TO_L1_MSGS_PER_CALL,\n MAX_NEW_NULLIFIERS_PER_CALL,\n MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL,\n MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL,\n MAX_PUBLIC_DATA_READS_PER_CALL,\n MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL,\n MAX_READ_REQUESTS_PER_CALL,\n NUM_FIELDS_PER_SHA256,\n RETURN_VALUES_LENGTH,\n },\n contrakt::{\n deployment_data::ContractDeploymentData,\n storage_read::StorageRead,\n storage_update_request::StorageUpdateRequest,\n },\n hash::hash_args,\n grumpkin_point::GrumpkinPoint,\n};\nuse dep::std::{\n grumpkin_scalar::GrumpkinScalar,\n option::Option,\n};\n\n// TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n// use dep::std::collections::vec::Vec;\n\n// When finished, one can call .finish() to convert back to the abi\nstruct PrivateContext {\n // docs:start:private-context\n inputs: PrivateContextInputs,\n side_effect_counter: u32,\n\n args_hash : Field,\n return_values : BoundedVec<Field, RETURN_VALUES_LENGTH>,\n\n read_requests: BoundedVec<SideEffect, MAX_READ_REQUESTS_PER_CALL>,\n\n new_commitments: BoundedVec<SideEffect, MAX_NEW_COMMITMENTS_PER_CALL>,\n new_nullifiers: BoundedVec<SideEffectLinkedToNoteHash, MAX_NEW_NULLIFIERS_PER_CALL>,\n\n private_call_stack_hashes : BoundedVec<Field, MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL>,\n public_call_stack_hashes : BoundedVec<Field, MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL>,\n new_l2_to_l1_msgs : BoundedVec<Field, MAX_NEW_L2_TO_L1_MSGS_PER_CALL>,\n // docs:end:private-context\n\n block_header: BlockHeader,\n\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n // encrypted_logs_preimages: Vec<Field>,\n // unencrypted_logs_preimages: Vec<Field>,\n}\n\nimpl PrivateContext {\n pub fn new(inputs: PrivateContextInputs, args_hash: Field) -> PrivateContext {\n PrivateContext {\n inputs: inputs,\n side_effect_counter: inputs.call_context.start_side_effect_counter,\n\n args_hash: args_hash,\n return_values: BoundedVec::new(0),\n\n read_requests: BoundedVec::new(SideEffect::empty()),\n\n new_commitments: BoundedVec::new(SideEffect::empty()),\n new_nullifiers: BoundedVec::new(SideEffectLinkedToNoteHash::empty()),\n\n block_header: inputs.block_header,\n\n private_call_stack_hashes: BoundedVec::new(0),\n public_call_stack_hashes: BoundedVec::new(0),\n new_l2_to_l1_msgs: BoundedVec::new(0),\n\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n // encrypted_logs_preimages: Vec::new(),\n // unencrypted_logs_preimages: Vec::new(),\n }\n }\n\n pub fn msg_sender(self) -> AztecAddress {\n self.inputs.call_context.msg_sender\n }\n\n pub fn this_address(self) -> AztecAddress {\n self.inputs.call_context.storage_contract_address\n }\n\n pub fn this_portal_address(self) -> EthAddress {\n self.inputs.call_context.portal_contract_address\n }\n\n pub fn chain_id(self) -> Field {\n self.inputs.private_global_variables.chain_id\n }\n\n pub fn version(self) -> Field {\n self.inputs.private_global_variables.version\n }\n\n pub fn selector(self) -> FunctionSelector {\n self.inputs.call_context.function_selector\n }\n\n pub fn get_block_header(self, block_number: u32) -> BlockHeader {\n get_block_header(block_number, self)\n }\n\n pub fn finish(self) -> PrivateCircuitPublicInputs {\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n let encrypted_logs_hash = [0; NUM_FIELDS_PER_SHA256];\n let unencrypted_logs_hash = [0; NUM_FIELDS_PER_SHA256];\n let encrypted_log_preimages_length = 0;\n let unencrypted_log_preimages_length = 0;\n\n let priv_circuit_pub_inputs = PrivateCircuitPublicInputs {\n call_context: self.inputs.call_context,\n args_hash: self.args_hash,\n return_values: self.return_values.storage,\n read_requests: self.read_requests.storage,\n new_commitments: self.new_commitments.storage,\n new_nullifiers: self.new_nullifiers.storage,\n private_call_stack_hashes: self.private_call_stack_hashes.storage,\n public_call_stack_hashes: self.public_call_stack_hashes.storage,\n new_l2_to_l1_msgs: self.new_l2_to_l1_msgs.storage,\n end_side_effect_counter: self.side_effect_counter,\n encrypted_logs_hash: encrypted_logs_hash,\n unencrypted_logs_hash: unencrypted_logs_hash,\n encrypted_log_preimages_length: encrypted_log_preimages_length,\n unencrypted_log_preimages_length: unencrypted_log_preimages_length,\n block_header: self.block_header,\n contract_deployment_data: self.inputs.contract_deployment_data,\n chain_id: self.inputs.private_global_variables.chain_id,\n version: self.inputs.private_global_variables.version,\n };\n priv_circuit_pub_inputs\n }\n\n pub fn push_read_request(&mut self, read_request: Field) {\n let side_effect = SideEffect {\n value: read_request,\n counter: self.side_effect_counter,\n };\n self.read_requests.push(side_effect);\n self.side_effect_counter = self.side_effect_counter + 1;\n }\n\n pub fn push_new_note_hash(&mut self, note_hash: Field) {\n let side_effect = SideEffect {\n value: note_hash,\n counter: self.side_effect_counter,\n };\n self.new_commitments.push(side_effect);\n self.side_effect_counter = self.side_effect_counter + 1;\n }\n\n pub fn push_new_nullifier(&mut self, nullifier: Field, nullified_commitment: Field) {\n let side_effect = SideEffectLinkedToNoteHash {\n value: nullifier,\n note_hash: nullified_commitment,\n counter: self.side_effect_counter,\n };\n self.new_nullifiers.push(side_effect);\n self.side_effect_counter = self.side_effect_counter + 1;\n }\n\n pub fn request_nullifier_secret_key(&mut self, account: AztecAddress) -> GrumpkinScalar {\n let key_pair = get_nullifier_key_pair(account);\n validate_nullifier_key_against_address(account, key_pair.public_key, key_pair.secret_key);\n // TODO: Add request to context.\n // self.context.push_nullifier_key_validation_request(public_key, secret_key);\n key_pair.secret_key\n }\n\n // docs:start:context_message_portal\n pub fn message_portal(&mut self, content: Field) \n // docs:end:context_message_portal\n {\n self.new_l2_to_l1_msgs.push(content);\n }\n\n // PrivateContextInputs must be temporarily passed in to prevent too many unknowns\n // Note this returns self to get around an issue where mutable structs do not maintain mutations unless reassigned\n // docs:start:context_consume_l1_to_l2_message\n // docs:start:consume_l1_to_l2_message\n pub fn consume_l1_to_l2_message(\n &mut self,\n msg_key: Field,\n content: Field,\n secret: Field\n ) \n // docs:end:context_consume_l1_to_l2_message\n {\n let nullifier = process_l1_to_l2_message(self.block_header.l1_to_l2_message_tree_root, self.this_address(), self.this_portal_address(), self.chain_id(), self.version(), msg_key, content, secret);\n\n // Push nullifier (and the \"commitment\" corresponding to this can be \"empty\")\n self.push_new_nullifier(nullifier, 0)\n }\n // docs:end:consume_l1_to_l2_message\n\n pub fn accumulate_encrypted_logs<N>(&mut self, log: [Field; N]) {\n let _void1 = self.inputs;\n let _void2 = log;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n }\n\n pub fn accumulate_unencrypted_logs<T>(&mut self, log: T) {\n let _void1 = self.inputs;\n let _void2 = log;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n }\n\n pub fn call_private_function<ARGS_COUNT>(\n &mut self,\n contract_address: AztecAddress, \n function_selector: FunctionSelector, \n args: [Field; ARGS_COUNT]\n ) -> [Field; RETURN_VALUES_LENGTH] {\n let args_hash = hash_args(args);\n assert(args_hash == arguments::pack_arguments(args));\n self.call_private_function_with_packed_args(contract_address, function_selector, args_hash)\n }\n\n pub fn call_private_function_no_args(\n &mut self,\n contract_address: AztecAddress, \n function_selector: FunctionSelector, \n ) -> [Field; RETURN_VALUES_LENGTH] {\n self.call_private_function_with_packed_args(contract_address, function_selector, 0)\n }\n\n pub fn call_private_function_with_packed_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field\n ) -> [Field; RETURN_VALUES_LENGTH] {\n let fields = call_private_function_internal(\n contract_address,\n function_selector, \n args_hash,\n self.side_effect_counter,\n );\n let mut reader = Reader::new(fields);\n\n let item = PrivateCallStackItem {\n contract_address: AztecAddress::from_field(reader.read()),\n function_data: FunctionData {\n selector: FunctionSelector::from_field(reader.read()),\n is_internal: reader.read() as bool,\n is_private: reader.read() as bool,\n is_constructor: reader.read() as bool,\n },\n public_inputs: PrivateCircuitPublicInputs {\n call_context: CallContext {\n msg_sender : AztecAddress::from_field(reader.read()),\n storage_contract_address : AztecAddress::from_field(reader.read()),\n portal_contract_address : EthAddress::from_field(reader.read()),\n function_selector: FunctionSelector::from_field(reader.read()), // practically same as fields[1]\n is_delegate_call : reader.read() as bool,\n is_static_call : reader.read() as bool,\n is_contract_deployment: reader.read() as bool,\n start_side_effect_counter: reader.read() as u32,\n },\n args_hash: reader.read(),\n return_values: reader.read_array([0; RETURN_VALUES_LENGTH]), // +1\n read_requests: reader.read_struct_array(SideEffect::deserialise, [SideEffect::empty(); MAX_READ_REQUESTS_PER_CALL]),\n new_commitments: reader.read_struct_array(SideEffect::deserialise, [SideEffect::empty(); MAX_NEW_COMMITMENTS_PER_CALL]),\n new_nullifiers: reader.read_struct_array(SideEffectLinkedToNoteHash::deserialise, [SideEffectLinkedToNoteHash::empty(); MAX_NEW_NULLIFIERS_PER_CALL]),\n private_call_stack_hashes: reader.read_array([0; MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL]),\n public_call_stack_hashes: reader.read_array([0; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL]),\n new_l2_to_l1_msgs: reader.read_array([0; MAX_NEW_L2_TO_L1_MSGS_PER_CALL]),\n end_side_effect_counter: reader.read() as u32,\n encrypted_logs_hash: reader.read_array([0; NUM_FIELDS_PER_SHA256]),\n unencrypted_logs_hash: reader.read_array([0; NUM_FIELDS_PER_SHA256]),\n encrypted_log_preimages_length: reader.read(),\n unencrypted_log_preimages_length: reader.read(),\n block_header: BlockHeader{\n // Must match order in `private_circuit_public_inputs.hpp`\n note_hash_tree_root : reader.read(),\n nullifier_tree_root : reader.read(),\n contract_tree_root : reader.read(),\n l1_to_l2_message_tree_root : reader.read(),\n archive_root : reader.read(),\n public_data_tree_root: reader.read(),\n global_variables_hash: reader.read(),\n },\n contract_deployment_data: ContractDeploymentData {\n deployer_public_key: GrumpkinPoint {\n x: reader.read(), \n y: reader.read()\n },\n constructor_vk_hash : reader.read(),\n function_tree_root : reader.read(),\n contract_address_salt : reader.read(),\n portal_contract_address : EthAddress::from_field(reader.read()),\n },\n chain_id: reader.read(),\n version: reader.read(),\n },\n is_execution_request: reader.read() as bool,\n };\n\n reader.finish();\n\n assert_eq(item.public_inputs.call_context.start_side_effect_counter, self.side_effect_counter);\n self.side_effect_counter = item.public_inputs.end_side_effect_counter + 1;\n \n assert(contract_address.eq(item.contract_address));\n assert(function_selector.eq(item.function_data.selector));\n\n assert(args_hash == item.public_inputs.args_hash);\n\n assert(item.is_execution_request == false);\n\n // Assert that the call context of the enqueued call generated by the oracle matches our request.\n // We are issuing a regular call which is not delegate, static, or deployment. We also constrain\n // the msg_sender in the nested call to be equal to our address, and the execution context address\n // for the nested call to be equal to the address we actually called.\n assert(item.public_inputs.call_context.is_delegate_call == false);\n assert(item.public_inputs.call_context.is_static_call == false);\n assert(item.public_inputs.call_context.is_contract_deployment == false);\n assert(item.public_inputs.call_context.msg_sender.eq(self.inputs.call_context.storage_contract_address));\n assert(item.public_inputs.call_context.storage_contract_address.eq(contract_address));\n\n self.private_call_stack_hashes.push(item.hash());\n\n item.public_inputs.return_values\n }\n\n pub fn call_public_function<ARGS_COUNT>(\n &mut self,\n contract_address: AztecAddress, \n function_selector: FunctionSelector, \n args: [Field; ARGS_COUNT]\n ) {\n let args_hash = hash_args(args);\n assert(args_hash == arguments::pack_arguments(args));\n self.call_public_function_with_packed_args(contract_address, function_selector, args_hash)\n }\n\n pub fn call_public_function_no_args(\n &mut self,\n contract_address: AztecAddress, \n function_selector: FunctionSelector,\n ) {\n self.call_public_function_with_packed_args(contract_address, function_selector, 0)\n }\n\n pub fn call_public_function_with_packed_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field\n ) {\n let fields = enqueue_public_function_call_internal(\n contract_address, \n function_selector, \n args_hash,\n self.side_effect_counter\n );\n\n let mut reader = Reader::new(fields);\n\n let item = PublicCallStackItem {\n contract_address: AztecAddress::from_field(reader.read()),\n function_data: FunctionData {\n selector: FunctionSelector::from_field(reader.read()),\n is_internal: reader.read() as bool,\n is_private: reader.read() as bool,\n is_constructor: reader.read() as bool,\n },\n public_inputs: PublicCircuitPublicInputs {\n call_context: CallContext {\n msg_sender : AztecAddress::from_field(reader.read()),\n storage_contract_address : AztecAddress::from_field(reader.read()),\n portal_contract_address : EthAddress::from_field(reader.read()),\n function_selector: FunctionSelector::from_field(reader.read()), // practically same as fields[1]\n is_delegate_call : reader.read() as bool,\n is_static_call : reader.read() as bool,\n is_contract_deployment: reader.read() as bool,\n start_side_effect_counter: reader.read() as u32,\n },\n args_hash: reader.read(),\n return_values: [0; RETURN_VALUES_LENGTH],\n contract_storage_update_requests: [StorageUpdateRequest::empty(); MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL],\n contract_storage_reads: [StorageRead::empty(); MAX_PUBLIC_DATA_READS_PER_CALL],\n public_call_stack_hashes: [0; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL],\n new_commitments: [SideEffect::empty(); MAX_NEW_COMMITMENTS_PER_CALL],\n new_nullifiers: [SideEffectLinkedToNoteHash::empty(); MAX_NEW_NULLIFIERS_PER_CALL],\n new_l2_to_l1_msgs:[0; MAX_NEW_L2_TO_L1_MSGS_PER_CALL],\n unencrypted_logs_hash:[0; NUM_FIELDS_PER_SHA256],\n unencrypted_log_preimages_length: 0,\n block_header: BlockHeader::empty(),\n prover_address: AztecAddress::zero(),\n },\n is_execution_request: true,\n };\n reader.finish();\n\n assert(contract_address.eq(item.contract_address));\n assert(function_selector.eq(item.function_data.selector));\n\n assert_eq(item.public_inputs.call_context.start_side_effect_counter, self.side_effect_counter);\n // We increment the sideffect counter by one, to account for the call itself being a side effect.\n self.side_effect_counter = self.side_effect_counter + 1;\n \n assert(args_hash == item.public_inputs.args_hash);\n\n // Assert that the call context of the enqueued call generated by the oracle matches our request.\n // We are issuing a regular call which is not delegate, static, or deployment. We also constrain\n // the msg_sender in the nested call to be equal to our address, and the execution context address\n // for the nested call to be equal to the address we actually called.\n assert(item.public_inputs.call_context.is_delegate_call == false);\n assert(item.public_inputs.call_context.is_static_call == false);\n assert(item.public_inputs.call_context.is_contract_deployment == false);\n assert(item.public_inputs.call_context.msg_sender.eq(self.inputs.call_context.storage_contract_address));\n assert(item.public_inputs.call_context.storage_contract_address.eq(contract_address));\n\n self.public_call_stack_hashes.push(item.hash());\n }\n}\n\nstruct PublicContext {\n inputs: PublicContextInputs,\n side_effect_counter: u32,\n\n args_hash : Field,\n return_values : BoundedVec<Field, RETURN_VALUES_LENGTH>,\n\n contract_storage_update_requests: BoundedVec<StorageUpdateRequest, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL>,\n contract_storage_reads: BoundedVec<StorageRead, MAX_PUBLIC_DATA_READS_PER_CALL>,\n public_call_stack_hashes: BoundedVec<Field, MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL>,\n\n new_commitments: BoundedVec<SideEffect, MAX_NEW_COMMITMENTS_PER_CALL>,\n new_nullifiers: BoundedVec<SideEffectLinkedToNoteHash, MAX_NEW_NULLIFIERS_PER_CALL>,\n\n new_l2_to_l1_msgs: BoundedVec<Field, MAX_NEW_L2_TO_L1_MSGS_PER_CALL>,\n\n unencrypted_logs_hash: BoundedVec<Field, NUM_FIELDS_PER_SHA256>,\n unencrypted_logs_preimages_length: Field,\n\n block_header: BlockHeader,\n prover_address: AztecAddress,\n}\n\nimpl PublicContext {\n pub fn new(inputs: PublicContextInputs, args_hash: Field) -> PublicContext {\n let empty_storage_read = StorageRead::empty();\n let empty_storage_update = StorageUpdateRequest::empty();\n PublicContext {\n inputs: inputs,\n side_effect_counter: inputs.call_context.start_side_effect_counter,\n\n args_hash: args_hash,\n return_values: BoundedVec::new(0),\n\n contract_storage_update_requests: BoundedVec::new(empty_storage_update),\n contract_storage_reads: BoundedVec::new(empty_storage_read),\n public_call_stack_hashes: BoundedVec::new(0),\n\n new_commitments: BoundedVec::new(SideEffect::empty()),\n new_nullifiers: BoundedVec::new(SideEffectLinkedToNoteHash::empty()),\n\n new_l2_to_l1_msgs: BoundedVec::new(0),\n\n \n unencrypted_logs_hash: BoundedVec::new(0),\n unencrypted_logs_preimages_length: 0,\n\n block_header: inputs.block_header,\n prover_address: AztecAddress::zero(),\n\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n // encrypted_logs_preimages: Vec::new(),\n // unencrypted_logs_preimages: Vec::new(),\n }\n }\n\n pub fn msg_sender(self) -> AztecAddress {\n self.inputs.call_context.msg_sender\n }\n\n pub fn this_address(self) -> AztecAddress {\n self.inputs.call_context.storage_contract_address\n }\n\n pub fn this_portal_address(self) -> EthAddress {\n self.inputs.call_context.portal_contract_address\n }\n\n pub fn chain_id(self) -> Field {\n self.inputs.public_global_variables.chain_id\n }\n\n pub fn version(self) -> Field {\n self.inputs.public_global_variables.version\n }\n\n pub fn selector(self) -> FunctionSelector {\n self.inputs.call_context.function_selector\n }\n\n pub fn block_number(self) -> Field {\n self.inputs.public_global_variables.block_number\n }\n\n pub fn timestamp(self) -> Field {\n self.inputs.public_global_variables.timestamp\n }\n\n pub fn finish(self) -> PublicCircuitPublicInputs {\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n let unencrypted_logs_hash = [0; NUM_FIELDS_PER_SHA256];\n let unencrypted_log_preimages_length = 0;\n\n\n // Compute the public call stack hashes\n let pub_circuit_pub_inputs = PublicCircuitPublicInputs {\n call_context: self.inputs.call_context, // Done\n args_hash: self.args_hash, // Done\n contract_storage_update_requests: self.contract_storage_update_requests.storage,\n contract_storage_reads: self.contract_storage_reads.storage,\n return_values: self.return_values.storage,\n new_commitments: self.new_commitments.storage,\n new_nullifiers: self.new_nullifiers.storage,\n public_call_stack_hashes: self.public_call_stack_hashes.storage,\n new_l2_to_l1_msgs: self.new_l2_to_l1_msgs.storage,\n unencrypted_logs_hash: unencrypted_logs_hash,\n unencrypted_log_preimages_length: unencrypted_log_preimages_length,\n block_header: self.inputs.block_header,\n prover_address: self.prover_address,\n };\n pub_circuit_pub_inputs\n }\n\n pub fn push_new_note_hash(&mut self, note_hash: Field) {\n let side_effect = SideEffect {\n value: note_hash,\n counter: self.side_effect_counter\n };\n self.new_commitments.push(side_effect);\n self.side_effect_counter = self.side_effect_counter + 1;\n }\n\n pub fn push_new_nullifier(&mut self, nullifier: Field, _nullified_commitment: Field) {\n let side_effect = SideEffectLinkedToNoteHash {\n value: nullifier,\n note_hash: 0, // cannot nullify pending notes in public context\n counter: self.side_effect_counter\n };\n self.new_nullifiers.push(side_effect);\n self.side_effect_counter = self.side_effect_counter + 1;\n }\n\n pub fn message_portal(&mut self, content: Field) {\n self.new_l2_to_l1_msgs.push(content);\n }\n\n // PrivateContextInputs must be temporarily passed in to prevent too many unknowns\n // Note this returns self to get around an issue where mutable structs do not maintain mutations unless reassigned\n pub fn consume_l1_to_l2_message(&mut self, msg_key: Field, content: Field, secret: Field) {\n let this = (*self).this_address();\n let nullifier = process_l1_to_l2_message(self.block_header.l1_to_l2_message_tree_root, this, self.this_portal_address(), self.chain_id(), self.version(), msg_key, content, secret);\n\n // Push nullifier (and the \"commitment\" corresponding to this can be \"empty\")\n self.push_new_nullifier(nullifier, 0)\n }\n\n pub fn accumulate_encrypted_logs<N>(&mut self, log: [Field; N]) {\n let _void1 = self;\n let _void2 = log;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n }\n\n pub fn accumulate_unencrypted_logs<T>(&mut self, log: T) {\n let _void1 = self;\n let _void2 = log;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n }\n\n pub fn call_public_function<ARGS_COUNT>(\n _self: Self,\n contract_address: AztecAddress, \n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT],\n ) -> [Field; RETURN_VALUES_LENGTH] {\n let args_hash = hash_args(args);\n assert(args_hash == arguments::pack_arguments(args));\n call_public_function_internal(\n contract_address, \n function_selector, \n args_hash,\n )\n }\n\n pub fn call_public_function_no_args(\n _self: Self,\n contract_address: AztecAddress, \n function_selector: FunctionSelector,\n ) -> [Field; RETURN_VALUES_LENGTH] {\n call_public_function_internal(\n contract_address, \n function_selector, \n 0,\n )\n }\n\n}\n\nstruct Context {\n private: Option<&mut PrivateContext>,\n public: Option<&mut PublicContext>,\n}\n\nimpl Context {\n pub fn private(context: &mut PrivateContext) -> Context {\n Context {\n private: Option::some(context),\n public: Option::none()\n }\n }\n\n pub fn public(context: &mut PublicContext) -> Context {\n Context {\n public: Option::some(context),\n private: Option::none()\n }\n }\n\n pub fn none() -> Context {\n Context {\n public: Option::none(),\n private: Option::none()\n }\n }\n}\n",
1563
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/context.nr"
1564
+ },
1565
+ "83": {
1566
+ "source": "use dep::protocol_types::{\n abis::function_selector::FunctionSelector,\n address::AztecAddress,\n};\n\n// contract_address + \n// args_hash +\n// crate::abi::FUNCTION_DATA_SIZE +\n// crate::abi::CALL_CONTEXT_SIZE\n// = 2 + 4 + 8\nglobal ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_SIZE: Field = 14;\n\n#[oracle(enqueuePublicFunctionCall)]\nfn enqueue_public_function_call_oracle(\n _contract_address: AztecAddress,\n _function_selector: FunctionSelector,\n _args_hash: Field,\n _side_effect_counter: u32\n) -> [Field; ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_SIZE] {}\n\nunconstrained pub fn enqueue_public_function_call_internal(\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n side_effect_counter: u32\n) -> [Field; ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_SIZE] {\n enqueue_public_function_call_oracle(\n contract_address,\n function_selector,\n args_hash,\n side_effect_counter\n )\n}\n",
1567
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/oracle/enqueue_public_function_call.nr"
1568
+ },
1569
+ "89": {
1570
+ "source": "use dep::protocol_types::{\n abis::function_selector::FunctionSelector,\n address::AztecAddress,\n constants::CALL_PRIVATE_FUNCTION_RETURN_SIZE,\n};\n\n#[oracle(callPrivateFunction)]\nfn call_private_function_oracle(\n _contract_address: AztecAddress,\n _function_selector: FunctionSelector,\n _args_hash: Field,\n _start_side_effect_counter: u32\n) -> [Field; CALL_PRIVATE_FUNCTION_RETURN_SIZE] {}\n\nunconstrained pub fn call_private_function_internal(\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n start_side_effect_counter: u32\n) -> [Field; CALL_PRIVATE_FUNCTION_RETURN_SIZE] {\n call_private_function_oracle(\n contract_address,\n function_selector,\n args_hash,\n start_side_effect_counter\n )\n}\n",
1571
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/oracle/call_private_function.nr"
1572
+ },
1573
+ "96": {
1574
+ "source": "#[oracle(storageRead)]\nfn storage_read_oracle<N>(_storage_slot: Field, _number_of_elements: Field) -> [Field; N] {}\n\nunconstrained fn storage_read_oracle_wrapper<N>(_storage_slot: Field) -> [Field; N] {\n storage_read_oracle(_storage_slot, N)\n}\n\npub fn storage_read<T, N>(storage_slot: Field, deserialize: fn([Field; N]) -> T) -> T {\n let fields = storage_read_oracle_wrapper(storage_slot);\n deserialize(fields)\n}\n\n#[oracle(storageWrite)]\nfn storage_write_oracle<N>(_storage_slot: Field, _values: [Field; N]) -> [Field; N] {}\n\n// TODO: Remove return value.\nunconstrained pub fn storage_write<N>(storage_slot: Field, fields: [Field; N]) {\n let _hash = storage_write_oracle(storage_slot, fields);\n}\n",
1575
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/oracle/storage.nr"
1576
+ },
1577
+ "101": {
1578
+ "source": "global ARGS_LENGTH: Field = 16;\nglobal RETURN_VALUES_LENGTH: Field = 4;\n\n/**\n * Convention for constant array lengths are mainly divided in 2 classes:\n * - FUNCTION CALL\n * - TRANSACTION\n *\n * Agreed convention is to use MAX_XXX_PER_CALL resp. MAX_XXX_PER_TX, where XXX denotes a type of element such as\n * commitment, or nullifier, e.g.,:\n * - MAX_NEW_NULLIFIERS_PER_CALL\n * - MAX_NEW_COMMITMENTS_PER_TX\n *\n * In the kernel circuits, we accumulate elements such as commitments and the nullifiers from all functions calls in a\n * transaction. Therefore, we always must have:\n * MAX_XXX_PER_TX ≥ MAX_XXX_PER_CALL\n *\n * For instance:\n * MAX_NEW_COMMITMENTS_PER_TX ≥ MAX_NEW_COMMITMENTS_PER_CALL\n * MAX_NEW_NULLIFIERS_PER_TX ≥ MAX_NEW_NULLIFIERS_PER_CALL\n *\n */\n\n// docs:start:constants\n// \"PER CALL\" CONSTANTS\nglobal MAX_NEW_COMMITMENTS_PER_CALL: Field = 16;\nglobal MAX_NEW_NULLIFIERS_PER_CALL: Field = 16;\nglobal MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL: Field = 4;\nglobal MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL: Field = 4;\nglobal MAX_NEW_L2_TO_L1_MSGS_PER_CALL: Field = 2;\nglobal MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL: Field = 16;\nglobal MAX_PUBLIC_DATA_READS_PER_CALL: Field = 16;\nglobal MAX_READ_REQUESTS_PER_CALL: Field = 32;\n\n// \"PER TRANSACTION\" CONSTANTS\nglobal MAX_NEW_COMMITMENTS_PER_TX: Field = 64;\nglobal MAX_NEW_NULLIFIERS_PER_TX: Field = 64;\nglobal MAX_PRIVATE_CALL_STACK_LENGTH_PER_TX: Field = 8;\nglobal MAX_PUBLIC_CALL_STACK_LENGTH_PER_TX: Field = 8;\nglobal MAX_NEW_L2_TO_L1_MSGS_PER_TX: Field = 2;\nglobal MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX: Field = 16;\nglobal MAX_PUBLIC_DATA_READS_PER_TX: Field = 16;\nglobal MAX_NEW_CONTRACTS_PER_TX: Field = 1;\nglobal MAX_OPTIONALLY_REVEALED_DATA_LENGTH_PER_TX: Field = 4;\nglobal MAX_READ_REQUESTS_PER_TX: Field = 128;\nglobal NUM_ENCRYPTED_LOGS_HASHES_PER_TX: Field = 1;\nglobal NUM_UNENCRYPTED_LOGS_HASHES_PER_TX: Field = 1;\n// docs:end:constants\n\n// ROLLUP CONTRACT CONSTANTS - constants used only in l1-contracts\nglobal NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP: Field = 16;\n\n// TREES RELATED CONSTANTS\nglobal VK_TREE_HEIGHT: Field = 3;\nglobal FUNCTION_TREE_HEIGHT: Field = 5;\nglobal CONTRACT_TREE_HEIGHT: Field = 16;\nglobal NOTE_HASH_TREE_HEIGHT: Field = 32;\nglobal PUBLIC_DATA_TREE_HEIGHT: Field = 40;\nglobal NULLIFIER_TREE_HEIGHT: Field = 20;\nglobal L1_TO_L2_MSG_TREE_HEIGHT: Field = 16;\nglobal ROLLUP_VK_TREE_HEIGHT: Field = 8;\n\n// SUB-TREES RELATED CONSTANTS\nglobal CONTRACT_SUBTREE_HEIGHT: Field = 0;\nglobal CONTRACT_SUBTREE_SIBLING_PATH_LENGTH: Field = 16;\nglobal NOTE_HASH_SUBTREE_HEIGHT: Field = 6;\nglobal NOTE_HASH_SUBTREE_SIBLING_PATH_LENGTH: Field = 26;\nglobal NULLIFIER_SUBTREE_HEIGHT: Field = 6;\nglobal PUBLIC_DATA_SUBTREE_HEIGHT: Field = 4;\nglobal ARCHIVE_HEIGHT: Field = 16;\nglobal NULLIFIER_SUBTREE_SIBLING_PATH_LENGTH: Field = 14;\nglobal PUBLIC_DATA_SUBTREE_SIBLING_PATH_LENGTH: Field = 36;\nglobal L1_TO_L2_MSG_SUBTREE_HEIGHT: Field = 4;\nglobal L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH: Field = 12;\n\n// MISC CONSTANTS\nglobal FUNCTION_SELECTOR_NUM_BYTES: Field = 4;\nglobal MAPPING_SLOT_PEDERSEN_SEPARATOR: Field = 4;\n// sha256 hash is stored in two fields to accommodate all 256-bits of the hash\nglobal NUM_FIELDS_PER_SHA256: Field = 2;\nglobal ARGS_HASH_CHUNK_LENGTH: u32 = 32;\nglobal ARGS_HASH_CHUNK_COUNT: u32 = 16;\n\n// NOIR CONSTANTS - constants used only in yarn-packages/noir-contracts\n// Some are defined here because Noir doesn't yet support globals referencing other globals yet.\n// Move these constants to a noir file once the issue bellow is resolved:\n// https://github.com/noir-lang/noir/issues/1734\nglobal L1_TO_L2_MESSAGE_LENGTH: Field = 8;\nglobal L1_TO_L2_MESSAGE_ORACLE_CALL_LENGTH: Field = 26;\nglobal MAX_NOTE_FIELDS_LENGTH: Field = 20;\n// GET_NOTE_ORACLE_RETURN_LENGT = MAX_NOTE_FIELDS_LENGTH + 1 + 2\n// The plus 1 is 1 extra field for nonce.\n// + 2 for EXTRA_DATA: [number_of_return_notes, contract_address]\nglobal GET_NOTE_ORACLE_RETURN_LENGTH: Field = 23;\nglobal MAX_NOTES_PER_PAGE: Field = 10;\n// VIEW_NOTE_ORACLE_RETURN_LENGTH = MAX_NOTES_PER_PAGE * (MAX_NOTE_FIELDS_LENGTH + 1) + 2;\nglobal VIEW_NOTE_ORACLE_RETURN_LENGTH: Field = 212;\nglobal CALL_CONTEXT_LENGTH: Field = 8;\nglobal BLOCK_HEADER_LENGTH: Field = 7;\nglobal FUNCTION_DATA_LENGTH: Field = 4;\nglobal CONTRACT_DEPLOYMENT_DATA_LENGTH: Field = 6;\n// Change this ONLY if you have changed the PrivateCircuitPublicInputs structure.\n// In other words, if the structure/size of the public inputs of a function call changes then we\n// should change this constant as well as the offsets in private_call_stack_item.nr\nglobal PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH: Field = 189;\nglobal CONTRACT_STORAGE_UPDATE_REQUEST_LENGTH: Field = 3;\nglobal CONTRACT_STORAGE_READ_LENGTH: Field = 2;\n// Change this ONLY if you have changed the PublicCircuitPublicInputs structure.\nglobal PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH: Field = 190;\nglobal GET_NOTES_ORACLE_RETURN_LENGTH: Field = 674;\nglobal CALL_PRIVATE_FUNCTION_RETURN_SIZE: Field = 195;\nglobal PUBLIC_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH: Field = 87;\nglobal PRIVATE_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH: Field = 177;\nglobal COMMITMENTS_NUM_BYTES_PER_BASE_ROLLUP: Field = 2048;\nglobal NULLIFIERS_NUM_BYTES_PER_BASE_ROLLUP: Field = 2048;\nglobal PUBLIC_DATA_WRITES_NUM_BYTES_PER_BASE_ROLLUP: Field = 1024;\nglobal CONTRACTS_NUM_BYTES_PER_BASE_ROLLUP: Field = 32;\nglobal CONTRACT_DATA_NUM_BYTES_PER_BASE_ROLLUP: Field = 64;\nglobal CONTRACT_DATA_NUM_BYTES_PER_BASE_ROLLUP_UNPADDED: Field = 52;\nglobal L2_TO_L1_MSGS_NUM_BYTES_PER_BASE_ROLLUP: Field = 64;\nglobal LOGS_HASHES_NUM_BYTES_PER_BASE_ROLLUP: Field = 64;\n\n/**\n * Enumerate the hash_indices which are used for pedersen hashing.\n * We start from 1 to avoid the default generators. The generator indices are listed\n * based on the number of elements each index hashes. The following conditions must be met:\n *\n * +-----------+-------------------------------+----------------------+\n * | Hash size | Number of elements hashed (n) | Condition to use |\n * |-----------+-------------------------------+----------------------|\n * | LOW | n ≤ 8 | 0 < hash_index ≤ 32 |\n * | MID | 8 < n ≤ 16 | 32 < hash_index ≤ 40 |\n * | HIGH | 16 < n ≤ 48 | 40 < hash_index ≤ 48 |\n * +-----------+-------------------------------+----------------------+\n *\n * Note: When modifying, modify `GeneratorIndexPacker` in packer.hpp accordingly.\n */\n// Indices with size ≤ 8\nglobal GENERATOR_INDEX__COMMITMENT = 1;\nglobal GENERATOR_INDEX__COMMITMENT_NONCE = 2;\nglobal GENERATOR_INDEX__UNIQUE_COMMITMENT = 3;\nglobal GENERATOR_INDEX__SILOED_COMMITMENT = 4;\nglobal GENERATOR_INDEX__NULLIFIER = 5;\nglobal GENERATOR_INDEX__INITIALIZATION_NULLIFIER = 6;\nglobal GENERATOR_INDEX__OUTER_NULLIFIER = 7;\nglobal GENERATOR_INDEX__PUBLIC_DATA_READ = 8;\nglobal GENERATOR_INDEX__PUBLIC_DATA_UPDATE_REQUEST = 9;\nglobal GENERATOR_INDEX__FUNCTION_DATA = 10;\nglobal GENERATOR_INDEX__FUNCTION_LEAF = 11;\nglobal GENERATOR_INDEX__CONTRACT_DEPLOYMENT_DATA = 12;\nglobal GENERATOR_INDEX__CONSTRUCTOR = 13;\nglobal GENERATOR_INDEX__CONSTRUCTOR_ARGS = 14;\nglobal GENERATOR_INDEX__CONTRACT_ADDRESS = 15;\nglobal GENERATOR_INDEX__CONTRACT_LEAF = 16;\nglobal GENERATOR_INDEX__CALL_CONTEXT = 17;\nglobal GENERATOR_INDEX__CALL_STACK_ITEM = 18;\nglobal GENERATOR_INDEX__CALL_STACK_ITEM_2 = 19;\nglobal GENERATOR_INDEX__L1_TO_L2_MESSAGE_SECRET = 20;\nglobal GENERATOR_INDEX__L2_TO_L1_MSG = 21;\nglobal GENERATOR_INDEX__TX_CONTEXT = 22;\nglobal GENERATOR_INDEX__PUBLIC_LEAF_INDEX = 23;\nglobal GENERATOR_INDEX__PUBLIC_DATA_LEAF = 24;\nglobal GENERATOR_INDEX__SIGNED_TX_REQUEST = 25;\nglobal GENERATOR_INDEX__GLOBAL_VARIABLES = 26;\nglobal GENERATOR_INDEX__PARTIAL_ADDRESS = 27;\nglobal GENERATOR_INDEX__BLOCK_HASH = 28;\nglobal GENERATOR_INDEX__SIDE_EFFECT = 29;\n// Indices with size ≤ 16\nglobal GENERATOR_INDEX__TX_REQUEST = 33;\nglobal GENERATOR_INDEX__SIGNATURE_PAYLOAD = 34;\n// Indices with size ≤ 44\nglobal GENERATOR_INDEX__VK = 41;\nglobal GENERATOR_INDEX__PRIVATE_CIRCUIT_PUBLIC_INPUTS = 42;\nglobal GENERATOR_INDEX__PUBLIC_CIRCUIT_PUBLIC_INPUTS = 43;\nglobal GENERATOR_INDEX__FUNCTION_ARGS = 44;\n",
1579
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/constants.nr"
1580
+ },
1581
+ "107": {
1582
+ "source": "use crate::address::{AztecAddress, EthAddress};\nuse crate::mocked::VerificationKey;\nuse crate::abis::function_selector::FunctionSelector;\nuse crate::abis::function_leaf_preimage::FunctionLeafPreimage;\nuse crate::abis::new_contract_data::NewContractData as ContractLeafPreimage;\nuse crate::abis::function_data::FunctionData;\nuse crate::abis::side_effect::{SideEffect};\nuse crate::utils::uint256::U256;\nuse crate::utils::bounded_vec::BoundedVec;\nuse crate::constants::{\n ARGS_HASH_CHUNK_COUNT,\n ARGS_HASH_CHUNK_LENGTH,\n CONTRACT_TREE_HEIGHT, \n FUNCTION_TREE_HEIGHT, \n NOTE_HASH_TREE_HEIGHT,\n NUM_FIELDS_PER_SHA256,\n GENERATOR_INDEX__SILOED_COMMITMENT,\n GENERATOR_INDEX__OUTER_NULLIFIER,\n GENERATOR_INDEX__VK,\n GENERATOR_INDEX__CONSTRUCTOR,\n GENERATOR_INDEX__PARTIAL_ADDRESS,\n GENERATOR_INDEX__CONTRACT_ADDRESS,\n GENERATOR_INDEX__COMMITMENT_NONCE,\n GENERATOR_INDEX__UNIQUE_COMMITMENT,\n GENERATOR_INDEX__FUNCTION_ARGS,\n};\n\nuse dep::std::hash::{pedersen_hash_with_separator, sha256};\n\npub fn sha256_to_field<N>(bytes_to_hash: [u8; N]) -> Field {\n let sha256_hashed = sha256(bytes_to_hash);\n\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (sha256_hashed[15 - i] as Field) * v;\n low = low + (sha256_hashed[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n let hash_in_a_field = low + high * v;\n\n hash_in_a_field\n}\n\npub fn hash_args<N>(args: [Field; N]) -> Field {\n if args.len() == 0 {\n 0\n } else {\n let mut chunks_hashes = [0; ARGS_HASH_CHUNK_COUNT];\n for i in 0..ARGS_HASH_CHUNK_COUNT {\n let mut chunk_hash = 0;\n let start_chunk_index = i * ARGS_HASH_CHUNK_LENGTH;\n if start_chunk_index < (args.len() as u32) {\n let mut chunk_args = [0; ARGS_HASH_CHUNK_LENGTH];\n for j in 0..ARGS_HASH_CHUNK_LENGTH {\n let item_index = i * ARGS_HASH_CHUNK_LENGTH + j;\n if item_index < (args.len() as u32) {\n chunk_args[j] = args[item_index];\n }\n }\n chunk_hash = pedersen_hash(chunk_args, GENERATOR_INDEX__FUNCTION_ARGS);\n }\n chunks_hashes[i] = chunk_hash;\n }\n pedersen_hash(chunks_hashes, GENERATOR_INDEX__FUNCTION_ARGS)\n }\n}\n\n// Checks that `value` is a member of a merkle tree with root `root` at position `index`\n// The witness being the `sibling_path`\npub fn assert_check_membership<N>(value: Field, index: Field, sibling_path: [Field; N], root: Field) {\n let calculated_root = root_from_sibling_path(value, index, sibling_path);\n assert(calculated_root == root, \"membership check failed\");\n}\n\n// Calculate the Merkle tree root from the sibling path and leaf.\n//\n// The leaf is hashed with its sibling, and then the result is hashed\n// with the next sibling etc in the path. The last hash is the root.\n//\n// TODO(David/Someone): The cpp code is using a uint256, whereas its\n// TODO a bit simpler in Noir to just have a bit array.\n// TODO: I'd generally like to avoid u256 for algorithms like \n// this because it means we never even need to consider cases where \n// the index is greater than p.\npub fn root_from_sibling_path<N>(leaf: Field, leaf_index: Field, sibling_path: [Field; N]) -> Field {\n let mut node = leaf;\n let indices = leaf_index.to_le_bits(N);\n\n for i in 0..N {\n let (hash_left, hash_right) = if indices[i] == 1 {\n (sibling_path[i], node)\n } else {\n (node, sibling_path[i])\n };\n node = merkle_hash(hash_left, hash_right);\n }\n node\n}\n\n// Calculate the function tree root from the sibling path and leaf preimage.\n//\n// TODO: The cpp code passes in components of the FunctionLeafPreimage and then \n// builds it up. We should build it up and then pass the leaf preimage as a parameter.\n// We can then choose to have a general method that takes in anything hashable\n// and deduplicate the logic in `contract_tree_root_from_siblings`\npub fn function_tree_root_from_siblings(\n selector: FunctionSelector,\n is_internal: bool,\n is_private: bool,\n vk_hash: Field,\n acir_hash: Field,\n function_leaf_index: Field,\n function_leaf_sibling_path: [Field; FUNCTION_TREE_HEIGHT]\n) -> Field {\n let function_leaf_preimage = FunctionLeafPreimage { selector, is_internal, is_private, vk_hash, acir_hash };\n\n let function_leaf = function_leaf_preimage.hash();\n\n let function_tree_root = root_from_sibling_path(function_leaf, function_leaf_index, function_leaf_sibling_path);\n\n function_tree_root\n}\n\n// Calculate the contract tree root from the sibling path and leaf preimage.\npub fn contract_tree_root_from_siblings(\n function_tree_root: Field,\n storage_contract_address: AztecAddress,\n portal_contract_address: EthAddress,\n contract_leaf_index: Field,\n contract_leaf_sibling_path: [Field; CONTRACT_TREE_HEIGHT]\n) -> Field {\n //TODO(Kev): if we use shorthand syntax here, we get an error as expected,\n // since variable name is `storage_contract_address` but the span is incorrect.\n let contract_leaf_preimage = ContractLeafPreimage { contract_address: storage_contract_address, portal_contract_address, function_tree_root };\n\n let contract_leaf = contract_leaf_preimage.hash();\n\n let computed_contract_tree_root = root_from_sibling_path(contract_leaf, contract_leaf_index, contract_leaf_sibling_path);\n\n computed_contract_tree_root\n}\n\npub fn read_request_root_from_siblings(\n read_request: Field,\n leaf_index: Field,\n sibling_path: [Field; NOTE_HASH_TREE_HEIGHT]\n) -> Field {\n root_from_sibling_path(read_request, leaf_index, sibling_path)\n}\n\npub fn silo_commitment(address: AztecAddress, inner_commitment: Field) -> Field {\n pedersen_hash(\n [\n address.to_field(),\n inner_commitment\n ],\n GENERATOR_INDEX__SILOED_COMMITMENT\n )\n}\n\npub fn silo_nullifier(address: AztecAddress, nullifier: Field) -> Field {\n pedersen_hash(\n [\n address.to_field(),\n nullifier\n ],\n GENERATOR_INDEX__OUTER_NULLIFIER\n )\n}\n\nfn merkle_hash(left: Field, right: Field) -> Field {\n pedersen_hash([left, right], 0)\n}\n\npub fn stdlib_recursion_verification_key_compress_native_vk(_vk: VerificationKey) -> Field {\n // Original cpp code\n // stdlib::recursion::verification_key<CT::bn254>::compress_native(private_call.vk, GeneratorIndex::VK);\n // The above cpp method is only ever called on verification key, so it has been special cased here\n let _hash_index = GENERATOR_INDEX__VK;\n 0\n}\n\n// TODO CPP uses blake2s for this\npub fn compute_new_contract_address_hash(new_contract_address: AztecAddress) -> Field {\n dep::std::hash::pedersen_hash([new_contract_address.to_field()])\n}\n\npub fn compute_l2_to_l1_hash(\n contract_address: AztecAddress,\n rollup_version_id: Field,\n portal_contract_address: EthAddress,\n chain_id: Field,\n content: Field\n) -> Field {\n let mut bytes: BoundedVec<u8, 160> = BoundedVec::new(0);\n\n let inputs = [\n contract_address.to_field(), rollup_version_id, portal_contract_address.to_field(), chain_id, content\n ];\n for i in 0..inputs.len() {\n // TODO are bytes be in fr.to_buffer() ?\n let item_bytes = inputs[i].to_be_bytes(32);\n for j in 0..32 {\n bytes.push(item_bytes[j]);\n }\n }\n\n sha256_to_field(bytes.storage)\n}\n\npub fn compute_constructor_hash(\n function_data: FunctionData,\n args_hash: Field,\n constructor_vk_hash: Field\n) -> Field {\n let function_data_hash = function_data.hash();\n\n pedersen_hash(\n [\n function_data_hash,\n args_hash,\n constructor_vk_hash\n ],\n GENERATOR_INDEX__CONSTRUCTOR\n )\n}\n\n// Computes sha256 hash of 2 input hashes stored in 4 fields.\n// \n// This method is bn254 specific. Two fields is needed in order to \n// encode the sha256 output. It can be abstracted away with any 4-2 hash function.\n//\n// TODO(Jan and David): This is used for the encrypted_log hashes.\n// Can we check to see if we can just use hash_to_field or pedersen_compress here?\n//\n// Returning a Field would be desirable because then this can be replaced with \n// poseidon without changing the rest of the code\n//\npub fn accumulate_sha256(input: [U128; 4]) -> [Field; NUM_FIELDS_PER_SHA256] {\n // This is a note about the cpp code, since it takes an array of Fields\n // instead of a U128.\n // 4 Field elements when converted to bytes will usually \n // occupy 4 * 32 = 128 bytes.\n // However, this function is making the assumption that each Field \n // only occupies 128 bits.\n //\n // TODO(David): This does not seem to be getting guaranteed anywhere in the code?\n //\n // Concatenate 4 u128 bit integers into a byte array.\n let mut hash_input_flattened = [0; 64];\n for offset in 0..4 {\n let input_as_bytes = input[offset].to_be_bytes();\n for byte_index in 0..16 {\n hash_input_flattened[offset * 16 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n let sha_digest = dep::std::hash::sha256(hash_input_flattened);\n\n U256::from_bytes32(sha_digest).to_u128_limbs()\n}\n\npub fn compute_logs_hash(\n previous_log_hash: [Field; 2],\n current_log_hash: [Field; 2]\n) -> [Field; NUM_FIELDS_PER_SHA256] {\n accumulate_sha256(\n [\n U128::from_integer(previous_log_hash[0]),\n U128::from_integer(previous_log_hash[1]),\n U128::from_integer(current_log_hash[0]),\n U128::from_integer(current_log_hash[1])\n ]\n )\n}\n\npub fn compute_commitment_nonce(first_nullifier: Field, commitment_index: Field) -> Field {\n pedersen_hash(\n [\n first_nullifier,\n commitment_index\n ],\n GENERATOR_INDEX__COMMITMENT_NONCE\n )\n}\n\npub fn compute_unique_siloed_commitment(nonce: Field, siloed_commitment: Field) -> Field {\n pedersen_hash(\n [\n nonce,\n siloed_commitment\n ],\n GENERATOR_INDEX__UNIQUE_COMMITMENT\n )\n}\n\npub fn compute_unique_siloed_commitments<N>(\n first_nullifier: Field,\n siloed_commitments: [SideEffect; N]\n) -> [SideEffect; N] {\n let mut unique_siloed_commitments = [SideEffect::empty(); N];\n for i in 0..N {\n let siloed_commitment = siloed_commitments[i];\n if siloed_commitment.value != 0 {\n let nonce = compute_commitment_nonce(first_nullifier, i);\n unique_siloed_commitments[i] = SideEffect {\n value: compute_unique_siloed_commitment(nonce, siloed_commitment.value),\n counter: siloed_commitment.counter\n };\n }\n }\n unique_siloed_commitments\n}\n\npub fn pedersen_hash<N>(inputs: [Field; N], hash_index: u32) -> Field {\n dep::std::hash::pedersen_hash_with_separator(inputs, hash_index)\n}\n",
1583
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/hash.nr"
1584
+ },
1585
+ "123": {
1586
+ "source": "use crate::{\n constants::{\n GENERATOR_INDEX__CONTRACT_ADDRESS,\n GENERATOR_INDEX__PARTIAL_ADDRESS,\n },\n hash::pedersen_hash,\n utils,\n grumpkin_point::GrumpkinPoint,\n};\nuse dep::std::cmp::Eq;\nuse crate::traits::{Empty, ToField};\n\n// Aztec address\nstruct AztecAddress {\n inner : Field\n}\n\nimpl Eq for AztecAddress {\n fn eq(self, other : Self) -> bool {\n self.to_field() == other.to_field()\n }\n}\n\nimpl Empty for AztecAddress {\n fn empty() -> Self {\n Self {\n inner : 0\n }\n }\n}\n\nimpl ToField for AztecAddress {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl AztecAddress {\n pub fn zero() -> Self {\n Self {\n inner: 0\n }\n }\n\n pub fn from_field(field : Field) -> Self {\n Self {\n inner : field\n }\n }\n\n pub fn compute(pub_key: GrumpkinPoint, partial_address: PartialAddress) -> AztecAddress {\n AztecAddress::from_field(\n pedersen_hash(\n [pub_key.x, pub_key.y, partial_address.to_field()],\n GENERATOR_INDEX__CONTRACT_ADDRESS\n )\n )\n }\n\n pub fn is_zero(self) -> bool {\n self.inner == 0\n }\n \n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n\n pub fn conditional_assign(predicate: bool, lhs : Self, rhs : Self) -> Self{\n let result = utils::conditional_assign(predicate, rhs.to_field(), lhs.to_field());\n Self {\n inner : result\n }\n }\n\n pub fn serialize(self: Self) -> [Field; 1] {\n [self.inner]\n }\n\n pub fn deserialize(fields: [Field; 1]) -> Self {\n Self {\n inner: fields[0]\n }\n }\n}\n\nstruct EthAddress{\n inner : Field\n}\n\nimpl Eq for EthAddress {\n fn eq(self, other : Self) -> bool {\n self.to_field() == other.to_field()\n }\n}\n\nimpl Empty for EthAddress {\n fn empty() -> Self {\n Self {\n inner : 0\n }\n }\n}\n\nimpl ToField for EthAddress {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl EthAddress{\n pub fn zero() -> Self {\n Self {\n inner: 0\n }\n }\n\n pub fn from_field(field : Field) -> Self {\n Self {\n inner : field\n }\n }\n\n pub fn is_zero(self) -> bool {\n self.inner == 0\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n\n pub fn conditional_assign(predicate: bool, lhs : Self, rhs : Self) -> Self{\n let result = utils::conditional_assign(predicate, rhs.to_field(), lhs.to_field());\n Self {\n inner : result\n }\n }\n\n pub fn serialize(self: Self) -> [Field; 1] {\n [self.inner]\n }\n\n pub fn deserialize(fields: [Field; 1]) -> Self {\n Self {\n inner: fields[0]\n }\n }\n}\n\n// Partial address\nstruct PartialAddress {\n inner : Field\n}\n\nimpl ToField for PartialAddress {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl PartialAddress {\n pub fn from_field(field : Field) -> Self {\n Self {\n inner : field\n }\n }\n\n pub fn compute(contract_address_salt : Field, function_tree_root : Field, constructor_hash : Field) -> Self {\n PartialAddress::from_field(\n pedersen_hash([\n // TODO why the zeroes?\n 0,\n 0,\n contract_address_salt,\n function_tree_root,\n constructor_hash\n ], GENERATOR_INDEX__PARTIAL_ADDRESS)\n )\n }\n\n pub fn to_field(self) -> Field {\n self.inner\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n}\n",
1587
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/address.nr"
1588
+ },
1589
+ "128": {
1590
+ "source": "use crate::address::EthAddress;\nuse crate::constants::{\n CONTRACT_DEPLOYMENT_DATA_LENGTH,\n GENERATOR_INDEX__CONTRACT_DEPLOYMENT_DATA,\n};\nuse crate::hash::pedersen_hash;\nuse crate::grumpkin_point::GrumpkinPoint;\nuse crate::traits::Hash;\n\n// docs:start:contract-deployment-data\nstruct ContractDeploymentData {\n deployer_public_key : GrumpkinPoint,\n constructor_vk_hash : Field,\n function_tree_root : Field,\n contract_address_salt : Field,\n portal_contract_address : EthAddress,\n}\n// docs:end:contract-deployment-data\n\nimpl Hash for ContractDeploymentData {\n fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__CONTRACT_DEPLOYMENT_DATA)\n }\n}\n\nimpl ContractDeploymentData {\n fn serialize(self) -> [Field; CONTRACT_DEPLOYMENT_DATA_LENGTH] {\n [\n self.deployer_public_key.x,\n self.deployer_public_key.y,\n self.constructor_vk_hash,\n self.function_tree_root,\n self.contract_address_salt,\n self.portal_contract_address.to_field(),\n ]\n }\n\n fn assert_is_zero(self) {\n self.deployer_public_key.assert_is_zero();\n assert(self.constructor_vk_hash == 0);\n assert(self.function_tree_root == 0);\n assert(self.contract_address_salt == 0);\n self.portal_contract_address.assert_is_zero();\n }\n\n}\n",
1591
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/contrakt/deployment_data.nr"
1592
+ },
1593
+ "129": {
1594
+ "source": "use crate::{\n constants::{\n CONTRACT_STORAGE_UPDATE_REQUEST_LENGTH,\n GENERATOR_INDEX__PUBLIC_DATA_UPDATE_REQUEST,\n },\n hash::pedersen_hash,\n};\nuse dep::std::cmp::Eq;\nuse crate::traits::{Hash, Empty};\n\nstruct StorageUpdateRequest{\n storage_slot : Field,\n old_value : Field,\n new_value : Field,\n}\n\nimpl Eq for StorageUpdateRequest {\n fn eq(self, request: Self) -> bool {\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/3595)\n (request.storage_slot == self.storage_slot)\n & (request.old_value == self.old_value)\n & (request.new_value == self.new_value)\n }\n}\n\nimpl Empty for StorageUpdateRequest {\n fn empty() -> Self {\n StorageUpdateRequest {\n storage_slot: 0,\n old_value: 0,\n new_value: 0,\n }\n }\n}\n\nimpl Hash for StorageUpdateRequest {\n fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__PUBLIC_DATA_UPDATE_REQUEST)\n }\n}\n\nimpl StorageUpdateRequest {\n pub fn serialize(self) -> [Field; CONTRACT_STORAGE_UPDATE_REQUEST_LENGTH] {\n [self.storage_slot, self.old_value, self.new_value]\n }\n\n pub fn is_empty(self) -> bool {\n self.storage_slot == 0\n }\n}\n",
1595
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/contrakt/storage_update_request.nr"
1596
+ },
1597
+ "130": {
1598
+ "source": "use crate::{\n constants::{\n CONTRACT_STORAGE_READ_LENGTH,\n GENERATOR_INDEX__PUBLIC_DATA_READ,\n },\n hash::pedersen_hash,\n};\nuse crate::traits::Empty;\n\nstruct StorageRead {\n storage_slot: Field,\n current_value: Field,\n}\n\nimpl Empty for StorageRead { \n fn empty() -> Self {\n Self {\n storage_slot: 0,\n current_value: 0,\n }\n }\n}\n\nimpl StorageRead {\n\n pub fn serialize(self) -> [Field; CONTRACT_STORAGE_READ_LENGTH] {\n [self.storage_slot, self.current_value]\n }\n\n pub fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__PUBLIC_DATA_READ)\n }\n\n pub fn is_empty(self) -> bool {\n self.storage_slot == 0\n }\n}\n",
1599
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/contrakt/storage_read.nr"
1600
+ },
1601
+ "138": {
1602
+ "source": "use crate::abis::{\n function_data::FunctionData,\n private_circuit_public_inputs::PrivateCircuitPublicInputs,\n public_circuit_public_inputs::PublicCircuitPublicInputs,\n};\nuse crate::address::AztecAddress;\nuse crate::constants::{\n GENERATOR_INDEX__CALL_STACK_ITEM,\n};\nuse crate::traits::Hash;\n\nstruct PrivateCallStackItem {\n // This is the _actual_ contract address relating to where this function's code resides in the\n // contract tree. Regardless of whether this is a call or delegatecall, this\n // `contract_address` _does not change_. Amongst other things, it's used as a lookup for\n // getting the correct code from the tree. There is a separate `storage_contract_address`\n // within a CallStackItem which varies depending on whether this is a call or delegatecall.\n contract_address: AztecAddress,\n public_inputs: PrivateCircuitPublicInputs,\n function_data: FunctionData,\n // Not really needed for PrivateCallStackItem.\n is_execution_request: bool,\n}\n\nimpl Hash for PrivateCallStackItem {\n fn hash(self) -> Field {\n dep::std::hash::pedersen_hash_with_separator([\n self.contract_address.to_field(),\n self.function_data.hash(),\n self.public_inputs.hash(),\n ], GENERATOR_INDEX__CALL_STACK_ITEM)\n }\n}\n\nstruct PublicCallStackItem {\n contract_address: AztecAddress,\n public_inputs: PublicCircuitPublicInputs,\n function_data: FunctionData,\n // True if this call stack item represents a request to execute a function rather than a\n // fulfilled execution. Used when enqueuing calls from private to public functions.\n is_execution_request: bool,\n}\n\nimpl Hash for PublicCallStackItem {\n fn hash(self) -> Field {\n let item = if self.is_execution_request {\n self.as_execution_request()\n } else {\n self\n };\n\n dep::std::hash::pedersen_hash_with_separator([\n item.contract_address.to_field(),\n item.function_data.hash(),\n item.public_inputs.hash(),\n ], GENERATOR_INDEX__CALL_STACK_ITEM)\n }\n}\n\nimpl PublicCallStackItem {\n fn as_execution_request(self) -> Self {\n let public_inputs = self.public_inputs;\n let mut request_public_inputs: PublicCircuitPublicInputs = dep::std::unsafe::zeroed();\n request_public_inputs.call_context = public_inputs.call_context;\n request_public_inputs.args_hash = public_inputs.args_hash;\n\n let call_stack_item = PublicCallStackItem {\n contract_address: self.contract_address,\n function_data: self.function_data,\n is_execution_request: true,\n public_inputs: request_public_inputs,\n };\n call_stack_item\n }\n}\n",
1603
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/call_stack_item.nr"
1604
+ },
1605
+ "143": {
1606
+ "source": "use crate::constants::{GENERATOR_INDEX__SIDE_EFFECT};\nuse dep::std::cmp::Eq;\nuse crate::traits::{Empty, Hash};\n\ntrait Ordered {\n fn counter(self) -> u32;\n}\n\nstruct SideEffect{\n value: Field,\n counter: u32,\n}\n\nimpl Ordered for SideEffect {\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl Eq for SideEffect {\n fn eq(self, side_effect: SideEffect) -> bool {\n (self.value == side_effect.value)\n & (self.counter == side_effect.counter)\n }\n}\n\nimpl Empty for SideEffect {\n fn empty() -> Self {\n SideEffect {\n value: 0,\n counter: 0,\n }\n }\n}\n\nimpl Hash for SideEffect {\n fn hash(self) -> Field {\n dep::std::hash::pedersen_hash_with_separator(\n self.serialize() , GENERATOR_INDEX__SIDE_EFFECT)\n }\n}\n\nimpl SideEffect {\n pub fn serialize(self) -> [Field; 2] {\n [self.value, self.counter as Field]\n }\n\n pub fn deserialise(values: [Field; 2]) -> Self {\n Self {\n value: values[0],\n counter: values[1] as u32,\n }\n }\n\n pub fn is_empty(self) -> bool {\n (self.value == 0)\n & (self.counter == 0)\n }\n}\n\nstruct SideEffectLinkedToNoteHash{\n value: Field,\n note_hash: Field,\n counter: u32,\n}\n\nimpl Ordered for SideEffectLinkedToNoteHash {\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl Eq for SideEffectLinkedToNoteHash {\n fn eq(self, side_effect: SideEffectLinkedToNoteHash) -> bool {\n (self.value == side_effect.value)\n & (self.note_hash == side_effect.note_hash) \n & (self.counter == side_effect.counter)\n }\n}\n\nimpl Empty for SideEffectLinkedToNoteHash {\n fn empty() -> Self {\n SideEffectLinkedToNoteHash {\n value: 0,\n note_hash: 0,\n counter: 0,\n }\n }\n}\n\nimpl Hash for SideEffectLinkedToNoteHash {\n fn hash(self) -> Field {\n dep::std::hash::pedersen_hash_with_separator(\n self.serialize(),\n GENERATOR_INDEX__SIDE_EFFECT)\n }\n}\n\nimpl SideEffectLinkedToNoteHash{\n pub fn serialize(self) -> [Field; 3] {\n [self.value, self.note_hash, self.counter as Field]\n }\n\n pub fn deserialise(values: [Field; 3]) -> Self {\n Self {\n value: values[0],\n note_hash: values[1],\n counter: values[2] as u32,\n }\n }\n\n pub fn is_empty(self) -> bool {\n (self.value == 0)\n & (self.note_hash == 0)\n & (self.counter == 0)\n }\n}\n\n",
1607
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/side_effect.nr"
1608
+ },
1609
+ "146": {
1610
+ "source": "use crate::constants::{\n MAX_NEW_L2_TO_L1_MSGS_PER_CALL,\n MAX_NEW_NULLIFIERS_PER_CALL,\n MAX_NEW_COMMITMENTS_PER_CALL,\n MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL,\n MAX_PUBLIC_DATA_READS_PER_CALL,\n MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL,\n NUM_FIELDS_PER_SHA256,\n RETURN_VALUES_LENGTH,\n GENERATOR_INDEX__PUBLIC_CIRCUIT_PUBLIC_INPUTS,\n PUBLIC_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH,\n PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH,\n};\nuse crate::{\n abis::{\n call_context::CallContext,\n side_effect::{SideEffect, SideEffectLinkedToNoteHash},\n block_header::BlockHeader,\n },\n address::AztecAddress,\n contrakt::{\n storage_read::StorageRead,\n storage_update_request::StorageUpdateRequest,\n },\n utils::bounded_vec::BoundedVec,\n};\n\nstruct PublicCircuitPublicInputs{\n call_context: CallContext,\n\n args_hash: Field,\n return_values: [Field; RETURN_VALUES_LENGTH],\n\n contract_storage_update_requests: [StorageUpdateRequest; MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL],\n contract_storage_reads: [StorageRead; MAX_PUBLIC_DATA_READS_PER_CALL],\n\n // todo: add sideeffect ranges for the input to these hashes\n public_call_stack_hashes: [Field; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL],\n new_commitments: [SideEffect; MAX_NEW_COMMITMENTS_PER_CALL],\n new_nullifiers: [SideEffectLinkedToNoteHash; MAX_NEW_NULLIFIERS_PER_CALL],\n new_l2_to_l1_msgs: [Field; MAX_NEW_L2_TO_L1_MSGS_PER_CALL],\n\n unencrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n\n // Here so that the gas cost of this request can be measured by circuits, without actually needing to feed in the\n // variable-length data.\n unencrypted_log_preimages_length: Field,\n\n block_header: BlockHeader,\n\n prover_address: AztecAddress,\n}\n\nimpl PublicCircuitPublicInputs{\n fn hash(self) -> Field { \n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/3595) have mercy por favor \n let mut inputs: BoundedVec<Field, PUBLIC_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH> = BoundedVec::new(0);\n inputs.push(self.call_context.hash());\n inputs.push(self.args_hash);\n inputs.push_array(self.return_values);\n for i in 0..MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL {\n inputs.push(self.contract_storage_update_requests[i].hash());\n }\n for i in 0..MAX_PUBLIC_DATA_READS_PER_CALL {\n inputs.push(self.contract_storage_reads[i].hash());\n }\n inputs.push_array(self.public_call_stack_hashes);\n\n for i in 0..MAX_NEW_COMMITMENTS_PER_CALL{\n inputs.push(self.new_commitments[i].hash());\n }\n for i in 0..MAX_NEW_NULLIFIERS_PER_CALL{\n inputs.push(self.new_nullifiers[i].hash());\n }\n inputs.push_array(self.new_l2_to_l1_msgs);\n inputs.push_array(self.unencrypted_logs_hash);\n inputs.push(self.unencrypted_log_preimages_length);\n inputs.push_array(self.block_header.serialize());\n inputs.push(self.prover_address.to_field());\n\n assert_eq(inputs.len(), PUBLIC_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH, \"Incorrect number of input fields when hashing PublicCircuitPublicInputs\");\n\n dep::std::hash::pedersen_hash_with_separator(inputs.storage, GENERATOR_INDEX__PUBLIC_CIRCUIT_PUBLIC_INPUTS)\n }\n\n pub fn serialize(self) -> [Field; PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH] {\n let mut fields: BoundedVec<Field, PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH> = BoundedVec::new(0); \n fields.push_array(self.call_context.serialize()); \n fields.push(self.args_hash);\n fields.push_array(self.return_values);\n for i in 0..MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL {\n fields.push_array(self.contract_storage_update_requests[i].serialize());\n }\n for i in 0..MAX_PUBLIC_DATA_READS_PER_CALL {\n fields.push_array(self.contract_storage_reads[i].serialize());\n }\n fields.push_array(self.public_call_stack_hashes);\n\n for i in 0..MAX_NEW_COMMITMENTS_PER_CALL{\n fields.push_array(self.new_commitments[i].serialize());\n }\n for i in 0..MAX_NEW_NULLIFIERS_PER_CALL{\n fields.push_array(self.new_nullifiers[i].serialize());\n }\n fields.push_array(self.new_l2_to_l1_msgs);\n fields.push_array(self.unencrypted_logs_hash);\n fields.push(self.unencrypted_log_preimages_length);\n fields.push_array(self.block_header.serialize());\n fields.push(self.prover_address.to_field());\n fields.storage\n }\n}\n",
1611
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/public_circuit_public_inputs.nr"
1612
+ },
1613
+ "148": {
1614
+ "source": "use crate::{\n abis::{\n call_context::CallContext,\n block_header::BlockHeader,\n side_effect::{SideEffect, SideEffectLinkedToNoteHash},\n },\n contrakt::deployment_data::ContractDeploymentData,\n hash::{\n pedersen_hash,\n },\n utils::bounded_vec::BoundedVec,\n};\nuse crate::constants::{\n MAX_READ_REQUESTS_PER_CALL,\n MAX_NEW_COMMITMENTS_PER_CALL,\n MAX_NEW_NULLIFIERS_PER_CALL,\n MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL,\n MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL,\n MAX_NEW_L2_TO_L1_MSGS_PER_CALL,\n NUM_FIELDS_PER_SHA256,\n RETURN_VALUES_LENGTH,\n PRIVATE_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH,\n PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH,\n GENERATOR_INDEX__PRIVATE_CIRCUIT_PUBLIC_INPUTS,\n};\nuse crate::traits::Hash;\n\nstruct PrivateCircuitPublicInputs {\n call_context: CallContext,\n \n args_hash: Field,\n return_values: [Field; RETURN_VALUES_LENGTH],\n\n read_requests: [SideEffect; MAX_READ_REQUESTS_PER_CALL],\n\n new_commitments: [SideEffect; MAX_NEW_COMMITMENTS_PER_CALL],\n new_nullifiers: [SideEffectLinkedToNoteHash; MAX_NEW_NULLIFIERS_PER_CALL],\n private_call_stack_hashes: [Field; MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL],\n public_call_stack_hashes: [Field; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL],\n new_l2_to_l1_msgs: [Field; MAX_NEW_L2_TO_L1_MSGS_PER_CALL],\n end_side_effect_counter : u32,\n\n encrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n unencrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n\n // Here so that the gas cost of this request can be measured by circuits, without actually needing to feed in the\n // variable-length data.\n encrypted_log_preimages_length: Field,\n unencrypted_log_preimages_length: Field,\n\n block_header: BlockHeader,\n\n contract_deployment_data: ContractDeploymentData,\n\n chain_id: Field,\n version: Field,\n}\n\nimpl Hash for PrivateCircuitPublicInputs {\n fn hash(self) -> Field {\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/3595)\n let mut fields: BoundedVec<Field, PRIVATE_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH> = BoundedVec::new(0); \n fields.push(self.call_context.hash());\n fields.push(self.args_hash);\n fields.push_array(self.return_values);\n\n for i in 0..MAX_READ_REQUESTS_PER_CALL{\n fields.push_array(self.read_requests[i].serialize());\n }\n for i in 0..MAX_NEW_COMMITMENTS_PER_CALL{\n fields.push_array(self.new_commitments[i].serialize());\n }\n for i in 0..MAX_NEW_NULLIFIERS_PER_CALL{\n fields.push_array(self.new_nullifiers[i].serialize());\n }\n fields.push_array(self.private_call_stack_hashes);\n fields.push_array(self.public_call_stack_hashes);\n fields.push_array(self.new_l2_to_l1_msgs);\n fields.push(self.end_side_effect_counter as Field);\n fields.push_array(self.encrypted_logs_hash);\n fields.push_array(self.unencrypted_logs_hash);\n fields.push(self.encrypted_log_preimages_length);\n fields.push(self.unencrypted_log_preimages_length);\n fields.push_array(self.block_header.serialize());\n fields.push(self.contract_deployment_data.hash());\n fields.push(self.chain_id);\n fields.push(self.version);\n\n assert_eq(fields.len(), PRIVATE_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH, \"Incorrect number of input fields when hashing PrivateCircuitPublicInputs\");\n\n pedersen_hash(fields.storage, GENERATOR_INDEX__PRIVATE_CIRCUIT_PUBLIC_INPUTS)\n }\n}\n\nimpl PrivateCircuitPublicInputs {\n fn serialize(self) -> [Field; PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH] {\n let mut fields: BoundedVec<Field, PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH> = BoundedVec::new(0); \n fields.push_array(self.call_context.serialize());\n fields.push(self.args_hash);\n fields.push_array(self.return_values);\n\n for i in 0..MAX_READ_REQUESTS_PER_CALL{\n fields.push_array(self.read_requests[i].serialize());\n }\n for i in 0..MAX_NEW_COMMITMENTS_PER_CALL{\n fields.push_array(self.new_commitments[i].serialize());\n }\n for i in 0..MAX_NEW_NULLIFIERS_PER_CALL{\n fields.push_array(self.new_nullifiers[i].serialize());\n }\n fields.push_array(self.private_call_stack_hashes);\n fields.push_array(self.public_call_stack_hashes);\n fields.push_array(self.new_l2_to_l1_msgs);\n fields.push(self.end_side_effect_counter as Field);\n fields.push_array(self.encrypted_logs_hash);\n fields.push_array(self.unencrypted_logs_hash);\n fields.push(self.encrypted_log_preimages_length);\n fields.push(self.unencrypted_log_preimages_length);\n fields.push_array(self.block_header.serialize());\n fields.push_array(self.contract_deployment_data.serialize());\n fields.push(self.chain_id);\n fields.push(self.version);\n\n assert_eq(fields.len(), PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH);\n\n fields.storage\n }\n}\n\n#[test]\nfn serialization_smoke() {\n let pcpi: PrivateCircuitPublicInputs = dep::std::unsafe::zeroed();\n let _serialized = pcpi.serialize();\n}\n\n#[test]\nfn hash_smoke() {\n let pcpi: PrivateCircuitPublicInputs = dep::std::unsafe::zeroed();\n let _hashed = pcpi.hash();\n}\n",
1615
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/private_circuit_public_inputs.nr"
1616
+ },
1617
+ "151": {
1618
+ "source": "use crate::abis::function_selector::FunctionSelector;\nuse crate::constants::GENERATOR_INDEX__FUNCTION_DATA;\n\nstruct FunctionData {\n // First four bytes of the abi encoding \n // of a function. \n selector : FunctionSelector,\n is_internal : bool,\n is_private : bool,\n is_constructor : bool,\n}\n\nimpl FunctionData {\n // A field is ~256 bits\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/3057): Since, function data can fit into a Field,\n // This method will simply return a bit packed Field instead of hashing\n fn hash(self) -> Field {\n dep::std::hash::pedersen_hash_with_separator([\n self.selector.to_field(),\n self.is_internal as Field,\n self.is_private as Field,\n self.is_constructor as Field,\n ], GENERATOR_INDEX__FUNCTION_DATA)\n }\n}\n",
1619
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/function_data.nr"
1620
+ },
1621
+ "156": {
1622
+ "source": "use crate::{\n abis::function_selector::FunctionSelector,\n address::{EthAddress,AztecAddress},\n constants::{\n CALL_CONTEXT_LENGTH,\n GENERATOR_INDEX__CALL_CONTEXT,\n },\n hash::pedersen_hash,\n};\nuse dep::std::cmp::Eq;\nuse crate::traits::Hash;\n\n// docs:start:call-context\nstruct CallContext {\n msg_sender : AztecAddress,\n storage_contract_address : AztecAddress,\n portal_contract_address : EthAddress,\n\n function_selector : FunctionSelector,\n\n is_delegate_call : bool,\n is_static_call : bool,\n is_contract_deployment : bool,\n\n start_side_effect_counter : u32,\n}\n// docs:end:call-context\n\nimpl Eq for CallContext {\n fn eq(self, call_context: CallContext) -> bool {\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/3595)\n call_context.msg_sender.eq(self.msg_sender)\n & call_context.storage_contract_address.eq(self.storage_contract_address)\n & call_context.portal_contract_address.eq(self.portal_contract_address)\n & call_context.function_selector.eq(self.function_selector)\n & (call_context.is_delegate_call == self.is_delegate_call)\n & (call_context.is_static_call == self.is_static_call)\n & (call_context.is_contract_deployment == self.is_contract_deployment)\n & (call_context.start_side_effect_counter == self.start_side_effect_counter)\n }\n}\n\nimpl Hash for CallContext {\n fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__CALL_CONTEXT)\n }\n}\n\nimpl CallContext {\n fn serialize(self) -> [Field; CALL_CONTEXT_LENGTH] {\n [\n self.msg_sender.to_field(),\n self.storage_contract_address.to_field(),\n self.portal_contract_address.to_field(),\n self.function_selector.to_field(),\n self.is_delegate_call as Field,\n self.is_static_call as Field,\n self.is_contract_deployment as Field,\n self.start_side_effect_counter as Field,\n ]\n }\n\n fn assert_is_zero(self) {\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/3595)\n assert(self.msg_sender.to_field() == 0);\n assert(self.storage_contract_address.to_field() == 0);\n assert(self.portal_contract_address.to_field() == 0);\n assert(self.function_selector.to_field() == 0);\n assert(self.is_delegate_call == false);\n assert(self.is_static_call == false);\n assert(self.is_contract_deployment == false);\n assert(self.start_side_effect_counter == 0);\n }\n}\n",
1623
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/call_context.nr"
1624
+ },
1625
+ "162": {
1626
+ "source": "use crate::utils::field::field_from_bytes;\nuse dep::std::cmp::Eq;\n\nglobal SELECTOR_SIZE = 4;\n\nstruct FunctionSelector {\n // 1st 4-bytes of abi-encoding of function.\n inner: u32,\n}\n\nimpl Eq for FunctionSelector {\n fn eq(self, function_selector: FunctionSelector) -> bool {\n function_selector.inner == self.inner\n }\n}\n\nimpl FunctionSelector {\n fn to_field(self) -> Field {\n self.inner as Field\n }\n\n pub fn from_u32(value: u32) -> Self {\n Self {\n inner : value,\n }\n }\n\n pub fn from_field(value : Field) -> Self {\n Self {\n inner : value as u32,\n }\n }\n\n pub fn from_signature<N>(signature: str<N>) -> Self {\n let bytes = signature.as_bytes();\n let hash = dep::std::hash::keccak256(bytes, bytes.len() as u32);\n\n let mut selector_be_bytes = [0; SELECTOR_SIZE];\n for i in 0..SELECTOR_SIZE {\n selector_be_bytes[i] = hash[i];\n }\n\n FunctionSelector::from_field(field_from_bytes(selector_be_bytes, true))\n }\n\n pub fn zero() -> Self {\n Self { inner: 0 }\n }\n\n pub fn serialize(self: Self) -> [Field; 1] {\n [self.inner as Field]\n }\n\n pub fn deserialize(fields: [Field; 1]) -> Self {\n Self {\n inner: fields[0] as u32\n }\n }\n}\n",
1627
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/function_selector.nr"
1628
+ },
1629
+ "186": {
1630
+ "source": "use dep::aztec::abi;\nuse dep::aztec::types::vec::BoundedVec;\nuse dep::aztec::context::PrivateContext;\nuse dep::aztec::protocol_types::{\n abis::{\n call_stack_item::{\n PrivateCallStackItem,\n PublicCallStackItem,\n },\n function_selector::FunctionSelector,\n },\n address::AztecAddress,\n constants::GENERATOR_INDEX__SIGNATURE_PAYLOAD,\n hash::pedersen_hash,\n};\n\nglobal ACCOUNT_MAX_CALLS: Field = 4;\n// 1 (ARGS_HASH) + 1 (FUNCTION_SELECTOR) + 1 (TARGET_ADDRESS) + 1 (IS_PUBLIC)\nglobal FUNCTION_CALL_SIZE: Field = 4;\n// 3 * 32 + 1\nglobal FUNCTION_CALL_SIZE_IN_BYTES: Field = 97;\n\nstruct FunctionCall {\n args_hash: Field,\n function_selector: FunctionSelector,\n target_address: AztecAddress,\n is_public: bool,\n}\n\nimpl FunctionCall {\n fn serialize(self) -> [Field; FUNCTION_CALL_SIZE] {\n [self.args_hash, self.function_selector.to_field(), self.target_address.to_field(), self.is_public as Field]\n }\n\n fn to_be_bytes(self) -> [u8; FUNCTION_CALL_SIZE_IN_BYTES] {\n let mut bytes: [u8; FUNCTION_CALL_SIZE_IN_BYTES] = [0; FUNCTION_CALL_SIZE_IN_BYTES];\n let args_hash_bytes = self.args_hash.to_be_bytes(32);\n for i in 0..32 { bytes[i] = args_hash_bytes[i]; }\n let function_selector_bytes = self.function_selector.to_field().to_be_bytes(32);\n for i in 0..32 { bytes[i + 32] = function_selector_bytes[i]; }\n let target_address_bytes = self.target_address.to_field().to_be_bytes(32);\n for i in 0..32 { bytes[i + 64] = target_address_bytes[i]; }\n bytes[96] = self.is_public as u8;\n bytes\n }\n}\n\n// FUNCTION_CALL_SIZE * ACCOUNT_MAX_CALLS + 1\nglobal ENTRYPOINT_PAYLOAD_SIZE: Field = 17;\n// FUNCTION_CALL_SIZE_IN_BYTES * ACCOUNT_MAX_CALLS + 32\nglobal ENTRYPOINT_PAYLOAD_SIZE_IN_BYTES: Field = 420;\n\n// Note: If you change the following struct you have to update default_entrypoint.ts\n// docs:start:entrypoint-struct\nstruct EntrypointPayload {\n function_calls: [FunctionCall; ACCOUNT_MAX_CALLS],\n nonce: Field,\n}\n// docs:end:entrypoint-struct\n\nimpl EntrypointPayload {\n fn hash(self) -> Field {\n pedersen_hash(\n self.serialize(), \n GENERATOR_INDEX__SIGNATURE_PAYLOAD\n )\n }\n\n // Serializes the entrypoint struct\n fn serialize(self) -> [Field; ENTRYPOINT_PAYLOAD_SIZE] {\n let mut fields: BoundedVec<Field, ENTRYPOINT_PAYLOAD_SIZE> = BoundedVec::new(0); \n for call in self.function_calls {\n fields.push_array(call.serialize());\n }\n fields.push(self.nonce);\n fields.storage\n }\n\n // Serializes the payload as an array of bytes. Useful for hashing with sha256.\n fn to_be_bytes(self) -> [u8; ENTRYPOINT_PAYLOAD_SIZE_IN_BYTES] {\n let mut bytes: [u8; ENTRYPOINT_PAYLOAD_SIZE_IN_BYTES] = [0; ENTRYPOINT_PAYLOAD_SIZE_IN_BYTES];\n\n for i in 0..ACCOUNT_MAX_CALLS {\n let item_bytes = self.function_calls[i].to_be_bytes();\n for j in 0..FUNCTION_CALL_SIZE_IN_BYTES { \n bytes[i * FUNCTION_CALL_SIZE_IN_BYTES + j] = item_bytes[j];\n }\n }\n\n let nonce_bytes = self.nonce.to_be_bytes(32);\n let nonce_offset = FUNCTION_CALL_SIZE_IN_BYTES * ACCOUNT_MAX_CALLS;\n for j in 0..32 {\n bytes[nonce_offset + j] = nonce_bytes[j];\n }\n \n bytes\n }\n\n // Executes all private and public calls \n // docs:start:entrypoint-execute-calls\n fn execute_calls(self, context: &mut PrivateContext) {\n for call in self.function_calls {\n if !call.target_address.is_zero() {\n if call.is_public {\n context.call_public_function_with_packed_args(\n call.target_address, call.function_selector, call.args_hash\n );\n } else {\n let _result = context.call_private_function_with_packed_args(\n call.target_address, call.function_selector, call.args_hash\n );\n }\n }\n }\n }\n // docs:end:entrypoint-execute-calls\n}\n",
1631
+ "path": "/usr/src/yarn-project/aztec-nr/authwit/src/entrypoint.nr"
1632
+ },
1633
+ "187": {
1634
+ "source": "use dep::aztec::context::{PrivateContext, PublicContext, Context};\nuse dep::aztec::state_vars::{map::Map, public_state::PublicState};\nuse dep::aztec::types::type_serialization::bool_serialization::{BoolSerializationMethods,BOOL_SERIALIZED_LEN};\n\nuse crate::entrypoint::EntrypointPayload;\nuse crate::auth::IS_VALID_SELECTOR;\n\nstruct AccountActions {\n context: Context,\n is_valid_impl: fn(&mut PrivateContext, Field) -> bool,\n approved_action: Map<Field, PublicState<bool, BOOL_SERIALIZED_LEN>>,\n}\n\nimpl AccountActions {\n pub fn init(context: Context, approved_action_storage_slot: Field, is_valid_impl: fn(&mut PrivateContext, Field) -> bool) -> Self {\n AccountActions {\n context: context,\n is_valid_impl: is_valid_impl,\n approved_action: Map::new(\n context,\n approved_action_storage_slot,\n |context, slot| {\n PublicState::new(context, slot, BoolSerializationMethods)\n },\n ),\n }\n }\n\n pub fn private(context: &mut PrivateContext, approved_action_storage_slot: Field, is_valid_impl: fn(&mut PrivateContext, Field) -> bool) -> Self {\n AccountActions::init(Context::private(context), approved_action_storage_slot, is_valid_impl)\n }\n\n pub fn public(context: &mut PublicContext, approved_action_storage_slot: Field, is_valid_impl: fn(&mut PrivateContext, Field) -> bool) -> Self {\n AccountActions::init(Context::public(context), approved_action_storage_slot, is_valid_impl)\n }\n \n // docs:start:entrypoint\n pub fn entrypoint(self, payload: EntrypointPayload) {\n let message_hash = payload.hash();\n let valid_fn = self.is_valid_impl;\n let private_context = self.context.private.unwrap();\n assert(valid_fn(private_context, message_hash));\n payload.execute_calls(private_context);\n }\n // docs:end:entrypoint\n\n pub fn is_valid(self, message_hash: Field) -> Field {\n let valid_fn = self.is_valid_impl;\n if (valid_fn(self.context.private.unwrap(), message_hash)) {\n IS_VALID_SELECTOR\n } else {\n 0\n }\n }\n\n pub fn is_valid_public(self, message_hash: Field) -> Field {\n let value = self.approved_action.at(message_hash).read();\n if (value){\n IS_VALID_SELECTOR\n } else {\n 0\n }\n }\n\n pub fn internal_set_is_valid_storage(self, message_hash: Field, value: bool) {\n self.approved_action.at(message_hash).write(value);\n }\n}\n",
1635
+ "path": "/usr/src/yarn-project/aztec-nr/authwit/src/account.nr"
1636
+ },
1637
+ "190": {
1638
+ "source": "#[oracle(getAuthWitness)]\nfn get_auth_witness_oracle<N>(_message_hash: Field) -> [Field; N] {}\n\nunconstrained pub fn get_auth_witness<N>(message_hash: Field) -> [Field; N] {\n get_auth_witness_oracle(message_hash)\n}\n",
1639
+ "path": "/usr/src/yarn-project/aztec-nr/authwit/src/auth_witness.nr"
1640
+ },
1641
+ "211": {
1642
+ "source": "mod util;\nmod auth_oracle;\n\ncontract SchnorrSingleKeyAccount {\n use dep::std::{\n option::Option,\n };\n use dep::aztec::context::{ PrivateContext, PublicContext, Context };\n\n use dep::authwit::{\n entrypoint::EntrypointPayload,\n account::AccountActions,\n };\n\n use crate::{ util::recover_address, auth_oracle::get_auth_witness };\n\n global ACCOUNT_ACTIONS_STORAGE_SLOT = 1;\n\n #[aztec(private)]\n fn constructor() {}\n\n // Note: If you globally change the entrypoint signature don't forget to update default_entrypoint.ts\n #[aztec(private)]\n fn entrypoint(payload: pub EntrypointPayload) {\n let actions = AccountActions::private(&mut context, ACCOUNT_ACTIONS_STORAGE_SLOT, is_valid_impl);\n actions.entrypoint(payload);\n }\n\n #[aztec(private)]\n fn is_valid(message_hash: Field) -> Field {\n let actions = AccountActions::private(&mut context, ACCOUNT_ACTIONS_STORAGE_SLOT, is_valid_impl);\n actions.is_valid(message_hash)\n }\n\n #[aztec(public)]\n fn is_valid_public(message_hash: Field) -> Field {\n let actions = AccountActions::public(&mut context, ACCOUNT_ACTIONS_STORAGE_SLOT, is_valid_impl);\n actions.is_valid_public(message_hash)\n }\n\n #[aztec(public)]\n internal fn set_is_valid_storage(message_hash: Field, value: bool) {\n let actions = AccountActions::public(&mut context, ACCOUNT_ACTIONS_STORAGE_SLOT, is_valid_impl);\n actions.internal_set_is_valid_storage(message_hash, value)\n }\n\n #[contract_library_method]\n fn is_valid_impl(context: &mut PrivateContext, message_hash: Field) -> pub bool {\n let witness = get_auth_witness(message_hash);\n assert(recover_address(message_hash, witness).eq(context.this_address()));\n true\n }\n}\n",
1643
+ "path": "/usr/src/yarn-project/noir-contracts/contracts/schnorr_single_key_account_contract/src/main.nr"
1644
+ },
1645
+ "212": {
1646
+ "source": "use dep::authwit::auth_witness;\nuse dep::aztec::protocol_types::{\n address::PartialAddress,\n grumpkin_point::GrumpkinPoint,\n};\n\nstruct AuthWitness {\n owner: GrumpkinPoint,\n signature: [u8; 64],\n partial_address: PartialAddress,\n}\n\nimpl AuthWitness {\n fn deserialize(values: [Field; 67]) -> Self {\n let mut signature = [0; 64];\n for i in 0..64 {\n signature[i] = values[i + 2] as u8;\n }\n Self {\n owner: GrumpkinPoint::new(values[0], values[1]),\n signature,\n partial_address: PartialAddress::from_field(values[66]),\n }\n }\n}\n\nunconstrained pub fn get_auth_witness(message_hash: Field) -> AuthWitness {\n let witness: [Field; 67] = auth_witness::get_auth_witness(message_hash);\n AuthWitness::deserialize(witness)\n}\n",
1647
+ "path": "/usr/src/yarn-project/noir-contracts/contracts/schnorr_single_key_account_contract/src/auth_oracle.nr"
1648
+ },
1649
+ "213": {
1650
+ "source": "use dep::aztec::protocol_types::address::AztecAddress;\nuse dep::std::{schnorr::verify_signature};\nuse crate::auth_oracle::{AuthWitness};\n\npub fn recover_address(message_hash: Field, witness: AuthWitness) -> AztecAddress {\n let message_bytes = message_hash.to_be_bytes(32);\n let verification = verify_signature(\n witness.owner.x,\n witness.owner.y,\n witness.signature,\n message_bytes\n );\n assert(verification == true);\n\n AztecAddress::compute(witness.owner, witness.partial_address)\n}\n",
1651
+ "path": "/usr/src/yarn-project/noir-contracts/contracts/schnorr_single_key_account_contract/src/util.nr"
965
1652
  }
966
1653
  }
967
1654
  }