@aztec/accounts 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/README.md +38 -0
  2. package/dest/artifacts/EcdsaAccount.json +1090 -0
  3. package/dest/artifacts/SchnorrAccount.json +1078 -0
  4. package/dest/artifacts/SchnorrSingleKeyAccount.json +951 -0
  5. package/dest/defaults/account_contract.d.ts +16 -0
  6. package/dest/defaults/account_contract.d.ts.map +1 -0
  7. package/dest/defaults/account_contract.js +17 -0
  8. package/dest/defaults/account_entrypoint.d.ts +17 -0
  9. package/dest/defaults/account_entrypoint.d.ts.map +1 -0
  10. package/dest/defaults/account_entrypoint.js +117 -0
  11. package/dest/defaults/account_interface.d.ts +17 -0
  12. package/dest/defaults/account_interface.d.ts.map +1 -0
  13. package/dest/defaults/account_interface.js +22 -0
  14. package/dest/defaults/constants.d.ts +5 -0
  15. package/dest/defaults/constants.d.ts.map +1 -0
  16. package/dest/defaults/constants.js +5 -0
  17. package/dest/defaults/entrypoint_payload.d.ts +32 -0
  18. package/dest/defaults/entrypoint_payload.d.ts.map +1 -0
  19. package/dest/defaults/entrypoint_payload.js +50 -0
  20. package/dest/defaults/index.d.ts +13 -0
  21. package/dest/defaults/index.d.ts.map +1 -0
  22. package/dest/defaults/index.js +13 -0
  23. package/dest/ecdsa/account_contract.d.ts +15 -0
  24. package/dest/ecdsa/account_contract.d.ts.map +1 -0
  25. package/dest/ecdsa/account_contract.js +33 -0
  26. package/dest/ecdsa/artifact.d.ts +3 -0
  27. package/dest/ecdsa/artifact.d.ts.map +1 -0
  28. package/dest/ecdsa/artifact.js +3 -0
  29. package/dest/ecdsa/index.d.ts +31 -0
  30. package/dest/ecdsa/index.d.ts.map +1 -0
  31. package/dest/ecdsa/index.js +32 -0
  32. package/dest/schnorr/account_contract.d.ts +15 -0
  33. package/dest/schnorr/account_contract.d.ts.map +1 -0
  34. package/dest/schnorr/account_contract.js +33 -0
  35. package/dest/schnorr/artifact.d.ts +3 -0
  36. package/dest/schnorr/artifact.d.ts.map +1 -0
  37. package/dest/schnorr/artifact.js +3 -0
  38. package/dest/schnorr/index.d.ts +30 -0
  39. package/dest/schnorr/index.d.ts.map +1 -0
  40. package/dest/schnorr/index.js +32 -0
  41. package/dest/single_key/account_contract.d.ts +14 -0
  42. package/dest/single_key/account_contract.d.ts.map +1 -0
  43. package/dest/single_key/account_contract.js +40 -0
  44. package/dest/single_key/artifact.d.ts +3 -0
  45. package/dest/single_key/artifact.d.ts.map +1 -0
  46. package/dest/single_key/artifact.js +3 -0
  47. package/dest/single_key/index.d.ts +31 -0
  48. package/dest/single_key/index.d.ts.map +1 -0
  49. package/dest/single_key/index.js +33 -0
  50. package/dest/testing/create_account.d.ts +16 -0
  51. package/dest/testing/create_account.d.ts.map +1 -0
  52. package/dest/testing/create_account.js +30 -0
  53. package/dest/testing/index.d.ts +11 -0
  54. package/dest/testing/index.d.ts.map +1 -0
  55. package/dest/testing/index.js +11 -0
  56. package/dest/testing/sandbox.d.ts +22 -0
  57. package/dest/testing/sandbox.d.ts.map +1 -0
  58. package/dest/testing/sandbox.js +48 -0
  59. package/package.json +74 -0
@@ -0,0 +1,951 @@
1
+ {
2
+ "name": "SchnorrSingleKeyAccount",
3
+ "functions": [
4
+ {
5
+ "name": "constructor",
6
+ "functionType": "secret",
7
+ "isInternal": false,
8
+ "parameters": [],
9
+ "returnTypes": [],
10
+ "bytecode": "H4sIAAAAAAAA/+Xd5ZNTVxzG8eyySah7F2dxh+jmBnf3GnVIydZb6tQpdadOnVJ36kpLoe4Gfw/PM4SZfQGvODvDmW9mntmZfXEnn3tvrp7z++1KpVI7Uns+TUqz0qK0dfqfP1Mbf3MH9smntYz0PpZbzLWXSvVKoZ4v5lflCtVaUs6VyrX2JJ/ky0l5dSEpFutJKalUa9VKrpovFev5jnK12NFYcDrcd8x1hTujZWS6wJ05yN1ZLSPbBe5sYHdqP/v7gX7PHpF8z54Bt3nn79kceH9qCmju1UXbJrS5OaC5dyTmbgHNfSIxtwQ0943EnA5o7heJORPQ3D8SczaguS0Sc/eA5gGRmHsENA8EmgcBzYOB5iFA81CgeRjQPBxoHgE0jwSaRwHNo4HmMUDzWKB5HNCcA5rzQHMBaC4CzSWguQw0twPNFaA5AZqrQPN4oHkC0DwRaJ4ENE8GmqcAzVOB5mlA83SgeQbQPBNongU0zwaa5wDNc4HmeUDzfKB5AdC8EGheBDQvBpqXAM1LgeZlQPNyoPkkoPlkoPkUoPlUoPk0oHkF0Hw60HwG0Hwm0HwW0Hw20HwO0Hwu0LwSaF4FNNeA5vOA5tVAcx1o7gCazweaLwCaLwSaLwKaLwaaLwGaLwWaLwOaLwea1wDNVwDNVwLNVwHNVwPN1wDN1wLN1wHNa4Hm64HmG4DmG4Hmm4Dmm4HmW4DmW4HmdUDzbUDzeqD5dqD5DqD5TqD5LqD5bqD5HqD5XqD5PqD5fqD5AaD5QaD5IaD5YaB5A9D8CND8KND8GND8OND8BND8JND8FNC8EWh+Gmh+Bmh+Fmh+Dmh+Hmh+AWh+EWjeBDS/BDRvBppfBppfAZpfBZpfA5pfB5rfAJrfBJrfAprfBprfAZrfBZrfA5rfB5q3AM0fAM0fAs0fAc0fA82fAM2fAs2fAc2fA81fAM1fAs1fAc1fA81bgeZvgOZvgeZtkZh7BjR/B9zO24HmHUDz90DzD0Dzj0DzT5GYDwlo/jkS86EBzb9EYj4soPnXSMyHBzT/Fon5iIDm3yMxHxnQ/Eck5qMCmv+MxHx0QPNfkZiPCWj+OxLzsQHN/0RiPi6g+d9IzMcHNP8XifmEgOb/IzGfGNC8MxJza0DzroDm1sZymhrmbkqLklYySlbprvi+0PdJvm/wdbSvK32d5esOn4d9XvJx2sct/469X3s7t3Zap1sbf3spvZU+Sl+ln9JfaVMGKAOVQcpgZYgyVBmmDFdGKCOVUcpoZYwyVhnndaHklYLXsVJSykq7UlESpaqMVyYoE5VJymRlSmOdTlOmKzOUmcosZbYyR5mrzFPmKwuUhcoiZbGyRFmqLFOWK+4/737s7k/uft3uX71CcX9j9/t1/1v3g3V/VPcLdf/MlYr7K9YU999zPzr3Z3O/Mvfvcj8r93dyvyP3/3E/HPeHcb8U9w9Zo7i/hPstuP+A6/G7Pr3rtbt++VrF9a1d79n1j10P2PVxXS/W9VPXKa6vuV5x/UXXI3R9Pterc/021zNzfS/Xu3L9J9dDcn0g18tx/ZgNiuuLuN6G60+4HoPrE3i+vuevb1Q8v9nzfT3/1fNBPT/S8wU9f26T4vlVmxXPv/F8FM/P8HwFj9/3eHaP7/Z4Z4//9XhYjw/1eEmPH9yieHyZx1t5/JHH43h8isdrePyC3+f7/bbf9/r9p98Hep/0+yK/P9mm+Pn6dsXPX/080s/n/LzKz2/8PMP3977f9f2f74d8f+DrZV8/+nrK1xc+3/r84+Oxj0/+ve797AbUwDgj6LsAAA==",
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,
29
+ "type": {
30
+ "kind": "struct",
31
+ "path": "authwit::entrypoint::FunctionCall",
32
+ "fields": [
33
+ {
34
+ "name": "args_hash",
35
+ "type": {
36
+ "kind": "field"
37
+ }
38
+ },
39
+ {
40
+ "name": "function_selector",
41
+ "type": {
42
+ "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
+ ]
54
+ }
55
+ },
56
+ {
57
+ "name": "target_address",
58
+ "type": {
59
+ "kind": "struct",
60
+ "path": "authwit::aztec::protocol_types::address::AztecAddress",
61
+ "fields": [
62
+ {
63
+ "name": "inner",
64
+ "type": {
65
+ "kind": "field"
66
+ }
67
+ }
68
+ ]
69
+ }
70
+ },
71
+ {
72
+ "name": "is_public",
73
+ "type": {
74
+ "kind": "boolean"
75
+ }
76
+ }
77
+ ]
78
+ }
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": "field"
221
+ }
222
+ }
223
+ ]
224
+ }
225
+ },
226
+ {
227
+ "name": "args_hash",
228
+ "type": {
229
+ "kind": "field"
230
+ }
231
+ },
232
+ {
233
+ "name": "return_values",
234
+ "type": {
235
+ "kind": "array",
236
+ "length": 4,
237
+ "type": {
238
+ "kind": "field"
239
+ }
240
+ }
241
+ },
242
+ {
243
+ "name": "contract_storage_update_requests",
244
+ "type": {
245
+ "kind": "array",
246
+ "length": 16,
247
+ "type": {
248
+ "kind": "struct",
249
+ "path": "authwit::aztec::protocol_types::contrakt::storage_update_request::StorageUpdateRequest",
250
+ "fields": [
251
+ {
252
+ "name": "storage_slot",
253
+ "type": {
254
+ "kind": "field"
255
+ }
256
+ },
257
+ {
258
+ "name": "old_value",
259
+ "type": {
260
+ "kind": "field"
261
+ }
262
+ },
263
+ {
264
+ "name": "new_value",
265
+ "type": {
266
+ "kind": "field"
267
+ }
268
+ }
269
+ ]
270
+ }
271
+ }
272
+ },
273
+ {
274
+ "name": "contract_storage_reads",
275
+ "type": {
276
+ "kind": "array",
277
+ "length": 16,
278
+ "type": {
279
+ "kind": "struct",
280
+ "path": "authwit::aztec::protocol_types::contrakt::storage_read::StorageRead",
281
+ "fields": [
282
+ {
283
+ "name": "storage_slot",
284
+ "type": {
285
+ "kind": "field"
286
+ }
287
+ },
288
+ {
289
+ "name": "current_value",
290
+ "type": {
291
+ "kind": "field"
292
+ }
293
+ }
294
+ ]
295
+ }
296
+ }
297
+ },
298
+ {
299
+ "name": "public_call_stack_hashes",
300
+ "type": {
301
+ "kind": "array",
302
+ "length": 4,
303
+ "type": {
304
+ "kind": "field"
305
+ }
306
+ }
307
+ },
308
+ {
309
+ "name": "new_commitments",
310
+ "type": {
311
+ "kind": "array",
312
+ "length": 16,
313
+ "type": {
314
+ "kind": "struct",
315
+ "path": "authwit::aztec::protocol_types::abis::side_effect::SideEffect",
316
+ "fields": [
317
+ {
318
+ "name": "value",
319
+ "type": {
320
+ "kind": "field"
321
+ }
322
+ },
323
+ {
324
+ "name": "counter",
325
+ "type": {
326
+ "kind": "field"
327
+ }
328
+ }
329
+ ]
330
+ }
331
+ }
332
+ },
333
+ {
334
+ "name": "new_nullifiers",
335
+ "type": {
336
+ "kind": "array",
337
+ "length": 16,
338
+ "type": {
339
+ "kind": "struct",
340
+ "path": "authwit::aztec::protocol_types::abis::side_effect::SideEffectLinkedToNoteHash",
341
+ "fields": [
342
+ {
343
+ "name": "value",
344
+ "type": {
345
+ "kind": "field"
346
+ }
347
+ },
348
+ {
349
+ "name": "note_hash",
350
+ "type": {
351
+ "kind": "field"
352
+ }
353
+ },
354
+ {
355
+ "name": "counter",
356
+ "type": {
357
+ "kind": "field"
358
+ }
359
+ }
360
+ ]
361
+ }
362
+ }
363
+ },
364
+ {
365
+ "name": "new_l2_to_l1_msgs",
366
+ "type": {
367
+ "kind": "array",
368
+ "length": 2,
369
+ "type": {
370
+ "kind": "field"
371
+ }
372
+ }
373
+ },
374
+ {
375
+ "name": "unencrypted_logs_hash",
376
+ "type": {
377
+ "kind": "array",
378
+ "length": 2,
379
+ "type": {
380
+ "kind": "field"
381
+ }
382
+ }
383
+ },
384
+ {
385
+ "name": "unencrypted_log_preimages_length",
386
+ "type": {
387
+ "kind": "field"
388
+ }
389
+ },
390
+ {
391
+ "name": "block_header",
392
+ "type": {
393
+ "kind": "struct",
394
+ "path": "authwit::aztec::protocol_types::abis::block_header::BlockHeader",
395
+ "fields": [
396
+ {
397
+ "name": "note_hash_tree_root",
398
+ "type": {
399
+ "kind": "field"
400
+ }
401
+ },
402
+ {
403
+ "name": "nullifier_tree_root",
404
+ "type": {
405
+ "kind": "field"
406
+ }
407
+ },
408
+ {
409
+ "name": "contract_tree_root",
410
+ "type": {
411
+ "kind": "field"
412
+ }
413
+ },
414
+ {
415
+ "name": "l1_to_l2_message_tree_root",
416
+ "type": {
417
+ "kind": "field"
418
+ }
419
+ },
420
+ {
421
+ "name": "archive_root",
422
+ "type": {
423
+ "kind": "field"
424
+ }
425
+ },
426
+ {
427
+ "name": "public_data_tree_root",
428
+ "type": {
429
+ "kind": "field"
430
+ }
431
+ },
432
+ {
433
+ "name": "global_variables_hash",
434
+ "type": {
435
+ "kind": "field"
436
+ }
437
+ }
438
+ ]
439
+ }
440
+ },
441
+ {
442
+ "name": "prover_address",
443
+ "type": {
444
+ "kind": "struct",
445
+ "path": "authwit::aztec::protocol_types::address::AztecAddress",
446
+ "fields": [
447
+ {
448
+ "name": "inner",
449
+ "type": {
450
+ "kind": "field"
451
+ }
452
+ }
453
+ ]
454
+ }
455
+ }
456
+ ]
457
+ }
458
+ ],
459
+ "bytecode": "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",
460
+ "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f"
461
+ },
462
+ {
463
+ "name": "set_is_valid_storage",
464
+ "functionType": "open",
465
+ "isInternal": true,
466
+ "parameters": [
467
+ {
468
+ "name": "message_hash",
469
+ "type": {
470
+ "kind": "field"
471
+ },
472
+ "visibility": "private"
473
+ },
474
+ {
475
+ "name": "value",
476
+ "type": {
477
+ "kind": "boolean"
478
+ },
479
+ "visibility": "private"
480
+ }
481
+ ],
482
+ "returnTypes": [
483
+ {
484
+ "kind": "struct",
485
+ "path": "authwit::aztec::protocol_types::abis::public_circuit_public_inputs::PublicCircuitPublicInputs",
486
+ "fields": [
487
+ {
488
+ "name": "call_context",
489
+ "type": {
490
+ "kind": "struct",
491
+ "path": "authwit::aztec::protocol_types::abis::call_context::CallContext",
492
+ "fields": [
493
+ {
494
+ "name": "msg_sender",
495
+ "type": {
496
+ "kind": "struct",
497
+ "path": "authwit::aztec::protocol_types::address::AztecAddress",
498
+ "fields": [
499
+ {
500
+ "name": "inner",
501
+ "type": {
502
+ "kind": "field"
503
+ }
504
+ }
505
+ ]
506
+ }
507
+ },
508
+ {
509
+ "name": "storage_contract_address",
510
+ "type": {
511
+ "kind": "struct",
512
+ "path": "authwit::aztec::protocol_types::address::AztecAddress",
513
+ "fields": [
514
+ {
515
+ "name": "inner",
516
+ "type": {
517
+ "kind": "field"
518
+ }
519
+ }
520
+ ]
521
+ }
522
+ },
523
+ {
524
+ "name": "portal_contract_address",
525
+ "type": {
526
+ "kind": "struct",
527
+ "path": "authwit::aztec::protocol_types::address::EthAddress",
528
+ "fields": [
529
+ {
530
+ "name": "inner",
531
+ "type": {
532
+ "kind": "field"
533
+ }
534
+ }
535
+ ]
536
+ }
537
+ },
538
+ {
539
+ "name": "function_selector",
540
+ "type": {
541
+ "kind": "struct",
542
+ "path": "authwit::aztec::protocol_types::abis::function_selector::FunctionSelector",
543
+ "fields": [
544
+ {
545
+ "name": "inner",
546
+ "type": {
547
+ "kind": "integer",
548
+ "sign": "unsigned",
549
+ "width": 32
550
+ }
551
+ }
552
+ ]
553
+ }
554
+ },
555
+ {
556
+ "name": "is_delegate_call",
557
+ "type": {
558
+ "kind": "boolean"
559
+ }
560
+ },
561
+ {
562
+ "name": "is_static_call",
563
+ "type": {
564
+ "kind": "boolean"
565
+ }
566
+ },
567
+ {
568
+ "name": "is_contract_deployment",
569
+ "type": {
570
+ "kind": "boolean"
571
+ }
572
+ },
573
+ {
574
+ "name": "start_side_effect_counter",
575
+ "type": {
576
+ "kind": "field"
577
+ }
578
+ }
579
+ ]
580
+ }
581
+ },
582
+ {
583
+ "name": "args_hash",
584
+ "type": {
585
+ "kind": "field"
586
+ }
587
+ },
588
+ {
589
+ "name": "return_values",
590
+ "type": {
591
+ "kind": "array",
592
+ "length": 4,
593
+ "type": {
594
+ "kind": "field"
595
+ }
596
+ }
597
+ },
598
+ {
599
+ "name": "contract_storage_update_requests",
600
+ "type": {
601
+ "kind": "array",
602
+ "length": 16,
603
+ "type": {
604
+ "kind": "struct",
605
+ "path": "authwit::aztec::protocol_types::contrakt::storage_update_request::StorageUpdateRequest",
606
+ "fields": [
607
+ {
608
+ "name": "storage_slot",
609
+ "type": {
610
+ "kind": "field"
611
+ }
612
+ },
613
+ {
614
+ "name": "old_value",
615
+ "type": {
616
+ "kind": "field"
617
+ }
618
+ },
619
+ {
620
+ "name": "new_value",
621
+ "type": {
622
+ "kind": "field"
623
+ }
624
+ }
625
+ ]
626
+ }
627
+ }
628
+ },
629
+ {
630
+ "name": "contract_storage_reads",
631
+ "type": {
632
+ "kind": "array",
633
+ "length": 16,
634
+ "type": {
635
+ "kind": "struct",
636
+ "path": "authwit::aztec::protocol_types::contrakt::storage_read::StorageRead",
637
+ "fields": [
638
+ {
639
+ "name": "storage_slot",
640
+ "type": {
641
+ "kind": "field"
642
+ }
643
+ },
644
+ {
645
+ "name": "current_value",
646
+ "type": {
647
+ "kind": "field"
648
+ }
649
+ }
650
+ ]
651
+ }
652
+ }
653
+ },
654
+ {
655
+ "name": "public_call_stack_hashes",
656
+ "type": {
657
+ "kind": "array",
658
+ "length": 4,
659
+ "type": {
660
+ "kind": "field"
661
+ }
662
+ }
663
+ },
664
+ {
665
+ "name": "new_commitments",
666
+ "type": {
667
+ "kind": "array",
668
+ "length": 16,
669
+ "type": {
670
+ "kind": "struct",
671
+ "path": "authwit::aztec::protocol_types::abis::side_effect::SideEffect",
672
+ "fields": [
673
+ {
674
+ "name": "value",
675
+ "type": {
676
+ "kind": "field"
677
+ }
678
+ },
679
+ {
680
+ "name": "counter",
681
+ "type": {
682
+ "kind": "field"
683
+ }
684
+ }
685
+ ]
686
+ }
687
+ }
688
+ },
689
+ {
690
+ "name": "new_nullifiers",
691
+ "type": {
692
+ "kind": "array",
693
+ "length": 16,
694
+ "type": {
695
+ "kind": "struct",
696
+ "path": "authwit::aztec::protocol_types::abis::side_effect::SideEffectLinkedToNoteHash",
697
+ "fields": [
698
+ {
699
+ "name": "value",
700
+ "type": {
701
+ "kind": "field"
702
+ }
703
+ },
704
+ {
705
+ "name": "note_hash",
706
+ "type": {
707
+ "kind": "field"
708
+ }
709
+ },
710
+ {
711
+ "name": "counter",
712
+ "type": {
713
+ "kind": "field"
714
+ }
715
+ }
716
+ ]
717
+ }
718
+ }
719
+ },
720
+ {
721
+ "name": "new_l2_to_l1_msgs",
722
+ "type": {
723
+ "kind": "array",
724
+ "length": 2,
725
+ "type": {
726
+ "kind": "field"
727
+ }
728
+ }
729
+ },
730
+ {
731
+ "name": "unencrypted_logs_hash",
732
+ "type": {
733
+ "kind": "array",
734
+ "length": 2,
735
+ "type": {
736
+ "kind": "field"
737
+ }
738
+ }
739
+ },
740
+ {
741
+ "name": "unencrypted_log_preimages_length",
742
+ "type": {
743
+ "kind": "field"
744
+ }
745
+ },
746
+ {
747
+ "name": "block_header",
748
+ "type": {
749
+ "kind": "struct",
750
+ "path": "authwit::aztec::protocol_types::abis::block_header::BlockHeader",
751
+ "fields": [
752
+ {
753
+ "name": "note_hash_tree_root",
754
+ "type": {
755
+ "kind": "field"
756
+ }
757
+ },
758
+ {
759
+ "name": "nullifier_tree_root",
760
+ "type": {
761
+ "kind": "field"
762
+ }
763
+ },
764
+ {
765
+ "name": "contract_tree_root",
766
+ "type": {
767
+ "kind": "field"
768
+ }
769
+ },
770
+ {
771
+ "name": "l1_to_l2_message_tree_root",
772
+ "type": {
773
+ "kind": "field"
774
+ }
775
+ },
776
+ {
777
+ "name": "archive_root",
778
+ "type": {
779
+ "kind": "field"
780
+ }
781
+ },
782
+ {
783
+ "name": "public_data_tree_root",
784
+ "type": {
785
+ "kind": "field"
786
+ }
787
+ },
788
+ {
789
+ "name": "global_variables_hash",
790
+ "type": {
791
+ "kind": "field"
792
+ }
793
+ }
794
+ ]
795
+ }
796
+ },
797
+ {
798
+ "name": "prover_address",
799
+ "type": {
800
+ "kind": "struct",
801
+ "path": "authwit::aztec::protocol_types::address::AztecAddress",
802
+ "fields": [
803
+ {
804
+ "name": "inner",
805
+ "type": {
806
+ "kind": "field"
807
+ }
808
+ }
809
+ ]
810
+ }
811
+ }
812
+ ]
813
+ }
814
+ ],
815
+ "bytecode": "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",
816
+ "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f"
817
+ }
818
+ ],
819
+ "events": [],
820
+ "debug": {
821
+ "debugSymbols": [
822
+ "eJyrVsrJT04syczPK1ayqq6tBQAz9wY7",
823
+ "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",
824
+ "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",
825
+ "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c7iQOVzIHC5kDhcyhwuZw4XM4ULmcCFzuJA5XMgcLmQOFzKHC5nDhczhQuZwIXO4kDlcyBwuZA4XMocLmcOFzOFC5nAhc7iQOVzIHC5kDhcyhwuZw4XM4ULmcCFzuJA5XMgcLmQOFzKHC5nDhczhQuZwIXO4kDlcyBwuZA4XModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbModLmcOlzOFS5nApc7iUOVzKHC5lDpcyh0uZw6XM4VLmcClzuJQ5XMocLmUOlzKHS5nDpczhUuZwKXO4lDlcyhwuZQ6XModLmcOlzOFS5nApc7iUOVzKHC5lDpcyh0uZw6XM4VLmcClzuJQ5XMocLmUOlzKHS5nDpczhUuZwKXO4lDlcyhwuZQ6XModLmcOlzOFS5nApc7iUOVzKHC5lDpcyh0uZw6XM4VLmcClzuJQ5XMocLmUOlzKHS5nDpczhUuZwKXO4lDlcyhwuZQ6XModLmcOlzOFS5nApc7iUOVzKHC5lDpcyh0uZw6XM4VLmcClzuJQ5XMocLmUOlzKHS5nDpczhUuZwKXO4lDlcyhwuZQ6XModLmcOlzOFS5nApc7jykEHcsUQ99WOJeuzHEvXcjyXqwR9L1JM/lqhHfyxRz/5Yoh7+sUQ/fRnJHUv005eh3LFEP30Zyx1L9NOXwdyxRD99Gc0dS/TTl+HcsUQ/fRnPHUv005cB3bFEP30Z0R1L9NOXId2xRD99GdMdS/TTl0HdsUQ/fRnVHUv005dh3bFEP30Z1x1L9NOXgd2xRD99GdkdS/TTl6HdsUQ/fRnbHUv005fB3bFEP30Z3R1L9NOX4d2xRD99Gd8dS/TTlwHesUQ/fRnhHUv005ch3rFEP30Z4x1L9NOXQd6xRD99GeUdS/TTl2HesUQ/fRnnHUv005eB3rFEP30Z6R1L9NOXod6xRD99GesdS/TTl8HesUQ/fRntHUv005fh3rFEP30Z7x1L9NOXAd+xRD99GfEdS/TTlyHfsUQ/fRnzHUv005dB37FEP30Z9R1L5NMvOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrc9b3axN5rjoKyv9d+Mvfv9pa+3i1/fDqMurk1bXVXp8vP/57tM/XN59dvPePFz9+CNI/NzD9WyRtYPrOIG1g+j4lbWBaNUgbmNYw0gamFZW0gWl9J21g2m1IG5j2PtAG5p+7kDZA78Tzz6RIG6B34vnndaQN0Dvx/LNM0gbonXj+OS9pA/ROPP8MnLQBeieePx9A2gC9E8+fnSBtgN6J58+VkDZA78TzZ25IG6B34vnzSKQN0Dvx/Fkt0gbonXj+HBtpA/ROPH/Gj7QBeieeP/9I2gC9E8+fDSVtgN6J58/NkjZA78TzZ4pJG6B34vnz1qQN0Dvx/Fl00gbonXj+nD5pA/ROPJ9hIG2A3onn8x2kDdA78Xz2hbQBeieezwWRNgDvxHU+M0XaALwT1/k8GWkD8E5cH/BOXOeTf6QNwDtxnU9FkjYA78R1PjEK2sB8fpW0AXonns/2kjZA78TzuWfSBuideD4TTtoAvRPP5+VJG6B34rlLgLQBeieeexZIG6B34rmDgrQBeiee+zlIG6B34rm7hLQBeieee11IG6B34rnzhrQBeiee+4BIG6B34rkribQBeieee6RIG6B3Yrpjq9IdW5Xu2Kp0x1alO7Yq3bFV6Y6tSndsVbpjq9IdW5Xu2Kp0x1alO7Yq3bFV6Y6tSndsVbpjq9IdW5Xu2Kp0x1alO7Yq3bFV6Y6tSndsVbpjq9IdW5Xu2Kp0x1alO7Yq3bFV6Y6tSndsVbpjq9IdW5Xu2Kp0x1alO7Yq3bFV6Y6tSndsVbpjq9IdW5Xu2Kp0x1alO7Yq3bFV6Y6tSndsVbpjq9IdW5Xu2Kp0x1alO7Yq3bFV6Y6tSndsVbpjq9IdW5Xu2Kp0x5bRHVtGd2wZ3bFldMeWPeCd2OiOLaM7tozu2DK6Y8voji2jO7aM7tgyumPL6I4tozu2jO7YMrpjy+iOLaM7tozu2DK6Y8voji2jO7aM7tgyumPL6I4tozu2jO7YMrpjy+iOLaM7tozu2DK6Y8voji2jO7aM7tgyumPL6I4tozu2jO7YMrpjy+iOLaM7tozu2DK6Y8voji2jO7aM7tgyumPL6I4tozu2jO7YMrpjy+iOLaM7tozu2DK6Y8voji2jO7aM7tgyumPL6I4tozu2jO7YMrpjy+iOLaM7tozu2DK6Y8voji2jO7aM7tgyumPL6I4tozu2jO7YMrpjy+iOLaM7tozu2DK6Y8voji2jO7aM7tgyumPL6I4tozu2jO7YMrpjy+iOLaM7tozu2DK6Y8voji2jO7aM7tgyumPL6I4tozu2jO7Ycrpjy+mOLac7tpzu2PIHvBM73bHldMeW0x1bTndsOd2x5XTHltMdW053bDndseV0x5bTHVtOd2w53bHldMeW0x1bTndsOd2x5XTHltMdW053bDndseV0x5bTHVtOd2w53bHldMeW0x1bTndsOd2x5XTHltMdW053bDndseV0x5bTHVtOd2w53bHldMeW0x1bTndsOd2x5XTHltMdW053bDndseV0x5bTHVtOd2w53bHldMeW0x1bTndsOd2x5XTHltMdW053bDndseV0x5bTHVtOd2w53bHldMeW0x1bTndsOd2x5XTHltMdW053bDndseV0x5bTHVtOd2w53bHldMeW0x1bTndsOd2x5XTHltMdW053bDndseV0x5bTHVtOd2w53bHldMeW0x1bTndsOd2x5XTHltMdW053bDndseV0x5bTHVtBd2wF3bEVdMdW0B1b8YB34qA7toLu2Aq6Yyvojq2gO7aC7tgKumMr6I6toDu2gu7YCrpjK+iOraA7toLu2Aq6Yyvojq2gO7aC7tgKumMr6I6toDu2gu7YCrpjK+iOraA7toLu2Aq6Yyvojq2gO7aC7tgKumMr6I6toDu2gu7YCrpjK+iOraA7toLu2Aq6Yyvojq2gO7aC7tgKumMr6I6toDu2gu7YCrpjK+iOraA7toLu2Aq6Yyvojq2gO7aC7tgKumMr6I6toDu2gu7YCrpjK+iOraA7toLu2Aq6Yyvojq2gO7aC7tgKumMr6I6toDu2gu7YCrpjK+iOraA7toLu2Aq6Yyvojq2gO7aC7tgKumMr6I6toDu2gu7YCrpjK+iOraA7toLu2Aq6Yyvojq2gO7aC7tgKumMr6I6toDu2gu7YCrpjq9EdW43u2Gp0x1ajO7baA96JG92x1eiOrUZ3bDW6Y6vRHVuN7thqdMdWozu2Gt2x1eiOrUZ3bDW6Y6vRHVuN7thqdMdWozu2Gt2x1eiOrUZ3bDW6Y6vRHVuN7thqdMdWozu2Gt2x1eiOrUZ3bDW6Y6vRHVuN7thqdMdWozu2Gt2x1eiOrUZ3bDW6Y6vRHVuN7thqdMdWozu2Gt2x1eiOrUZ3bDW6Y6vRHVuN7thqdMdWozu2Gt2x1eiOrUZ3bDW6Y6vRHVuN7thqdMdWozu2Gt2x1eiOrUZ3bDW6Y6vRHVuN7thqdMdWozu2Gt2x1eiOrUZ3bDW6Y6vRHVuN7thqdMdWozu2Gt2x1eiOrUZ3bDW6Y6vRHVuN7thqdMdWozu2Gt2x1eiOrUZ3bDW6Y6vRHVuN7thqdMdWozu2Gt2x1eiOrUZ3bDW6Y6vRHVuN7thqdMdWpzu2Ot2x1emOrU53bPUHvBN3umOr0x1bne7Y6nTHVqc7tjrdsdXpjq1Od2x1umOr0x1bne7Y6nTHVqc7tjrdsdXpjq1Od2x1umOr0x1bne7Y6nTHVqc7tjrdsdXpjq1Od2x1umOr0x1bne7Y6nTHVqc7tjrdsdXpjq1Od2x1umOr0x1bne7Y6nTHVqc7tjrdsdXpjq1Od2x1umOr0x1bne7Y6nTHVqc7tjrdsdXpjq1Od2x1umOr0x1bne7Y6nTHVqc7tjrdsdXpjq1Od2x1umOr0x1bne7Y6nTHVqc7tjrdsdXpjq1Od2x1umOr0x1bne7Y6nTHVqc7tjrdsdXpjq1Od2x1umOr0x1bne7Y6nTHVqc7tjrdsdXpjq1Od2x1umOr0x1bne7Y6nTHVqc7tjrdsdXpjq1Od2x1umOr0x1bne7Y6nTHVqc7tjrdsdXpjq1Bd2wNumNr0B1bg+7YGg94Jx50x9agO7YG3bE16I6tQXdsDbpja9AdW4Pu2Bp0x9agO7YG3bE16I6tQXdsDbpja9AdW4Pu2Bp0x9agO7YG3bE16I6tQXdsDbpja9AdW4Pu2Bp0x9agO7YG3bE16I6tQXdsDbpja9AdW4Pu2Bp0x9agO7YG3bE16I6tQXdsDbpja9AdW4Pu2Bp0x9agO7YG3bE16I6tQXdsDbpja9AdW4Pu2Bp0x9agO7YG3bE16I6tQXdsDbpja9AdW4Pu2Bp0x9agO7YG3bE16I6tQXdsDbpja9AdW4Pu2Bp0x9agO7YG3bE16I6tQXdsDbpja9AdW4Pu2Bp0x9agO7YG3bE16I6tQXdsDbpja9AdW4Pu2Bp0x9agO7YG3bE16I6tQXdsDbpja9AdW4Pu2Bp0x9agO7YG3bE16I6tQXdsDbpja9AdW0l3bCXdsZV0x1bSHVv5gHfipDu2ku7YSrpjK+mOraQ7tpLu2Eq6Yyvpjq2kO7aS7thKumMr6Y6tpDu2ku7YSrpjK+mOraQ7tpLu2Eq6Yyvpjq2kO7aS7thKumMr6Y6tpDu2ku7YSrpjK+mOraQ7tpLu2Eq6Yyvpjq2kO7aS7thKumMr6Y6tpDu2ku7YSrpjK+mOraQ7tpLu2Eq6Yyvpjq2kO7aS7thKumMr6Y6tpDu2ku7YSrpjK+mOraQ7tpLu2Eq6Yyvpjq2kO7aS7thKumMr6Y6tpDu2ku7YSrpjK+mOraQ7tpLu2Eq6Yyvpjq2kO7aS7thKumMr6Y6tpDu2ku7YSrpjK+mOraQ7tpLu2Eq6Yyvpjq2kO7aS7thKumMr6Y6tpDu2ku7YSrpjK+mOraQ7tpLu2Eq6Yyvpjq2kO7aS7thKuGPr+Bm7Ex8/Y3fi42fsTnz8jN2Jj5+xO/HxM3YnPn7G7sTHz9id+PgZuxMfP6N3Yrhj69gAvRPDHVvHBuidGO7YOjZA78Rwx9axAXonhju2jg3QOzHcsXVsYN6Jjxd/RKrWLzZQH2N8/J+UGhcbGO3jd5PleyKfvfTX32P5/EWW+H7pzM8NzDsxaAPzTgzawLwTgzYw78SgDcw7MWgD804M2sC8E4M2MO/EnA2cOLZAG6B34hPHFmgD9E584tgCbYDeiU8cW6ANLO/EOeLj0o9fY/+jHYzwz82Wq1+Mfex1+Ph+2fK50+Ut+207Xd7b37XTE73X/8ed3n23YPUiUantgzsUM/sx09+/2MKer7X072Xm8Rn/7nuFxfHvvlNYHP/u+4TF8e++S1gc/+57hMXx775DWBz/7ra/OP7dvXxt/BPrFyY+u+ueGL8w8dld98T2hYnP7ronpi9MfHbXPbF8YeKzu+6J4QsTn911T+xemPjsrnti9sLEZ3fdE6sXJj67654YvTDx2V33xOaFic/uuicmL0x8dtc9sXhh4rO77onBCxOf3XVP7F2Y+Oyue2LuwsRnd90TaxcmPrvrnhi7MPHZXffE1oWJz+66J6YuTHx21z2xdGHis7vuiaELE5/ddU/sXJj47K57YubCxGd33RMrFyY+uuuWEyMXJj6665YTGxcmPrrrlge665YTDxcmPrrrlhMHFyY+uuuWE/8WJf6JfQsTn911T8xbmPjsrnti3cLEZ3fdE+MWJj67657YtjDx2V33xLSFic/uurdbthbHZ3fd2w1bi+Ozu+7tdq3F8dld93az1uL47K57u1VrcXx2173dqLU4Prvr3m7TWhyf3XVvN2ktjs/uurfLsRbHZ3fd2zVWi+Ozuy7bTVXYbqrCdlMVtpuqsN1Uhe2mKmw3VWG7qQrbTVXYbqrCdlMVtpuqsN1Uhe2mKmw3VWG7qQrbTVXYbqrCdlMVtpuqsN1Uhe2mKmw3VWG7qQrbTVXYbqrCdlMVtpuqsN1Uhe2mKmw3VWG7qQrbTVXYbqrCdlMVtpuqsN1Uhe2mKmw3VWG7qQrbTVXYbqrCdlMVtpuqsN1Uhe2mKmw3VWG7qQrbTVXYbqrCdlMVtpuqsN1Uhe2mKmw3VWG7qQrbTVXYbqrKdlNVtpuqst1Ule2mqo+9u65/5vCSP8afXLd/hDj+Dfb9quNzp3s36Dt3uncvv3One7f937bTjNlO975DuHGnt6tXalzsdLR8vjjL43ui6S+lPPLj2+5LKfH90pmfG7j7qJZv4O7budUbuF3AsnwDd9/SLd/A3Td1yzdw923d8g3cfWO3fAN3368t38Ddt2HLN0DvxLcLWZZvgN6Jb5eyLN8AvRPfLmZZvgF6J75dznK5gRzxcemH13+8gxH+udly9Yuxj72O499rP/yD8GOny1v223a6vLe/bafLbwLettPldwtv2+ny24p37ZStp6lsPU1l62kqW09T2XqaytbTVLaeprL1NJWtp6lsPU1l62kqW09T2XqaytbTVLaeprL1NJWtp6lsPU1l62kqW09T2XqaytbTVLaeprL1NJWtp6lsPU1l62kqW09T2XqaytbTVLaeprL1NJWtp6lsPU1l62kqW09T2XqaytbTVLaeprL1NJWtp6lsPU1l62kqW09T2XqaytbTVLaeprL1NJWtp6lsPU1l62kqW09T2XqaytbTVLaeprL1NJWtp6lsPU1l62kqW09jbD2NsfU0xtbTGFtPYw9017XNnTOX8dFd1za3w1zGR3dde7C7bmF33cLuuoXddQu76xZ21y3srlvYXfd2f9fi+Oyue7u7a238281di+Ozu+7t1q7F8dld93Zj1+L47K57u61rcXx2173d1LU4Prvr3m7pWhyf3XVvN3Qtjs/uurfbuRbHZ3fd2z1ai+Ozu+7txqvF8dldl+2mMrabythuKmO7qYztpjK2m8rYbipju6mM7aYytpvK2G4qY7upjO2mMrabythuKmO7qYztpjK2m8rYbipju6mM7aYytpvK2G4qY7upjO2mMrabythuKmO7qYztpjK2m8rYbipju6mM7aYytpvK2G4qY7upjO2mMrabythuKmO7qYztpjK2m8rYbipju6mM7aYytpvK2G4qY7upjO2mMrabythuKmO7qYztpjK2m8rYbipju6mM7aYytpvK2G4qY7upnO2mcrabytluKme7qfyB7rrOdlM5203lbDeVs91UznZTOdtN5Ww3lbPdVM52UznbTeVsN5Wz3VTOdlM5203lbDeVs91Uvrmbyj9zHH8nP8afXLd/hCjje2Ifnzvdu0HfudO9e/mdO9277f+2nWbMdrr3HcKNO52rVz4u/7jYY2R/vrKV76+Nz3o3N6PcdvXpjdBtV5/ep9x29eltxG1Xn3b5u64+l2bcdvVpj7zt6tO+dNvVp73gtqt/6Xt17lO47epf+l6d2whuu/qXvlfns/x3XX0+an/b1b/0vTofVL/t6l/6Xp2Ped929S99r86HpG+7+pe+V+cjxrdd/Uvfq/MB3duu/qXv1fl46z1Xt/rab+a4bY+PO/FH/X7fbjm7YR6en/8Kiu+XzvwM89Iv8u4wL/3e7w7zUkm9O8xLFfjuMC8VbDHM+P5PvuKzMC/V97vDvNQO7g7zUve4O8xLzebmMPMx1neFWViB08pnmD57a89HTN8VZl2dqY9SPl9c6izMujrzE2HW1ZmfCLOuzvxEmHV15jrMfHDvXWHW1ZmfCLOuzvxEmHV3ej8RZt2d3k+E2akCz4fR3hVmpwo8HxR7V5idKvB8iOtdYXaqwPMBq3eF2akCz4ef3hVmpwo8H0x6V5idKvB8aOhdYTaqwCdfNv+uMBtV4JMvgn9XmI0q8MmXtL8rzEYV+OQL1N8VZqMKfPLl5u8Ks1MFng93vCvMThV4PnjxrjA7VeD5UMS7wuxUgecDC+8Ks1MFng8TvCvMThV4/qD/u8LsVIHnT9a/K8xOFXj+fPq7wuxUgedfrPyuMDtV4PmXHr8rzE4VeP6FxO8Ks1MFnn9Z8LvC7FSBX5smuTvMThX4tVmVu8PsVIFfm4S5O8xOFfi1OZu7w+xUgV+b4rk7zE4V+LUZobvD7FSBX5tAujvMThX4tfmmu8PsVIFfm566O8xOFfi12ay7w+xUgV+b/Lo7zE4V+LW5srvD7FSBX5tauzvMThV44eTXT4TZqQIvnPz6iTA7VeCFk18/EWanCrxw8usnwuxUgRdOfv1EmJ0q8MLJr58Is1MFXjj59RNhdqrA8y/+e1eYnSrwTjNxJ1+x964wO1XgnWbiTr7M7l1hdqrAO83EnXxt3LvC7FSBd5qJO/mCtneF2akC7zQTd/JVaG8Ks9NM3MnXlL0rzE4VeKeZuJMvBHtXmJ0q8E4zcSdfvfWuMDtV4J1m4k6+5OpdYTaqwCdfQPWuMBtV4JMvh3pXmI0q8MkXN70rzEYV+ORLld4VZqcKvNNM3MnXF70rzE4VeKeZuJMvCnpXmJ0q8E4zcSffqvJFYVr/fPHIWZiVb+3LMAv/gGv4x4trxCzMwj/g6zAL/4Cvwyy8hbgOs/AW4jrMuluI8Rgf1z3+84c60z7CLBwp+okwC+uMeft48fFPpB+P6e9fXMojP+p1KWV6qisnkG7PvvAG5fbsC9vB7dkXdo/bsy9sNufZP8IsrO/XYRb+E/EyzMqBpeswW9T3jzBbFOyPMFtU4I8wC0uq++eL3dsszMIaeR1mYdG7DrPwDvs6zMIKfB1mYQW+DLNyYOk6zMIKfB1mYQW+DrOwAl+H2akCrxxYug6zUwVeObB0HWanCrxyYOkyzMqBpeswO1XglQNL12F2qsArB5auw+xUgVcOLF2H2akCrxxYug6zUwVeObB0HWanCrxyYOk6zE4VeOXA0nWYnSrwyrGcUj++RrHOOfDKsZzLMCvHcq7DLKwz12EW1pnrMAvrzHWYhXXm/4SZPdywciznOszCO73rMAvv9K7DvKsCT8OsrMDj+8MNZdabVo7lXIdZWWcuw6ysM5dhVtaZyzAr68xlmJV15jLM0ueWPutM7bNGuXL45CpMrBw+uQ6z8E7vOszCO73rMAsr8HWYhRX4OszSJ0evwix9cvQqzNInR6/CbFSBY+XwyWWYlcMn12F2qsArh0+uwyytwP/40edYOXxyHWajZ/dj5fDJdZiNnt2PlV/IdB1maQW+CLNyRug6zNIKfBVmaQW+CrNTBd5peip2mp6KnaanYqfpqdhpeipWfiHTZZiVX8h0HWanCrxyHOo6zE4VeOXA0nWYnSrwypGi6zA7VeCV803XYXaqwCvnm67D7FSBV843XYfZqeitHCm6DjN9a9fHpwXB/fuqx+eq6XvwatV8FOVy1fSv+nLV9M/vctW0U5+v+tvf/gdjXlnp",
826
+ "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xxyuYw7XMYfrmMN1zOE65nAdc7iOOVzHHK5jDtcxh+uYw3XM4TrmcB1zuI45XMccrmMO1zGH65jDdczhOuZwHXO4jjlcxxyuYw7XMYfrmMN1zOE65nAdc7iOOVzHHK5jDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMONzCHG5jDDczhBuZwA3O4gTncwBxuYA43MIcbmMMNzOEG5nADc7iBOdzAHG5gDjcwhxuYww3M4QbmcANzuIE53MAcbmAONzCHG5jDDczhBuZwA3O4gTncwBxuYA43MIcbmMMNzOEG5nADc7iBOdzAHG5gDjcwhxuYww3M4QbmcANzuIE53MAcbmAONzCHG5jDDczhBuZwA3O4gTncwBxuYA43MIcbmMMNzOEG5nADc7iBOdzAHG5gDjcwhxuYww3M4QbmcANzuIE53MAcbmAONzCHG5jDDczhBuZwA3O4gTncwBxuYA43MIcbmMMNzOEG5nADc7iBOdzAHG5gDjcwhxuYww3M4QbmcANzuIE53MAcbmAONzCHG5jDDczhBuZwE3O4iTncxBxuYg43MYebmMNNzOEm5nATc7iJOdzEHG5iDjcxh5uYw03M4SbmcBNzuIk53MQcbmIONzGHm5jDTczhJuZwE3O4iTncxBxuYg43MYebmMNNzOEm5nATc7iJOdzEHG5iDjcxh5uYw03M4SbmcBNzuIk53MQcbmIONzGHm5jDTczhJuZwE3O4iTncxBxuYg43MYebmMNNzOEm5nATc7iJOdzEHG5iDjcxh5uYw03M4SbmcBNzuIk53MQcbmIONzGHm5jDTczhJuZwE3O4iTncxBxuYg43MYebmMNNzOEm5nATc7iJOdzEHG5i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"
827
+ ],
828
+ "fileMap": {
829
+ "15": {
830
+ "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 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",
831
+ "path": "std/field.nr"
832
+ },
833
+ "27": {
834
+ "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",
835
+ "path": "std/option.nr"
836
+ },
837
+ "39": {
838
+ "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",
839
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/abi.nr"
840
+ },
841
+ "41": {
842
+ "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",
843
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/state_vars/public_state.nr"
844
+ },
845
+ "42": {
846
+ "source": "use crate::context::{PrivateContext, PublicContext, Context};\nuse dep::std::option::Option;\nuse dep::protocol_types::hash::pedersen_hash;\n\n// docs:start:map\nstruct Map<V> {\n context: Context,\n storage_slot: Field,\n state_var_constructor: fn(Context, Field) -> V,\n}\n// docs:end:map\n\nimpl<V> Map<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 ) -> Map<V> {\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: Field) -> V {\n // TODO(#1204): use a generator index for the storage slot\n let derived_storage_slot = pedersen_hash([self.storage_slot, key],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",
847
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/state_vars/map.nr"
848
+ },
849
+ "48": {
850
+ "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",
851
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/types/type_serialization/bool_serialization.nr"
852
+ },
853
+ "50": {
854
+ "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",
855
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/types/vec.nr"
856
+ },
857
+ "64": {
858
+ "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: Field,\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 // starts at 1 because all private calls have txhash nullifier as 0th nullifier\n // and therefore 0th sideeffect. increment this for each side effect in this context\n side_effect_counter: 1,\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 );\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(),\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(),\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(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 );\n let item = PublicCallStackItem {\n contract_address: AztecAddress::from_field(fields[0]),\n function_data: FunctionData {\n selector: FunctionSelector::from_field(fields[1]),\n is_internal: fields[2] as bool,\n is_private: fields[3] as bool,\n is_constructor: fields[4] as bool,\n },\n public_inputs: PublicCircuitPublicInputs {\n call_context: CallContext {\n msg_sender : AztecAddress::from_field(fields[5]),\n storage_contract_address : AztecAddress::from_field(fields[6]),\n portal_contract_address : EthAddress::from_field(fields[7]),\n function_selector: FunctionSelector::from_field(fields[8]), // practically same as fields[1]\n is_delegate_call : fields[9] as bool,\n is_static_call : fields[10] as bool,\n is_contract_deployment: fields[11] as bool,\n start_side_effect_counter: fields[12],\n },\n args_hash: fields[13],\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\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 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: Field,\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: 0, // no initial nullifier in new public context. increment on every side effect\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",
859
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/context.nr"
860
+ },
861
+ "78": {
862
+ "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 + side_effect_counter\n// = 2 + 4 + 7 + 1\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) -> [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) -> [Field; ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_SIZE] {\n enqueue_public_function_call_oracle(contract_address, function_selector, args_hash)\n}\n",
863
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/oracle/enqueue_public_function_call.nr"
864
+ },
865
+ "83": {
866
+ "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) -> [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) -> [Field; CALL_PRIVATE_FUNCTION_RETURN_SIZE] {\n call_private_function_oracle(contract_address, function_selector, args_hash)\n}\n",
867
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/oracle/call_private_function.nr"
868
+ },
869
+ "90": {
870
+ "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",
871
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/oracle/storage.nr"
872
+ },
873
+ "96": {
874
+ "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;\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",
875
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/constants.nr"
876
+ },
877
+ "99": {
878
+ "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::uint128::U128;\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 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// sha256 hash is stored in two fields to accommodate all 256-bits of the hash\nglobal NUM_FIELDS_PER_SHA256 : Field = 2;\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_field(previous_log_hash[0]),\n U128::from_field(previous_log_hash[1]),\n U128::from_field(current_log_hash[0]),\n U128::from_field(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",
879
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/hash.nr"
880
+ },
881
+ "115": {
882
+ "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;\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 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 to_field(self) -> Field {\n self.inner\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 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 to_field(self) -> Field{\n self.inner\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 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",
883
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/address.nr"
884
+ },
885
+ "120": {
886
+ "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",
887
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/contrakt/deployment_data.nr"
888
+ },
889
+ "121": {
890
+ "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",
891
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/contrakt/storage_update_request.nr"
892
+ },
893
+ "122": {
894
+ "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",
895
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/contrakt/storage_read.nr"
896
+ },
897
+ "131": {
898
+ "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",
899
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/call_stack_item.nr"
900
+ },
901
+ "136": {
902
+ "source": "use crate::constants::{GENERATOR_INDEX__SIDE_EFFECT};\nuse dep::std::cmp::Eq;\nuse crate::traits::{Empty, Hash};\n\nstruct SideEffect{\n value: Field,\n counter: Field,\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]\n }\n\n pub fn deserialise(values: [Field; 2]) -> Self {\n Self {\n value: values[0],\n counter: values[1],\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: Field,\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]\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],\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",
903
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/side_effect.nr"
904
+ },
905
+ "139": {
906
+ "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 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 hash::{NUM_FIELDS_PER_SHA256},\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",
907
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/public_circuit_public_inputs.nr"
908
+ },
909
+ "141": {
910
+ "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 NUM_FIELDS_PER_SHA256,\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 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 : Field,\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);\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);\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",
911
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/private_circuit_public_inputs.nr"
912
+ },
913
+ "144": {
914
+ "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",
915
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/function_data.nr"
916
+ },
917
+ "147": {
918
+ "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 : Field,\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,\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",
919
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/call_context.nr"
920
+ },
921
+ "153": {
922
+ "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",
923
+ "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/function_selector.nr"
924
+ },
925
+ "181": {
926
+ "source": "use dep::aztec::abi;\nuse dep::aztec::types::vec::BoundedVec;\nuse dep::aztec::context::PrivateContext;\nuse dep::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",
927
+ "path": "/usr/src/yarn-project/aztec-nr/authwit/src/entrypoint.nr"
928
+ },
929
+ "182": {
930
+ "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<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",
931
+ "path": "/usr/src/yarn-project/aztec-nr/authwit/src/account.nr"
932
+ },
933
+ "185": {
934
+ "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",
935
+ "path": "/usr/src/yarn-project/aztec-nr/authwit/src/auth_witness.nr"
936
+ },
937
+ "206": {
938
+ "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",
939
+ "path": "/usr/src/yarn-project/noir-contracts/contracts/schnorr_single_key_account_contract/src/main.nr"
940
+ },
941
+ "207": {
942
+ "source": "use dep::authwit::auth_witness;\nuse dep::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",
943
+ "path": "/usr/src/yarn-project/noir-contracts/contracts/schnorr_single_key_account_contract/src/auth_oracle.nr"
944
+ },
945
+ "208": {
946
+ "source": "use dep::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",
947
+ "path": "/usr/src/yarn-project/noir-contracts/contracts/schnorr_single_key_account_contract/src/util.nr"
948
+ }
949
+ }
950
+ }
951
+ }