@aztec/accounts 0.17.0 → 0.18.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 (44) hide show
  1. package/README.md +1 -1
  2. package/dest/artifacts/EcdsaAccount.json +85 -73
  3. package/dest/artifacts/SchnorrAccount.json +85 -73
  4. package/dest/artifacts/SchnorrSingleKeyAccount.json +74 -58
  5. package/dest/defaults/account_contract.d.ts +2 -1
  6. package/dest/defaults/account_contract.d.ts.map +1 -1
  7. package/dest/defaults/account_contract.js +1 -1
  8. package/dest/defaults/account_entrypoint.d.ts +1 -1
  9. package/dest/defaults/account_entrypoint.d.ts.map +1 -1
  10. package/dest/defaults/account_entrypoint.js +2 -2
  11. package/dest/defaults/account_interface.d.ts +2 -1
  12. package/dest/defaults/account_interface.d.ts.map +1 -1
  13. package/dest/defaults/account_interface.js +1 -1
  14. package/dest/defaults/entrypoint_payload.d.ts +1 -1
  15. package/dest/defaults/entrypoint_payload.d.ts.map +1 -1
  16. package/dest/defaults/entrypoint_payload.js +2 -2
  17. package/dest/ecdsa/account_contract.d.ts +1 -1
  18. package/dest/ecdsa/account_contract.d.ts.map +1 -1
  19. package/dest/ecdsa/account_contract.js +2 -2
  20. package/dest/ecdsa/index.d.ts +1 -1
  21. package/dest/ecdsa/index.d.ts.map +1 -1
  22. package/dest/schnorr/account_contract.d.ts +1 -1
  23. package/dest/schnorr/account_contract.d.ts.map +1 -1
  24. package/dest/schnorr/account_contract.js +2 -2
  25. package/dest/schnorr/index.d.ts +1 -1
  26. package/dest/schnorr/index.d.ts.map +1 -1
  27. package/dest/single_key/account_contract.d.ts +1 -1
  28. package/dest/single_key/account_contract.d.ts.map +1 -1
  29. package/dest/single_key/account_contract.js +2 -2
  30. package/dest/single_key/index.d.ts +1 -1
  31. package/dest/single_key/index.d.ts.map +1 -1
  32. package/dest/testing/configuration.d.ts +28 -0
  33. package/dest/testing/configuration.d.ts.map +1 -0
  34. package/dest/testing/configuration.js +61 -0
  35. package/dest/testing/create_account.d.ts +1 -1
  36. package/dest/testing/create_account.d.ts.map +1 -1
  37. package/dest/testing/create_account.js +4 -1
  38. package/dest/testing/index.d.ts +2 -2
  39. package/dest/testing/index.d.ts.map +1 -1
  40. package/dest/testing/index.js +3 -3
  41. package/package.json +7 -6
  42. package/dest/testing/sandbox.d.ts +0 -22
  43. package/dest/testing/sandbox.d.ts.map +0 -1
  44. package/dest/testing/sandbox.js +0 -48
@@ -7,7 +7,7 @@
7
7
  "isInternal": false,
8
8
  "parameters": [],
9
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==",
10
+ "bytecode": "H4sIAAAAAAAA/+Xd5XNUVxzG8U3I7qbuDU5wh9XsXdxdq9Rhy6beUqdOqTt16pS6U1daCnU3/p8+z7CZyQt4xckMZ7535pnM5MWd/ey9e/Wc3293KpXaldqzNCnNSovS3u1/XmY0/ub2b8mntY70XtZbzHWUSvVKoZ4v5tfkCtVaUs6VyrWOJJ/ky0l5bSEpFutJKalUa9VKrpovFev5znK12NlYcTrcZ8z1hDujdWR6wJ05wN1ZrSPbA+5sQHfXft/abb9P7WP/39/P3Tvw9upamgNvt6aA5j6RmJsDmvtGYu4V0NwvEnNLQHP/SMzpgOYBkZgzAc0DIzFnA5oHRWJuDWhuj8TcO6B5MNA8BGgeCjQPA5qHA80jgOaRQPMooHk00DwGaB4LNI8DmscDzROA5olAcw5ozgPNBaC5CDSXgOYy0NwBNFeA5gRorgLNk4DmyUDzFKB5KtA8DWieDjTPAJpnAs2zgObZQPMcoHku0DwPaJ4PNC8AmhcCzYuA5sVA8xKgeSnQvAxoXg40rwCaVwLNJwDNJwLNJwHNJwPNpwDNpwLNq4Dm04Dm04HmM4DmM4Hms4Dms4Hmc4Dm1UDzGqC5BjSfCzSvBZrrQHMn0Hwe0Hw+0HwB0Hwh0HwR0Hwx0HwJ0Hwp0HwZ0LwOaL4caL4CaL4SaL4KaL4aaL4GaL4WaF4PNF8HNF8PNN8ANN8INN8ENN8MNN8CNG8Amm8FmjcCzbcBzbcDzXcAzXcCzXcBzXcDzfcAzfcCzfcBzfcDzQ8AzQ8CzQ8BzZuA5oeB5keA5keB5seA5seB5ieA5ieB5s1A81NA89NA8zNA87NA83NA8/NA8wtA8xag+UWgeSvQ/BLQ/DLQ/ArQ/CrQ/BrQ/DrQ/AbQ/CbQ/BbQ/DbQ/A7Q/C7Q/B7QvA1ofh9o/gBo/hBo/gho/hho/gRo/hRo/gxo/hxo/gJo/hJo/gpo3g40fw00fxOJuTWgeQdwO38LNO8EmncBzd8Bzd8DzT9EYj4ooPnHSMwHBzT/FIn5kIDmnyMxHxrQ/Esk5sMCmn+NxHx4QPNvkZiPCGj+PRLzkQHNf0RiPiqg+c9IzEcHNP8VifmYgOa/IzEfG9D8TyTm4wKa/43EfHxA83+RmNsCmncHNLc11tPUMPdSWpS0klGyip9f+r7Q90m+b/B1tK8rfZ3l6w6fh31e8nHaxy3/jr1fezu3dftOtzf+9lH6Kv2U/soAZaAySGlXBitDlKHKMGW4MkIZqYxSRitjlLHKOGW8MkGZ6O9DySsFf89KSSkrHUpFSZSqMkmZrExRpirTlOmN73WmMkuZrcxR5irzlPnKAmWhskhZrCxRlirLlOXKCmWl4v7z7sfu/uTu1+3+1e7nvEpxv1/3v3U/WPdHdb9Q9890P8nVivsN1hT3o3N/Nvcrc/8u97Nyfyf3O3L/H/fDcX8Y90tx/xD301inuN+C+w+4Hr/r07teu+uXu573esX1nl3/2PWAXR/X9WJdP9X1RDcorje5UXE9Qtfnc706129zPTPX93K9K9d/cj0k1wdyvRzXj3E9lU2K6224/oTrMbg+gefre/6653NvVjzf1/NfPR/U8yM9X9Dz5zyfbIvi+UZbFc9H8fwMz1fw+H2PZ/f4bo939vhfj4f1+FCPl/T4QY+n26Z4vJXHH3k8jseneLyGxy/4fb7fb/t9r99/+n2g3495v/T7E79P2KH4efNOxc8j/XzOz6v8/MbPM3x/7/td3//5fsj3B75e9vWjr6d8feHzrc8/Ph77+OTfa9fyP/19vDxQuwAA",
11
11
  "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f"
12
12
  },
13
13
  {
@@ -90,7 +90,7 @@
90
90
  }
91
91
  ],
92
92
  "returnTypes": [],
93
- "bytecode": "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",
93
+ "bytecode": "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",
94
94
  "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f"
95
95
  },
96
96
  {
@@ -107,7 +107,7 @@
107
107
  }
108
108
  ],
109
109
  "returnTypes": [],
110
- "bytecode": "H4sIAAAAAAAA/+2dBXRUxxfG38adEMq/UE3d2zfJxmhLQ6mXulCqJGSXoEGCS70UKKUUKKWUUnd3d3d3d3fX/73JneZmWGiSnSX7zp13zne+nU0y7/vdfW8t82buDXleIQg3tBRQGqjYa7kPt2pyP75NpUMf6TH6LfXLw+FIRUlElaoav6SqtrLMD5fVlleqSlVWWVZXUllaGqkMV1ZU1VZV+FUqXBpR0bKq0ih1nG4vo58I7gzoIyMB3BlJzp0JfWQmgDvTMre3guM93pw9LebEbFley7nZA/Q3qKdQ3xK0Bj1mWJdCqssaSZBrTVCq13I88c32OdbDXl9+Gsu5FvnalFnvYx3Qul7zcbgeaH3QBqANQRuBNgZtAtoUtBloc9AWVJetQFuDtsGsIAUqAZWCwqAyUDmoAlQJqgL1Am0L2g60Pag3aAfK0we0I6gvaCfQzqBdQLuCdgPtDtoDtCeoH2gv0N6gfUD7gvYD7Q86AHQg6CDQwaD+oENAA0CHgg4DHQ46gmpwJGgBPZDZXvPrJt8y2O1qcj/OLdbrhx/nxrNrx9fSHK+FzTN+ns1ypHrL1yCN3Zdq1KMAlBujzwz2d9V22JR57lWz23pfPEtqEmUJdXIW/hh77D79c34smI87Hj+z2LmREeNvMul2aoy+M9h96XQ7M8bf8hplGCx+fFtTjfh+qllb7yuHZchMgiypSZQlZRVl0ceH7jfdyNKZ+82yu98Sfi557DHwjCx6y2JZcq1mCTe9bmS3I0suy5JjNUvzZ6s8u302vdbmW+4T+yhgNdH1y2M10j/PZ/UqsFyvENun7le3eT6X1WV1WV1Wl9VldVldVpfVZXVZXVaX1WV1WV1Wl9VldVldVpfVZXVZXVaX1WV1WV1Wl9VldVldVpfVZXVZXVaX1WV1WV1Wl1V21lyv9dh+7XksV2fn0/flsCx5drP4/LoY3Tde+9Ar1LJPu2PHwz4ft6+vGdUZ9L5S2e8MCLXk6p2wXM1jovk48jQjU47X+toPncP2GHLsIzdGjhzmev+57D4+rl1nzDfuS9TxnM/yVrN2Acunjy+eyfK49pWeW4l7zgnjZYNeF7bftBj8ev/697LZbX5cFbLb2rvS7Vx2XxHdzmP3dTNY+TVRfL/6fOP70pm7svv0tSRF7D59LHVj2fm5wY+/bOO+RJwvIa/1eVvN2vycyWK5EpSlJFaWVCOLhWtglHkHP+6x/z7e8s8Rqex36uh5VB8n/Jzh193p3LnG7yXimhTz3M1i++Xnbher+w03XV9TaJel6Tm8K6unPvYK2WOhfz6Cvb41sGsVNXMm62d6jJ/rLWS0q9ntLqx+3eyyNj1uq7H+q9k++H67292v4vsNkfQ+9P2p7PY0VqDuLTf/ra/OjMd7UYzf47fzjb/JZT8vSjBzN5ajmrX1vvA4GcOOqensPZPt137Oy+uSyupivk4l4nxDxK5e67qYr3H8PT9/feTHqPaiBOTrYuTT7SKWT99XwPJpDv58wt+fp1vNGi7l+9Tbyp5b+PWmtq8Pz2K1GBxp7DOusb7/kMaRkbFjQyyZTts3RtoUVkn9CPMrvfmzq74vhRHp+8wrmvlMMsuVxY9vUylG58k8TUcx9XMUaCCoBlQLGgSqA0VAUdBgUD1oCGgoaBhoOGgEaCSoATQKNBo0BjQW1AgaBxoPmgCaCJoEmgyaApoKmgaaTkUK0YOHWbK8lvZAo11jtGuN9iCjXWe0I0Y7arQHG+16oz3EaA812sOM9nCjPcJojzTaDUZ7lNEebbTHGO2xRrvRaI8z2uON9gSjPdFoTzLak432FKM91WhPM9rTvZa3WHrTJ2w1uR/f1uqciXcqpqMs9nViyO5XICuqX0dzRqK4+Wqgpb7wsaixWL+Tkr5+TV2r2vj7KiFmNchi/WYkc/3C/+ZUdfH15TNmFbFYv5OTtX4lrXKqaMf78g1mNdhi/WYmYf3Ko8vlVPUd66syBrMaYrF+s5KtfpUxc6qh7e+rYgXMapjF+s1OpvpVrDCnGt6+vkpWwqxGWKzfKclSv4qV5lQj297XoP9gVg0W6zcnGepX8Z851ai29eW3gVmNtli/Uzu7fn6bcqox/91XWRuZ1ViL9ZvbmfULtzmnalxpX+FoO5jVOIv1O62z6lfRrpxq/Ir7qmwns5pgsX7zOqF+VdF251QTY/fld4BZTbJYv9NXdf38DuVUk5fvS3WQWU2xWL/5q7J+dR3Oqaa27qs0DmY1zWL9Fqyi+pVE48qppnv2vkvk39nFW7+Fq6h+fnybsvg9m5phsX5nBKR+Fr8nUjMt1m9RQOpn8XsONdti/c4MSP0sfk5XcyzWb3FA6mfxc6aaa7F+ZwWkfhY/J6l5Fuu3JCD1s/g+X823WL+zA1I/i+9T1UKL9VsakPpZfJ+lFlms3zkBqZ/F9wlqscX6LQtI/Sy+zqklFut3bkDqZ/F5Wi21WL/zAlI/i88zapnF+p0fkPpZPE+UxWNG2awfjmfDQae43Bku37Y2ue4flzvDcW7rei3L76GvR74++QbkG5JvRL4x+Sbkm5JvRr45+RbkW5JvRb41+TbkPrkiLyEvJQ+Tl5GXk1eQV5JXkfci35Z8O/LtyXuT70BeTd6HfEfyvuQ7ke9Mvgv5ruS7ke9Ovgf5nuT9yPci35t8H/J9yfcj35/8APIDyQ8iP5i8P/kh5APIDyU/jPxw8iO81sst6vGOehykHh+px03q8ZR6nKUef6nHZerxmnocpx7fqcd96vGgepyoHj+qx5Xq8aZ6HKoen6rHrerxrHqcaz25Hherx8vqcbR6fK0ed1tLXkM+kFyP6z3aa73ZHh99tGfv+TVEmfXzoXluH0mOQ/+PMbhSDK54s6RYrNEx9vryg7485bHkx3mtl6c8HnQC6ETQSaAZoJNBM0GzQLNBp4DmgE4FzQWdBpoHOh00H7QAtBB0BmgR6EzQYtBZoCWgs0FLQeeAloHOBZ0HOh90AehC0EWgi0GXgC4FXQa6HHQF6ErQVaCrQdeArgVdB7oedAPoRtBNoJtBt4BuBd0Guh10B+hO0F2gu0H3gO4F3Qe6n2rwgOeWp8TNLU+ZmCyhTs7CH2OP3eeWp3TLU7rlKd3ylHwahLZkcctTuuUpXVaX1WV1WV1Wl9VldVldVpfVZXVZXVaX1WV1WV1Wl9VldVldVpfVZXVZXVaX1WV1WV1Wl9VldVldVpfVZXVZXVaX1WV1WV3WYGV1y1M2b255ypYN++DjyN3ylG3LG/Lc8pTYh1uesnnjx1+2cV8izpeQ57nlKb3Wr119PLc8Zds2tzylH+eG+3XLU7rlKXld3PKUy+dzy1O2v25ZrBaClqcM0c6P9ZqnLjnOaz1NEU57gaU5gfxE8pPIZ5CfTD6TfBb5bPJTyOeQn0o+l/w08nnkp5PPJ19AvpD8DPJF5GeSLyY/i3wJ+dnkS8nPIV9Gfi75eeTnk19AfiH5ReQXk19Cfin5ZeSXk19BfiX5VeRXk19Dfi35deTXk99AfiP5TeQ3k99Cfiv5beS3k99Bfif5XeR3k99Dfi/5feT3e26aIj5N0YNe602fkNXkfnybepD1ZXuaIvPcfsBrmaboIYMrxeBKpmmKHrLXl7+yxzJe5oct5IxUltfUhqPRROZ8xLP79mxFx5Af36ZCFpkf9RJzDNlmTrHI/FhAmFMtMj8eEOY0i8xPBIQ53SLzkwFhzrDI/FRAmDMtMj8dEOYsi8zPBIR5TYvMzwaE+WGLzM8FhLmnRebnBTK/IJD5RYHMLwlkflkg8ysCmV8VyPyaQObXBTK/IZD5TYHMbwlkflsg8zsCmd8VyPyeQOb3BTJ/IJD5Q4HMHwlk/lgg8ycCmT8VyPyZQObPBTJ/IZD5S4HMXwlk/log8zcCmb8VyPydQObvBTL/IJD5R4HMPwlk/lkg8y8CmX8VyPybQObfBTL/IZD5T4HMfwlk/lsg8z8CmfEiNWnMIYHMKQKZUwUypwlkThfInCGQOVMgc5ZA5myBzDkCmXMFMucJZM4XyFwgkLmLQOZCgcxdBTIXCWTuJpB5NYHM3QUy/08g8+oCmXsIZO4pkHkNgcxrCmReSyDz2gKZ1xHIvK5A5mKBzOsJZF5fIPMGApk3FMi8kUDmjQUybyKQeVOBzJsJZN5cIPMWApm3FMi8lUDmrQUybyOQ2RfIrAQylwhkLhXIHBbIXCaQuVwgc4VA5kqBzFUCmXsJZN5WIPN2Apm3F8jcWyDzDgKZqwUy9xHIvKNA5r4CmXcSyLyzQOZdBDLvKpB5N4HMuwtk3kMg854CmfsJZN5LIPPeApn3Eci8r0Dm/QQy7y+Q+QCBzAcKZD5IIPPBApn7C2Q+RCDzAIHMhwpkPkwg8+ECmY8QyHykQOajBDIPFMhcI5C5ViDzIIHMdQKZIwKZowKZBwtkrhfIPEQg81CBzMMEMg8XyDxCIPPIgDA/YpG5QeDjPEog82iBzGMEMo8VyNwokHlcQJizLTKPDwhzjkXmCQFhzrXIPDEgzHkWmScFhDnfIvPkgDAXWGSeEhDmLhaZpwaEudAi87SAMHe1yDw9IMxFFpmPDghzN4vMxwSEeTWLzMcGhLm7RebjAsL8P4vMxweEeXWLzCdYZO5B/YSIORWUBkoHZYAyQVkg/FyIn5PwcwO+j8b3lfg+C9934Oswvi7h8zQ+b+F5jMc1Ps7I3YPV9S7yR0GPgR4HPQF6EvQU6GnQM6BnQc+Bnge9AHoR9BLoZdAroFdBr4FeB70BehP0Fuht0Dugd0Hvgd4HfQD6EPQR6GPQJ6BPQZ+BPgd9AfoS9BXoa9A3oG9B34G+B/0A+hH0E+hn0C+gX0G/gX4H/QH6E/QX6G/QP1RQXIMe12THNcpxzW5cwxrXdMY1jnHNX1wDF9eExTVScc1QXEMT15TENRZxzUFcgw/XpMM12nDNMlzDC9e0wjWecM0jXAMI18TBNWJwzRRcQwTX1MA1JnDNBVyDAOfkxznqcc52nMMc5/TGOa5xzmecAxnnBMY5cnHOWJxDFecUxTk2cc5JnIMR5yTEOfpwzjqcww3nNMM5vnDOK5wDCudEwjmCcM4cnEMG51RpmmMEhHNQ4JwMOEcBXrOP17DjNd14jTNe84vXwOI1oXiNJF4ziNfQ4TVleI0VXnOE1+DgNSl4jQZes4Bj+HFMO47xxjHPOAYYx8TiGFEcM4ljCHFMHY4xwzFXOAYJx+TgGBUcs4FjGPB/+vg/bvyfL/4PFP8niP8jw/8Z4f9Q8H8K+B07fueM38Hid5L4HR1+Z4Xf4eB3GvgZHz/z4mdA/EyEnxHwPTO+h8T3VPgeA19z8TUIn5PxOQrP2RR2rmXSbcyG21rUrmlsjIwY1Vjc2FBcU1dXPGFIY31xw/jImOjwBtyt168Df/d/Ks8kafp5AQA=",
110
+ "bytecode": "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",
111
111
  "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f"
112
112
  },
113
113
  {
@@ -217,7 +217,9 @@
217
217
  {
218
218
  "name": "start_side_effect_counter",
219
219
  "type": {
220
- "kind": "field"
220
+ "kind": "integer",
221
+ "sign": "unsigned",
222
+ "width": 32
221
223
  }
222
224
  }
223
225
  ]
@@ -323,7 +325,9 @@
323
325
  {
324
326
  "name": "counter",
325
327
  "type": {
326
- "kind": "field"
328
+ "kind": "integer",
329
+ "sign": "unsigned",
330
+ "width": 32
327
331
  }
328
332
  }
329
333
  ]
@@ -354,7 +358,9 @@
354
358
  {
355
359
  "name": "counter",
356
360
  "type": {
357
- "kind": "field"
361
+ "kind": "integer",
362
+ "sign": "unsigned",
363
+ "width": 32
358
364
  }
359
365
  }
360
366
  ]
@@ -456,7 +462,7 @@
456
462
  ]
457
463
  }
458
464
  ],
459
- "bytecode": "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",
465
+ "bytecode": "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",
460
466
  "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f"
461
467
  },
462
468
  {
@@ -573,7 +579,9 @@
573
579
  {
574
580
  "name": "start_side_effect_counter",
575
581
  "type": {
576
- "kind": "field"
582
+ "kind": "integer",
583
+ "sign": "unsigned",
584
+ "width": 32
577
585
  }
578
586
  }
579
587
  ]
@@ -679,7 +687,9 @@
679
687
  {
680
688
  "name": "counter",
681
689
  "type": {
682
- "kind": "field"
690
+ "kind": "integer",
691
+ "sign": "unsigned",
692
+ "width": 32
683
693
  }
684
694
  }
685
695
  ]
@@ -710,7 +720,9 @@
710
720
  {
711
721
  "name": "counter",
712
722
  "type": {
713
- "kind": "field"
723
+ "kind": "integer",
724
+ "sign": "unsigned",
725
+ "width": 32
714
726
  }
715
727
  }
716
728
  ]
@@ -812,7 +824,7 @@
812
824
  ]
813
825
  }
814
826
  ],
815
- "bytecode": "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",
827
+ "bytecode": "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",
816
828
  "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f"
817
829
  }
818
830
  ],
@@ -820,130 +832,134 @@
820
832
  "debug": {
821
833
  "debugSymbols": [
822
834
  "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/fDqMurk1bXV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",
826
- "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xxyuYw7XMYfrmMN1zOE65nAdc7iOOVzHHK5jDtcxh+uYw3XM4TrmcB1zuI45XMccrmMO1zGH65jDdczhOuZwHXO4jjlcxxyuYw7XMYfrmMN1zOE65nAdc7iOOVzHHK5jDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMONzCHG5jDDczhBuZwA3O4gTncwBxuYA43MIcbmMMNzOEG5nADc7iBOdzAHG5gDjcwhxuYww3M4QbmcANzuIE53MAcbmAONzCHG5jDDczhBuZwA3O4gTncwBxuYA43MIcbmMMNzOEG5nADc7iBOdzAHG5gDjcwhxuYww3M4QbmcANzuIE53MAcbmAONzCHG5jDDczhBuZwA3O4gTncwBxuYA43MIcbmMMNzOEG5nADc7iBOdzAHG5gDjcwhxuYww3M4QbmcANzuIE53MAcbmAONzCHG5jDDczhBuZwA3O4gTncwBxuYA43MIcbmMMNzOEG5nADc7iBOdzAHG5gDjcwhxuYww3M4QbmcANzuIE53MAcbmAONzCHG5jDDczhBuZwE3O4iTncxBxuYg43MYebmMNNzOEm5nATc7iJOdzEHG5iDjcxh5uYw03M4SbmcBNzuIk53MQcbmIONzGHm5jDTczhJuZwE3O4iTncxBxuYg43MYebmMNNzOEm5nATc7iJOdzEHG5iDjcxh5uYw03M4SbmcBNzuIk53MQcbmIONzGHm5jDTczhJuZwE3O4iTncxBxuYg43MYebmMNNzOEm5nATc7iJOdzEHG5iDjcxh5uYw03M4SbmcBNzuIk53MQcbmIONzGHm5jDTczhJuZwE3O4iTncxBxuYg43MYebmMNNzOEm5nATc7iJOdzEHG5i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"
835
+ "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",
836
+ "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",
837
+ "eJzdnd2uK7lxRt/lXA8CkVX8qXmVIBdG4gAGDDuIfWfMu7snaGmfwbCt/o5aFFeuPNgQ2x+HW1U9a3et/se3P//1P//w9z/99S9/+/bzP77d/q3dvv387//49rf/+cNffv3B3/7+h//9+7efbz99++Nf/mv7319++vbff/rzH7/9nFP+5T9++nVBUhdkdYGpC1xdUNQF9fyCn373udRq3T+aWvjj037br97eevX+1qvHO6/ehd/OH7i68Kv8A1cXfu9/4OrCl+QHri58o37g6sLX7weu/tbvan/rd7W/9bva3/pdjbd+V+Ot39V463c13vpdjbd+V+Ot39V46buab7eyfzTfcvv+6qMobo8o/hUl3XzP8tI3++IsL9WBi7O8VDWuzZJuLxWZq8O8VJOuDvNSCbs6zEsV7+owLxXIq8O8VE+vDrNQ+U23hepvui1UgNNtpQqcVqrAaaUKnFaqwGmlCpxWqsBppQqcVqrAaaUKnFaqwGmlCpxXqsB5pQqcV6rAeaUKnFeqwHmlCpxXqsB5pQqcV6rAeaUKbCtVYFupAttKFdhWqsC2UgW2lSqwrVSBbaUKbCtVYFupAvtKFdhXqsC+UgX2lSqwr1SBfaUK7CtVYF+pAvtKFdhXqsBlpQpcVqrAZaUKXFaqwGWlClxWqsBlpQpcVqrAZaUKXFaqwHWlClxXqsB1pQpcV6rAdaUKXFeqwHWlClxXqsB1pQpcV6rAyvDE+8OsVIGVoY/3h1mpAr827CGGift1U09pFGbmV/tZmNfGMaQw2R/HtP3j6Jhem964Osy8X+ATYebdQpwIM+8W4kSYebcQfftPkf3Dfbv3fnw4+j3LvDLzPMu8KpO99fuHi/XfHJL26T36vNuNq6O/No/zxujpFu1+7ZRuFqPwM3vB5eFn9o7Lw6uzsUkZ4tlXCMVpXyGUkH2F8M39vxVZmS3ZV6iz0FmZ0thXqNPQ+SY06H2FeuZZmRzYV6hnnpVn8PcV8pkrT7PvK+QzV54L31fIZ648Yb2vkM9ceVZ5XyGfufLU775CPnPl+dl9hXzmypOo+wr5zJVnOvcV8pkrT0fuK+QzV54z3FfIZ648sbevkM9cefZtXyGfufIU2b5CPnPleax9hXzmypNN+wr5zJVnhPYV8pkrT9vsK+QzV55b2VfIZ648AbKvkM9ceZZiXyGfufJUwr5CPnPl7/v7CvnMlb+U7yvkM1f+5ryvkM9c+evtvkI+c+XvoPsK+cyVvyjuK+QzV/42t6+Qz1z5K9e+Qj5z5e9F+wr5zGVtVZa9VVkWV2XZXJVldVWW3VVZkVftK+QzV/6QsK+Qz1yRQe0r5DNXsP++Qj5zBaDvK+QzV1D0vkI+cwXr7ivkM1cg5r5CPnMF1+0r5DNXJD37CvnMZQ6XZQ6XZQ6XZQ5nMoczmcOZzOFM5nAmcziTOZzJHM5kDmcyhzOZw5nM4UzmcCZzOJM5nMkczmQOZzKHM5nDmczhTOZwJnM4kzmcyRzOZA5nMoczmcOZzOFM5nAmcziTOZzJHM5kDmcyhzOZw5nM4UzmcCZzOJM5nMkczmQOZzKHM5nDmczhTOZwJnM4kzmcyRzOZA5nMoczmcOZzOFM5nAmcziTOZzJHM5kDmcyhzOZw5nM4UzmcCZzOJM5nMkczmQOZzKHM5nDmczhTOZwJnM4kzmcyRzOZA5nMoczmcOZzOFM5nAmcziTOZzJHM5kDmcyhzOZw5nM4UzmcCZzOJM5nMkczmQOZzKHM5nDmczhTOZwJnM4kzmcyRzOZA5nMoczmcOZzOFM5nAucziXOZzLHM5lDucyh3OZw7nM4VzmcC5zOJc5nMsczmUO5zKHc5nDuczhXOZwLnM4lzmcyxzOZQ7nModzmcO5zOFc5nAucziXOZzLHM5lDucyh3OZw7nM4VzmcC5zOJc5nMsczmUO5zKHc5nDuczhXOZwLnM4lzmcyxzOZQ7nModzmcO5zOFc5nAucziXOZzLHM5lDucyh3OZw7nM4VzmcC5zOJc5nMsczmUO5zKHc5nDuczhXOZwLnM4lzmcyxzOZQ7nModzmcO5zOFc5nAucziXOZzLHM5lDucyh3OZw7nM4VzmcC5zOJc5nMsczmUO5zKHc5nDuczhXOZwLnM4lzmcyxzOZQ7nModzmcO5zOFc5nAucziXOZzLHM5lDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldkDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDldlDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdkDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdlDtdl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dVpz47O77vV+rLnx2V33eo/V3Pjsrst2UyW2myqx3VSJ7aZKbDdVYrupEttNldhuqsR2UyW2myqx3VSJ7aZKbDdVYrupEttNldhuqsR2UyW2myqx3VSJ7aZKbDdVYrupEttNldhuqsR2UyW2myqx3VSJ7aZKbDdVYrupEttNldhuqsR2UyW2myqx3VSJ7aZKbDdVYrupEttNldhuqsR2UyW2myqx3VSJ7aZKbDdVYrupEttNldhuqsR2UyW2myqx3VSJ7aZKbDdVYrupEttNldhuqsR2UyW2myqz3VSZ7abKbDdVZrup8m3truuPHJ7i+/iD67Z+v2z/Slxuj52u3aCv3OnavfzKna7d9n9sp1FGO137DuHKna59M3HhTq+3tOQnO418v3S0r8+6jcLfot2vnNLt+3+JN3/s4PKzmr2D610t03dw+e3f9B1cfgc4fQeX3wRO38Hl94HTd3D5/d30HVx+3zZ9B5ffj03fAb4nX69xmb2D600u03eA78nX+1ym7wDfk6+3ukzfwfSevP2ft69U/q/30Gu6bzf1Jxfudv9s96/P+gOkXS+BWXer07v857Y6/Xbgc1udft/wsa1eL61Zd6vsPw6xBTeZLbjJbMFNZgtuMltwk9mCm8wW3GS24CazBTeZLbjJbMFNZgtuMltwk9mCm8wW3GS24CazBTeZLbjJbMFNZgtuMltwk9mCm8wW3GS24CazBTeZLbjJbMFNZgtuMltwk9mCm8wW3GS24CazBTeZLbjJbMFNZgtuMltwk9mCm8wW3GS24CazBTeZLbjJbMFNZgtuMltwk9mCm8wW3GS24CazBTeZLbjJbMFNZgtuMltwk9mCm8wW3GS24CazBTeZLbgxtuDG2IIbYwtujC24sRu669ri1pqn8dFd1xb3yzyNj+66trgJ5ln8xO66id11E7vrJnbXTeyum9hdN7G7bmJ33eu1XnPjs7vu9UKvufHZXfd6ldfc+Oyue73Ea258dte9Xt81Nz67614v7pobn911r1d2zY3P7rrXy7rmxmd33es1XXPjs7vu9d6tufHZXfd6P9bc+Oyue73Ham58dtdlu6mM7aYytpvK2G4qY7upjO2mMrabythuKmO7qYztpjK2m8rYbipju6mM7aYytpvK2G4qY7upjO2mMrabythuKmO7qYztpjK2m8rYbipju6mM7aYytpvK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",
838
+ "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1zGH65jDdczhOuZwHXO4jjlcxxyuYw7XMYfrmMN1zOE65nAdc7iOOVzHHK5jDtcxh+uYw3XM4TrmcB1zuI45XMccrmMO1zGH65jDdczhOuZwHXO4jjlcxxyuYw7XMYfrmMMNzOEG5nADc7iBOdzAHG5gDjcwhxuYww3M4QbmcANzuIE53MAcbmAONzCHG5jDDczhBuZwA3O4gTncwBxuYA43MIcbmMMNzOEG5nADc7iBOdzAHG5gDjcwhxuYww3M4QbmcANzuIE53MAcbmAONzCHG5jDDczhBuZwA3O4gTncwBxuYA43MIcbmMMNzOEG5nADc7iBOdzAHG5gDjcwhxuYww3M4QbmcANzuIE53MAcbmAONzCHG5jDDczhBuZwA3O4gTncwBxuYA43MIcbmMMNzOEG5nADc7iBOdzAHG5gDjcwhxuYww3M4QbmcANzuIE53MAcbmAONzCHG5jDDczhBuZwA3O4gTncwBxuYA43MIcbmMMNzOEG5nADc7iBOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI453MQcbmIONzGHm5jDTczhJuZwE3O4iTncxBxuYg43MYebmMNNzOEm5nATc7iJOdzEHG5iDjcxh5uYw03M4SbmcBNzuIk53MQcbmIONzGHm5jDTczhJuZwE3O4iTncxBxuYg43MYebmMNNzOEm5nATc7iJOdzEHG5iDjcxh5uYw03M4SbmcBNzuIk53MQcbmIONzGHm5jDTczhJuZwE3O4iTncxBxuYg43MYebmMNNzOEm5nATc7iJOdzEHG5iDjcxh5uYw03M4SbmcBNzuIk53MQcbmIONzGHm5jDTczhJuZwE3O4iTncxBxuYg43MYeb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"
827
839
  ],
828
840
  "fileMap": {
829
841
  "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",
842
+ "source": "impl Field {\n pub fn to_le_bits(self: Self, bit_size: u32) -> [u1] {\n crate::assert_constant(bit_size);\n self.__to_le_bits(bit_size)\n }\n \n pub fn to_be_bits(self: Self, bit_size: u32) -> [u1] {\n crate::assert_constant(bit_size);\n self.__to_be_bits(bit_size)\n }\n\n #[builtin(to_le_bits)]\n fn __to_le_bits(_self: Self, _bit_size: u32) -> [u1] {}\n \n #[builtin(to_be_bits)]\n fn __to_be_bits(_self: Self, _bit_size: u32) -> [u1] {}\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(_self: Self, _bit_size: u32) {}\n\n pub fn assert_max_bit_size(self: Self, bit_size: u32) {\n crate::assert_constant(bit_size);\n assert(bit_size < modulus_num_bits() as u32);\n self.__assert_max_bit_size(bit_size);\n }\n\n pub fn to_le_bytes(self: Self, byte_size: u32) -> [u8] {\n self.to_le_radix(256, byte_size)\n }\n\n pub fn to_be_bytes(self: Self, byte_size: u32) -> [u8] {\n self.to_be_radix(256, byte_size)\n }\n\n\n pub fn to_le_radix(self: Self, radix: u32, result_len: u32) -> [u8] {\n crate::assert_constant(radix);\n crate::assert_constant(result_len);\n self.__to_le_radix(radix, result_len)\n }\n\n pub fn to_be_radix(self: Self, radix: u32, result_len: u32) -> [u8] {\n crate::assert_constant(radix);\n crate::assert_constant(result_len);\n self.__to_be_radix(radix, result_len)\n }\n\n\n\n // decompose `_self` into a `_result_len` vector over the `_radix` basis\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(_self: Self, _radix: u32, _result_len: u32) -> [u8] {}\n \n #[builtin(to_be_radix)]\n fn __to_be_radix(_self: Self, _radix: u32, _result_len: u32) -> [u8] {}\n\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b = exponent.to_le_bits(32);\n\n for i in 1..33 {\n r *= r;\n r = (b[32-i] as Field) * (r * self) + (1 - b[32-i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x ∈ {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n}\n\n#[builtin(modulus_num_bits)]\npub fn modulus_num_bits() -> Field {}\n\n#[builtin(modulus_be_bits)]\npub fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub fn modulus_le_bytes() -> [u8] {}\n// Convert a 32 byte array to a field element\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n",
831
843
  "path": "std/field.nr"
832
844
  },
833
845
  "27": {
834
846
  "source": "struct Option<T> {\n _is_some: bool,\n _value: T,\n}\n\nimpl<T> Option<T> {\n /// Constructs a None value\n pub fn none() -> Self {\n Self { _is_some: false, _value: crate::unsafe::zeroed() }\n }\n\n /// Constructs a Some wrapper around the given value\n pub fn some(_value: T) -> Self {\n Self { _is_some: true, _value }\n }\n\n /// True if this Option is None\n pub fn is_none(self) -> bool {\n !self._is_some\n }\n\n /// True if this Option is Some\n pub fn is_some(self) -> bool {\n self._is_some\n }\n\n /// Asserts `self.is_some()` and returns the wrapped value.\n pub fn unwrap(self) -> T {\n assert(self._is_some);\n self._value\n }\n\n /// Returns the inner value without asserting `self.is_some()`\n /// Note that if `self` is `None`, there is no guarantee what value will be returned,\n /// only that it will be of type `T`.\n pub fn unwrap_unchecked(self) -> T {\n self._value\n }\n\n /// Returns the wrapped value if `self.is_some()`. Otherwise, returns the given default value.\n pub fn unwrap_or(self, default: T) -> T {\n if self._is_some {\n self._value\n } else {\n default\n }\n }\n\n /// Returns the wrapped value if `self.is_some()`. Otherwise, calls the given function to return\n /// a default value.\n pub fn unwrap_or_else<Env>(self, default: fn[Env]() -> T) -> T {\n if self._is_some {\n self._value\n } else {\n default()\n }\n }\n\n /// If self is `Some(x)`, this returns `Some(f(x))`. Otherwise, this returns `None`.\n pub fn map<U, Env>(self, f: fn[Env](T) -> U) -> Option<U> {\n if self._is_some {\n Option::some(f(self._value))\n } else {\n Option::none()\n }\n }\n\n /// If self is `Some(x)`, this returns `f(x)`. Otherwise, this returns the given default value.\n pub fn map_or<U, Env>(self, default: U, f: fn[Env](T) -> U) -> U {\n if self._is_some {\n f(self._value)\n } else {\n default\n }\n }\n\n /// If self is `Some(x)`, this returns `f(x)`. Otherwise, this returns `default()`.\n pub fn map_or_else<U, Env1, Env2>(self, default: fn[Env1]() -> U, f: fn[Env2](T) -> U) -> U {\n if self._is_some {\n f(self._value)\n } else {\n default()\n }\n }\n\n /// Returns None if self is None. Otherwise, this returns `other`.\n pub fn and(self, other: Self) -> Self {\n if self.is_none() {\n Option::none()\n } else {\n other\n }\n }\n\n /// If self is None, this returns None. Otherwise, this calls the given function\n /// with the Some value contained within self, and returns the result of that call.\n ///\n /// In some languages this function is called `flat_map` or `bind`.\n pub fn and_then<U, Env>(self, f: fn[Env](T) -> Option<U>) -> Option<U> {\n if self._is_some {\n f(self._value)\n } else {\n Option::none()\n }\n }\n\n /// If self is Some, return self. Otherwise, return `other`.\n pub fn or(self, other: Self) -> Self {\n if self._is_some {\n self\n } else {\n other\n }\n }\n\n /// If self is Some, return self. Otherwise, return `default()`.\n pub fn or_else<U, Env>(self, default: fn[Env]() -> Self) -> Self {\n if self._is_some {\n self\n } else {\n default()\n }\n }\n\n // If only one of the two Options is Some, return that option.\n // Otherwise, if both options are Some or both are None, None is returned.\n pub fn xor(self, other: Self) -> Self {\n if self._is_some {\n if other._is_some {\n Option::none()\n } else {\n self\n }\n } else if other._is_some {\n other\n } else {\n Option::none()\n }\n }\n\n /// Returns `Some(x)` if self is `Some(x)` and `predicate(x)` is true.\n /// Otherwise, this returns `None`\n pub fn filter<Env>(self, predicate: fn[Env](T) -> bool) -> Self {\n if self._is_some {\n if predicate(self._value) {\n self\n } else {\n Option::none()\n }\n } else {\n Option::none()\n }\n }\n\n /// Flattens an Option<Option<T>> into a Option<T>.\n /// This returns None if the outer Option is None. Otherwise, this returns the inner Option.\n pub fn flatten(option: Option<Option<T>>) -> Option<T> {\n if option._is_some {\n option._value\n } else {\n Option::none()\n }\n }\n}\n",
835
847
  "path": "std/option.nr"
836
848
  },
837
- "39": {
849
+ "40": {
838
850
  "source": "use dep::protocol_types::{\n abis::{\n block_header::BlockHeader,\n call_context::CallContext,\n private_circuit_public_inputs::PrivateCircuitPublicInputs,\n public_circuit_public_inputs::PublicCircuitPublicInputs,\n },\n contrakt::deployment_data::ContractDeploymentData,\n hash::hash_args,\n};\n\n// docs:start:private-global-variables\nstruct PrivateGlobalVariables {\n chain_id: Field,\n version: Field,\n}\n// docs:end:private-global-variables\n\nimpl PrivateGlobalVariables {\n fn serialize(self) -> [Field; 2] {\n [self.chain_id, self.version]\n }\n}\n\n// docs:start:public-global-variables\nstruct PublicGlobalVariables {\n chain_id: Field,\n version: Field,\n block_number: Field,\n timestamp: Field,\n}\n// docs:end:public-global-variables\n\nimpl PublicGlobalVariables {\n fn serialize(self) -> [Field; 4] {\n [self.chain_id, self.version, self.block_number, self.timestamp]\n }\n}\n\n// PrivateContextInputs are expected to be provided to each private function\n// docs:start:private-context-inputs\nstruct PrivateContextInputs {\n call_context : CallContext,\n block_header: BlockHeader,\n contract_deployment_data: ContractDeploymentData,\n private_global_variables: PrivateGlobalVariables,\n}\n// docs:end:private-context-inputs\n\n// PublicContextInputs are expected to be provided to each public function\n// docs:start:public-context-inputs\nstruct PublicContextInputs {\n call_context: CallContext,\n block_header: BlockHeader,\n\n public_global_variables: PublicGlobalVariables,\n}\n// docs:end:public-context-inputs\n\nstruct Hasher {\n fields: [Field],\n}\n\nimpl Hasher {\n pub fn new()-> Self {\n Self { fields: [] }\n }\n\n pub fn add(&mut self, field: Field) {\n self.fields = self.fields.push_back(field);\n }\n\n pub fn add_multiple<N>(&mut self, fields: [Field; N]) {\n for i in 0..N {\n self.fields = self.fields.push_back(fields[i]);\n }\n }\n\n pub fn hash(self) -> Field {\n hash_args(self.fields)\n }\n}\n",
839
851
  "path": "/usr/src/yarn-project/aztec-nr/aztec/src/abi.nr"
840
852
  },
841
- "41": {
853
+ "42": {
842
854
  "source": "use crate::context::{Context};\nuse crate::oracle::storage::storage_read;\nuse crate::oracle::storage::storage_write;\nuse crate::types::type_serialization::TypeSerializationInterface;\nuse dep::std::option::Option;\n\n// docs:start:public_state_struct\nstruct PublicState<T, T_SERIALIZED_LEN> {\n context: Context,\n storage_slot: Field,\n serialization_methods: TypeSerializationInterface<T, T_SERIALIZED_LEN>,\n}\n// docs:end:public_state_struct\n\nimpl<T, T_SERIALIZED_LEN> PublicState<T, T_SERIALIZED_LEN> {\n // docs:start:public_state_struct_new\n pub fn new(\n // Note: Passing the contexts to new(...) just to have an interface compatible with a Map.\n context: Context,\n storage_slot: Field,\n serialization_methods: TypeSerializationInterface<T, T_SERIALIZED_LEN>,\n ) -> Self {\n assert(storage_slot != 0, \"Storage slot 0 not allowed. Storage slots must start from 1.\");\n PublicState {\n context,\n storage_slot,\n serialization_methods,\n }\n }\n // docs:end:public_state_struct_new\n\n // docs:start:public_state_struct_read\n pub fn read(self) -> T {\n assert(self.context.private.is_none(), \"Public state writes only supported in public functions\");\n storage_read(self.storage_slot, self.serialization_methods.deserialize)\n }\n // docs:end:public_state_struct_read\n\n // docs:start:public_state_struct_write\n pub fn write(self, value: T) {\n assert(self.context.private.is_none(), \"Public state writes only supported in public functions\");\n let serialize = self.serialization_methods.serialize;\n let fields = serialize(value);\n storage_write(self.storage_slot, fields);\n }\n // docs:end:public_state_struct_write\n}\n",
843
855
  "path": "/usr/src/yarn-project/aztec-nr/aztec/src/state_vars/public_state.nr"
844
856
  },
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",
857
+ "43": {
858
+ "source": "use crate::context::{PrivateContext, PublicContext, Context};\nuse dep::std::option::Option;\nuse dep::protocol_types::{\n hash::pedersen_hash,\n traits::{ToField}\n};\n\n// docs:start:map\nstruct Map<K, V> {\n context: Context,\n storage_slot: Field,\n state_var_constructor: fn(Context, Field) -> V,\n}\n// docs:end:map\n\nimpl<K, V> Map<K, V> {\n // docs:start:new\n pub fn new(\n context: Context,\n storage_slot: Field,\n state_var_constructor: fn(Context, Field) -> V,\n ) -> Self {\n assert(storage_slot != 0, \"Storage slot 0 not allowed. Storage slots must start from 1.\");\n Map {\n context,\n storage_slot,\n state_var_constructor,\n }\n }\n // docs:end:new\n\n // docs:start:at\n pub fn at(self, key: K) -> V where K: ToField {\n // TODO(#1204): use a generator index for the storage slot\n let derived_storage_slot = pedersen_hash([self.storage_slot, key.to_field()],0);\n\n let state_var_constructor = self.state_var_constructor;\n state_var_constructor(self.context, derived_storage_slot)\n }\n // docs:end:at\n}\n",
847
859
  "path": "/usr/src/yarn-project/aztec-nr/aztec/src/state_vars/map.nr"
848
860
  },
849
- "48": {
861
+ "50": {
850
862
  "source": "use crate::types::type_serialization::TypeSerializationInterface;\n\nglobal BOOL_SERIALIZED_LEN: Field = 1;\n\nfn deserializeBool(fields: [Field; BOOL_SERIALIZED_LEN]) -> bool {\n fields[0] as bool\n}\n\nfn serializeBool(value: bool) -> [Field; BOOL_SERIALIZED_LEN] {\n [value as Field]\n}\n\nglobal BoolSerializationMethods = TypeSerializationInterface {\n deserialize: deserializeBool,\n serialize: serializeBool,\n};\n",
851
863
  "path": "/usr/src/yarn-project/aztec-nr/aztec/src/types/type_serialization/bool_serialization.nr"
852
864
  },
853
- "50": {
865
+ "52": {
854
866
  "source": "struct BoundedVec<T, MaxLen> {\n storage: [T; MaxLen],\n len: Field,\n}\n\nimpl<T, MaxLen> BoundedVec<T, MaxLen> {\n pub fn new(initial_value: T) -> Self {\n BoundedVec { storage: [initial_value; MaxLen], len: 0 }\n }\n\n pub fn get(mut self: Self, index: Field) -> T {\n assert(index as u64 < self.len as u64);\n self.storage[index]\n }\n\n pub fn get_unchecked(mut self: Self, index: Field) -> T {\n self.storage[index]\n }\n\n pub fn push(&mut self, elem: T) {\n assert(self.len as u64 < MaxLen as u64);\n\n self.storage[self.len] = elem;\n self.len += 1;\n }\n\n pub fn push_array<Len>(&mut self, array: [T; Len]) {\n let newLen = self.len + array.len();\n assert(newLen as u64 <= MaxLen as u64);\n for i in 0..array.len() {\n self.storage[self.len + i] = array[i];\n }\n self.len = newLen;\n }\n\n pub fn pop(&mut self) -> T {\n assert(self.len as u64 > 0);\n\n let elem = self.storage[self.len - 1];\n self.len -= 1;\n elem\n }\n\n pub fn any<Env>(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n let mut exceeded_len = false;\n for i in 0..MaxLen {\n exceeded_len |= i == self.len;\n if (!exceeded_len) {\n ret |= predicate(self.storage[i]);\n }\n }\n ret\n }\n}\n\n#[test]\nfn test_vec_push_pop() {\n let mut vec: BoundedVec<Field, 3> = BoundedVec::new(0);\n assert(vec.len == 0);\n vec.push(2);\n assert(vec.len == 1);\n vec.push(4);\n assert(vec.len == 2);\n vec.push(6);\n assert(vec.len == 3);\n let x = vec.pop();\n assert(x == 6);\n assert(vec.len == 2);\n assert(vec.get(0) == 2);\n assert(vec.get(1) == 4);\n}\n\n#[test]\nfn test_vec_push_array() {\n let mut vec: BoundedVec<Field, 3> = BoundedVec::new(0);\n vec.push_array([2, 4]);\n assert(vec.len == 2);\n assert(vec.get(0) == 2);\n assert(vec.get(1) == 4);\n}\n\n#[test(should_fail)]\nfn test_vec_get_out_of_bound() {\n let mut vec: BoundedVec<Field, 2> = BoundedVec::new(0);\n vec.push_array([2, 4]);\n let _x = vec.get(2);\n}\n\n#[test(should_fail)]\nfn test_vec_get_not_declared() {\n let mut vec: BoundedVec<Field, 2> = BoundedVec::new(0);\n vec.push_array([2]);\n let _x = vec.get(1);\n}\n\n#[test(should_fail)]\nfn test_vec_get_uninitialized() {\n let mut vec: BoundedVec<Field, 2> = BoundedVec::new(0);\n let _x = vec.get(0);\n}\n\n#[test(should_fail)]\nfn test_vec_push_overflow() {\n let mut vec: BoundedVec<Field, 1> = BoundedVec::new(0);\n vec.push(1);\n vec.push(2);\n}\n\n#[test]\nfn test_vec_any() {\n let mut vec: BoundedVec<Field, 3> = BoundedVec::new(0);\n vec.push_array([2, 4, 6]);\n assert(vec.any(|v| v == 2) == true);\n assert(vec.any(|v| v == 4) == true);\n assert(vec.any(|v| v == 6) == true);\n assert(vec.any(|v| v == 3) == false);\n}\n\n#[test]\nfn test_vec_any_not_default() {\n let default_value = 1;\n let mut vec: BoundedVec<Field, 3> = BoundedVec::new(default_value);\n vec.push_array([2, 4]);\n assert(vec.any(|v| v == default_value) == false);\n}\n",
855
867
  "path": "/usr/src/yarn-project/aztec-nr/aztec/src/types/vec.nr"
856
868
  },
857
869
  "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",
870
+ "source": "pub fn arr_copy_slice<T, N, M>(src: [T; N], mut dst: [T; M], offset: Field) -> [T; M] {\n for i in 0..dst.len() {\n dst[i] = src[i + offset];\n }\n dst\n}\n\n// TODO(#3470): Copied over from https://github.com/AztecProtocol/aztec-packages/blob/a07c4bd47313be6aa604a63f37857eb0136b41ba/yarn-project/noir-protocol-circuits/src/crates/rollup-lib/src/base/base_rollup_inputs.nr#L599\n// move to a shared place?\n\n// TODO to radix returns u8, so we cannot use bigger radixes. It'd be ideal to use a radix of the maximum range-constrained integer noir supports\npub fn full_field_less_than(lhs: Field, rhs: Field) -> bool {\n dep::std::eddsa::lt_bytes32(lhs, rhs)\n}\n\npub fn full_field_greater_than(lhs: Field, rhs: Field) -> bool {\n dep::std::eddsa::lt_bytes32(rhs, lhs)\n}\n\nstruct Reader<N> {\n data: [Field; N],\n offset: Field,\n}\n\nimpl<N> Reader<N> {\n pub fn new(data: [Field; N]) -> Self {\n Self { data, offset: 0 }\n }\n\n pub fn read(&mut self) -> Field {\n let result = self.data[self.offset];\n self.offset += 1;\n result\n }\n\n pub fn read_array<K>(&mut self, mut result: [Field; K]) -> [Field; K] {\n for i in 0..K {\n result[i] = self.data[self.offset + i];\n }\n self.offset += K;\n result\n }\n\n pub fn read_struct<T, K>(&mut self, deserialise: fn([Field; K]) -> T) -> T {\n let result = deserialise(self.read_array([0; K]));\n result\n }\n\n pub fn read_struct_array<T, K, C>(&mut self, deserialise: fn([Field; K]) -> T, mut result: [T; C]) -> [T; C] {\n for i in 0..C {\n result[i] = self.read_struct(deserialise);\n }\n result\n }\n\n pub fn finish(self) {\n assert(self.offset == self.data.len(), \"Reader did not read all data\");\n } \n}\n",
871
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/utils.nr"
872
+ },
873
+ "66": {
874
+ "source": "use dep::protocol_types::{\n abis::{\n block_header::BlockHeader,\n call_context::CallContext,\n function_data::FunctionData,\n function_selector::FunctionSelector,\n private_circuit_public_inputs::PrivateCircuitPublicInputs,\n public_circuit_public_inputs::PublicCircuitPublicInputs,\n call_stack_item::PrivateCallStackItem,\n call_stack_item::PublicCallStackItem,\n side_effect::{SideEffect, SideEffectLinkedToNoteHash},\n },\n address::{\n AztecAddress,\n EthAddress,\n },\n constants::{\n MAX_NEW_COMMITMENTS_PER_CALL,\n MAX_NEW_L2_TO_L1_MSGS_PER_CALL,\n MAX_NEW_NULLIFIERS_PER_CALL,\n MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL,\n MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL,\n MAX_PUBLIC_DATA_READS_PER_CALL,\n MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL,\n MAX_READ_REQUESTS_PER_CALL,\n NUM_FIELDS_PER_SHA256,\n RETURN_VALUES_LENGTH,\n },\n contrakt::{\n deployment_data::ContractDeploymentData,\n storage_read::StorageRead,\n storage_update_request::StorageUpdateRequest,\n },\n hash::hash_args,\n grumpkin_point::GrumpkinPoint,\n};\n\n// TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n// use dep::std::collections::vec::Vec;\n\nuse crate::abi::{\n PrivateContextInputs,\n PublicContextInputs,\n};\n\n// l1 to l2 messaging\nuse crate::messaging::process_l1_to_l2_message;\n\nuse crate::types::{\n vec::BoundedVec,\n};\n\nuse crate::utils::Reader;\n\nuse crate::oracle::{\n arguments,\n call_private_function::call_private_function_internal,\n public_call::call_public_function_internal,\n enqueue_public_function_call::enqueue_public_function_call_internal,\n context::get_portal_address,\n get_block_header::get_block_header,\n};\n\nuse dep::std::option::Option;\n\n// When finished, one can call .finish() to convert back to the abi\nstruct PrivateContext {\n // docs:start:private-context\n inputs: PrivateContextInputs,\n side_effect_counter: u32,\n\n args_hash : Field,\n return_values : BoundedVec<Field, RETURN_VALUES_LENGTH>,\n\n read_requests: BoundedVec<SideEffect, MAX_READ_REQUESTS_PER_CALL>,\n\n new_commitments: BoundedVec<SideEffect, MAX_NEW_COMMITMENTS_PER_CALL>,\n new_nullifiers: BoundedVec<SideEffectLinkedToNoteHash, MAX_NEW_NULLIFIERS_PER_CALL>,\n\n private_call_stack_hashes : BoundedVec<Field, MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL>,\n public_call_stack_hashes : BoundedVec<Field, MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL>,\n new_l2_to_l1_msgs : BoundedVec<Field, MAX_NEW_L2_TO_L1_MSGS_PER_CALL>,\n // docs:end:private-context\n\n block_header: BlockHeader,\n\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n // encrypted_logs_preimages: Vec<Field>,\n // unencrypted_logs_preimages: Vec<Field>,\n}\n\nimpl PrivateContext {\n pub fn new(inputs: PrivateContextInputs, args_hash: Field) -> PrivateContext {\n PrivateContext {\n inputs: inputs,\n side_effect_counter: inputs.call_context.start_side_effect_counter,\n\n args_hash: args_hash,\n return_values: BoundedVec::new(0),\n\n read_requests: BoundedVec::new(SideEffect::empty()),\n\n new_commitments: BoundedVec::new(SideEffect::empty()),\n new_nullifiers: BoundedVec::new(SideEffectLinkedToNoteHash::empty()),\n\n block_header: inputs.block_header,\n\n private_call_stack_hashes: BoundedVec::new(0),\n public_call_stack_hashes: BoundedVec::new(0),\n new_l2_to_l1_msgs: BoundedVec::new(0),\n\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n // encrypted_logs_preimages: Vec::new(),\n // unencrypted_logs_preimages: Vec::new(),\n }\n }\n\n pub fn msg_sender(self) -> AztecAddress {\n self.inputs.call_context.msg_sender\n }\n\n pub fn this_address(self) -> AztecAddress {\n self.inputs.call_context.storage_contract_address\n }\n\n pub fn this_portal_address(self) -> EthAddress {\n self.inputs.call_context.portal_contract_address\n }\n\n pub fn chain_id(self) -> Field {\n self.inputs.private_global_variables.chain_id\n }\n\n pub fn version(self) -> Field {\n self.inputs.private_global_variables.version\n }\n\n pub fn selector(self) -> FunctionSelector {\n self.inputs.call_context.function_selector\n }\n\n pub fn get_block_header(self, block_number: u32) -> BlockHeader {\n get_block_header(block_number, self)\n }\n\n pub fn finish(self) -> PrivateCircuitPublicInputs {\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n let encrypted_logs_hash = [0; NUM_FIELDS_PER_SHA256];\n let unencrypted_logs_hash = [0; NUM_FIELDS_PER_SHA256];\n let encrypted_log_preimages_length = 0;\n let unencrypted_log_preimages_length = 0;\n\n let priv_circuit_pub_inputs = PrivateCircuitPublicInputs {\n call_context: self.inputs.call_context,\n args_hash: self.args_hash,\n return_values: self.return_values.storage,\n read_requests: self.read_requests.storage,\n new_commitments: self.new_commitments.storage,\n new_nullifiers: self.new_nullifiers.storage,\n private_call_stack_hashes: self.private_call_stack_hashes.storage,\n public_call_stack_hashes: self.public_call_stack_hashes.storage,\n new_l2_to_l1_msgs: self.new_l2_to_l1_msgs.storage,\n end_side_effect_counter: self.side_effect_counter,\n encrypted_logs_hash: encrypted_logs_hash,\n unencrypted_logs_hash: unencrypted_logs_hash,\n encrypted_log_preimages_length: encrypted_log_preimages_length,\n unencrypted_log_preimages_length: unencrypted_log_preimages_length,\n block_header: self.block_header,\n contract_deployment_data: self.inputs.contract_deployment_data,\n chain_id: self.inputs.private_global_variables.chain_id,\n version: self.inputs.private_global_variables.version,\n };\n priv_circuit_pub_inputs\n }\n\n pub fn push_read_request(&mut self, read_request: Field) {\n let side_effect = SideEffect {\n value: read_request,\n counter: self.side_effect_counter,\n };\n self.read_requests.push(side_effect);\n self.side_effect_counter = self.side_effect_counter + 1;\n }\n\n pub fn push_new_note_hash(&mut self, note_hash: Field) {\n let side_effect = SideEffect {\n value: note_hash,\n counter: self.side_effect_counter,\n };\n self.new_commitments.push(side_effect);\n self.side_effect_counter = self.side_effect_counter + 1;\n }\n\n pub fn push_new_nullifier(&mut self, nullifier: Field, nullified_commitment: Field) {\n let side_effect = SideEffectLinkedToNoteHash {\n value: nullifier,\n note_hash: nullified_commitment,\n counter: self.side_effect_counter,\n };\n self.new_nullifiers.push(side_effect);\n self.side_effect_counter = self.side_effect_counter + 1;\n }\n\n // docs:start:context_message_portal\n pub fn message_portal(&mut self, content: Field) \n // docs:end:context_message_portal\n {\n self.new_l2_to_l1_msgs.push(content);\n }\n\n // PrivateContextInputs must be temporarily passed in to prevent too many unknowns\n // Note this returns self to get around an issue where mutable structs do not maintain mutations unless reassigned\n // docs:start:context_consume_l1_to_l2_message\n // docs:start:consume_l1_to_l2_message\n pub fn consume_l1_to_l2_message(\n &mut self,\n msg_key: Field,\n content: Field,\n secret: Field\n ) \n // docs:end:context_consume_l1_to_l2_message\n {\n let nullifier = process_l1_to_l2_message(self.block_header.l1_to_l2_message_tree_root, self.this_address(), self.this_portal_address(), self.chain_id(), self.version(), msg_key, content, secret);\n\n // Push nullifier (and the \"commitment\" corresponding to this can be \"empty\")\n self.push_new_nullifier(nullifier, 0)\n }\n // docs:end:consume_l1_to_l2_message\n\n pub fn accumulate_encrypted_logs<N>(&mut self, log: [Field; N]) {\n let _void1 = self.inputs;\n let _void2 = log;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n }\n\n pub fn accumulate_unencrypted_logs<T>(&mut self, log: T) {\n let _void1 = self.inputs;\n let _void2 = log;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n }\n\n pub fn call_private_function<ARGS_COUNT>(\n &mut self,\n contract_address: AztecAddress, \n function_selector: FunctionSelector, \n args: [Field; ARGS_COUNT]\n ) -> [Field; RETURN_VALUES_LENGTH] {\n let args_hash = hash_args(args);\n assert(args_hash == arguments::pack_arguments(args));\n self.call_private_function_with_packed_args(contract_address, function_selector, args_hash)\n }\n\n pub fn call_private_function_no_args(\n &mut self,\n contract_address: AztecAddress, \n function_selector: FunctionSelector, \n ) -> [Field; RETURN_VALUES_LENGTH] {\n self.call_private_function_with_packed_args(contract_address, function_selector, 0)\n }\n\n pub fn call_private_function_with_packed_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field\n ) -> [Field; RETURN_VALUES_LENGTH] {\n let fields = call_private_function_internal(\n contract_address,\n function_selector, \n args_hash,\n self.side_effect_counter,\n );\n let mut reader = Reader::new(fields);\n\n let item = PrivateCallStackItem {\n contract_address: AztecAddress::from_field(reader.read()),\n function_data: FunctionData {\n selector: FunctionSelector::from_field(reader.read()),\n is_internal: reader.read() as bool,\n is_private: reader.read() as bool,\n is_constructor: reader.read() as bool,\n },\n public_inputs: PrivateCircuitPublicInputs {\n call_context: CallContext {\n msg_sender : AztecAddress::from_field(reader.read()),\n storage_contract_address : AztecAddress::from_field(reader.read()),\n portal_contract_address : EthAddress::from_field(reader.read()),\n function_selector: FunctionSelector::from_field(reader.read()), // practically same as fields[1]\n is_delegate_call : reader.read() as bool,\n is_static_call : reader.read() as bool,\n is_contract_deployment: reader.read() as bool,\n start_side_effect_counter: reader.read() as u32,\n },\n args_hash: reader.read(),\n return_values: reader.read_array([0; RETURN_VALUES_LENGTH]), // +1\n read_requests: reader.read_struct_array(SideEffect::deserialise, [SideEffect::empty(); MAX_READ_REQUESTS_PER_CALL]),\n new_commitments: reader.read_struct_array(SideEffect::deserialise, [SideEffect::empty(); MAX_NEW_COMMITMENTS_PER_CALL]),\n new_nullifiers: reader.read_struct_array(SideEffectLinkedToNoteHash::deserialise, [SideEffectLinkedToNoteHash::empty(); MAX_NEW_NULLIFIERS_PER_CALL]),\n private_call_stack_hashes: reader.read_array([0; MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL]),\n public_call_stack_hashes: reader.read_array([0; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL]),\n new_l2_to_l1_msgs: reader.read_array([0; MAX_NEW_L2_TO_L1_MSGS_PER_CALL]),\n end_side_effect_counter: reader.read() as u32,\n encrypted_logs_hash: reader.read_array([0; NUM_FIELDS_PER_SHA256]),\n unencrypted_logs_hash: reader.read_array([0; NUM_FIELDS_PER_SHA256]),\n encrypted_log_preimages_length: reader.read(),\n unencrypted_log_preimages_length: reader.read(),\n block_header: BlockHeader{\n // Must match order in `private_circuit_public_inputs.hpp`\n note_hash_tree_root : reader.read(),\n nullifier_tree_root : reader.read(),\n contract_tree_root : reader.read(),\n l1_to_l2_message_tree_root : reader.read(),\n archive_root : reader.read(),\n public_data_tree_root: reader.read(),\n global_variables_hash: reader.read(),\n },\n contract_deployment_data: ContractDeploymentData {\n deployer_public_key: GrumpkinPoint {\n x: reader.read(), \n y: reader.read()\n },\n constructor_vk_hash : reader.read(),\n function_tree_root : reader.read(),\n contract_address_salt : reader.read(),\n portal_contract_address : EthAddress::from_field(reader.read()),\n },\n chain_id: reader.read(),\n version: reader.read(),\n },\n is_execution_request: reader.read() as bool,\n };\n\n reader.finish();\n\n assert_eq(item.public_inputs.call_context.start_side_effect_counter, self.side_effect_counter);\n self.side_effect_counter = item.public_inputs.end_side_effect_counter + 1;\n \n assert(contract_address.eq(item.contract_address));\n assert(function_selector.eq(item.function_data.selector));\n\n assert(args_hash == item.public_inputs.args_hash);\n\n assert(item.is_execution_request == false);\n\n // Assert that the call context of the enqueued call generated by the oracle matches our request.\n // We are issuing a regular call which is not delegate, static, or deployment. We also constrain\n // the msg_sender in the nested call to be equal to our address, and the execution context address\n // for the nested call to be equal to the address we actually called.\n assert(item.public_inputs.call_context.is_delegate_call == false);\n assert(item.public_inputs.call_context.is_static_call == false);\n assert(item.public_inputs.call_context.is_contract_deployment == false);\n assert(item.public_inputs.call_context.msg_sender.eq(self.inputs.call_context.storage_contract_address));\n assert(item.public_inputs.call_context.storage_contract_address.eq(contract_address));\n\n self.private_call_stack_hashes.push(item.hash());\n\n item.public_inputs.return_values\n }\n\n pub fn call_public_function<ARGS_COUNT>(\n &mut self,\n contract_address: AztecAddress, \n function_selector: FunctionSelector, \n args: [Field; ARGS_COUNT]\n ) {\n let args_hash = hash_args(args);\n assert(args_hash == arguments::pack_arguments(args));\n self.call_public_function_with_packed_args(contract_address, function_selector, args_hash)\n }\n\n pub fn call_public_function_no_args(\n &mut self,\n contract_address: AztecAddress, \n function_selector: FunctionSelector,\n ) {\n self.call_public_function_with_packed_args(contract_address, function_selector, 0)\n }\n\n pub fn call_public_function_with_packed_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field\n ) {\n let fields = enqueue_public_function_call_internal(\n contract_address, \n function_selector, \n args_hash,\n self.side_effect_counter\n );\n\n let mut reader = Reader::new(fields);\n\n let item = PublicCallStackItem {\n contract_address: AztecAddress::from_field(reader.read()),\n function_data: FunctionData {\n selector: FunctionSelector::from_field(reader.read()),\n is_internal: reader.read() as bool,\n is_private: reader.read() as bool,\n is_constructor: reader.read() as bool,\n },\n public_inputs: PublicCircuitPublicInputs {\n call_context: CallContext {\n msg_sender : AztecAddress::from_field(reader.read()),\n storage_contract_address : AztecAddress::from_field(reader.read()),\n portal_contract_address : EthAddress::from_field(reader.read()),\n function_selector: FunctionSelector::from_field(reader.read()), // practically same as fields[1]\n is_delegate_call : reader.read() as bool,\n is_static_call : reader.read() as bool,\n is_contract_deployment: reader.read() as bool,\n start_side_effect_counter: reader.read() as u32,\n },\n args_hash: reader.read(),\n return_values: [0; RETURN_VALUES_LENGTH],\n contract_storage_update_requests: [StorageUpdateRequest::empty(); MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL],\n contract_storage_reads: [StorageRead::empty(); MAX_PUBLIC_DATA_READS_PER_CALL],\n public_call_stack_hashes: [0; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL],\n new_commitments: [SideEffect::empty(); MAX_NEW_COMMITMENTS_PER_CALL],\n new_nullifiers: [SideEffectLinkedToNoteHash::empty(); MAX_NEW_NULLIFIERS_PER_CALL],\n new_l2_to_l1_msgs:[0; MAX_NEW_L2_TO_L1_MSGS_PER_CALL],\n unencrypted_logs_hash:[0; NUM_FIELDS_PER_SHA256],\n unencrypted_log_preimages_length: 0,\n block_header: BlockHeader::empty(),\n prover_address: AztecAddress::zero(),\n },\n is_execution_request: true,\n };\n reader.finish();\n\n assert(contract_address.eq(item.contract_address));\n assert(function_selector.eq(item.function_data.selector));\n\n assert_eq(item.public_inputs.call_context.start_side_effect_counter, self.side_effect_counter);\n // We increment the sideffect counter by one, to account for the call itself being a side effect.\n self.side_effect_counter = self.side_effect_counter + 1;\n \n assert(args_hash == item.public_inputs.args_hash);\n\n // Assert that the call context of the enqueued call generated by the oracle matches our request.\n // We are issuing a regular call which is not delegate, static, or deployment. We also constrain\n // the msg_sender in the nested call to be equal to our address, and the execution context address\n // for the nested call to be equal to the address we actually called.\n assert(item.public_inputs.call_context.is_delegate_call == false);\n assert(item.public_inputs.call_context.is_static_call == false);\n assert(item.public_inputs.call_context.is_contract_deployment == false);\n assert(item.public_inputs.call_context.msg_sender.eq(self.inputs.call_context.storage_contract_address));\n assert(item.public_inputs.call_context.storage_contract_address.eq(contract_address));\n\n self.public_call_stack_hashes.push(item.hash());\n }\n}\n\nstruct PublicContext {\n inputs: PublicContextInputs,\n side_effect_counter: u32,\n\n args_hash : Field,\n return_values : BoundedVec<Field, RETURN_VALUES_LENGTH>,\n\n contract_storage_update_requests: BoundedVec<StorageUpdateRequest, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL>,\n contract_storage_reads: BoundedVec<StorageRead, MAX_PUBLIC_DATA_READS_PER_CALL>,\n public_call_stack_hashes: BoundedVec<Field, MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL>,\n\n new_commitments: BoundedVec<SideEffect, MAX_NEW_COMMITMENTS_PER_CALL>,\n new_nullifiers: BoundedVec<SideEffectLinkedToNoteHash, MAX_NEW_NULLIFIERS_PER_CALL>,\n\n new_l2_to_l1_msgs: BoundedVec<Field, MAX_NEW_L2_TO_L1_MSGS_PER_CALL>,\n\n unencrypted_logs_hash: BoundedVec<Field, NUM_FIELDS_PER_SHA256>,\n unencrypted_logs_preimages_length: Field,\n\n block_header: BlockHeader,\n prover_address: AztecAddress,\n}\n\nimpl PublicContext {\n pub fn new(inputs: PublicContextInputs, args_hash: Field) -> PublicContext {\n let empty_storage_read = StorageRead::empty();\n let empty_storage_update = StorageUpdateRequest::empty();\n PublicContext {\n inputs: inputs,\n side_effect_counter: inputs.call_context.start_side_effect_counter,\n\n args_hash: args_hash,\n return_values: BoundedVec::new(0),\n\n contract_storage_update_requests: BoundedVec::new(empty_storage_update),\n contract_storage_reads: BoundedVec::new(empty_storage_read),\n public_call_stack_hashes: BoundedVec::new(0),\n\n new_commitments: BoundedVec::new(SideEffect::empty()),\n new_nullifiers: BoundedVec::new(SideEffectLinkedToNoteHash::empty()),\n\n new_l2_to_l1_msgs: BoundedVec::new(0),\n\n \n unencrypted_logs_hash: BoundedVec::new(0),\n unencrypted_logs_preimages_length: 0,\n\n block_header: inputs.block_header,\n prover_address: AztecAddress::zero(),\n\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n // encrypted_logs_preimages: Vec::new(),\n // unencrypted_logs_preimages: Vec::new(),\n }\n }\n\n pub fn msg_sender(self) -> AztecAddress {\n self.inputs.call_context.msg_sender\n }\n\n pub fn this_address(self) -> AztecAddress {\n self.inputs.call_context.storage_contract_address\n }\n\n pub fn this_portal_address(self) -> EthAddress {\n self.inputs.call_context.portal_contract_address\n }\n\n pub fn chain_id(self) -> Field {\n self.inputs.public_global_variables.chain_id\n }\n\n pub fn version(self) -> Field {\n self.inputs.public_global_variables.version\n }\n\n pub fn selector(self) -> FunctionSelector {\n self.inputs.call_context.function_selector\n }\n\n pub fn block_number(self) -> Field {\n self.inputs.public_global_variables.block_number\n }\n\n pub fn timestamp(self) -> Field {\n self.inputs.public_global_variables.timestamp\n }\n\n pub fn finish(self) -> PublicCircuitPublicInputs {\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n let unencrypted_logs_hash = [0; NUM_FIELDS_PER_SHA256];\n let unencrypted_log_preimages_length = 0;\n\n\n // Compute the public call stack hashes\n let pub_circuit_pub_inputs = PublicCircuitPublicInputs {\n call_context: self.inputs.call_context, // Done\n args_hash: self.args_hash, // Done\n contract_storage_update_requests: self.contract_storage_update_requests.storage,\n contract_storage_reads: self.contract_storage_reads.storage,\n return_values: self.return_values.storage,\n new_commitments: self.new_commitments.storage,\n new_nullifiers: self.new_nullifiers.storage,\n public_call_stack_hashes: self.public_call_stack_hashes.storage,\n new_l2_to_l1_msgs: self.new_l2_to_l1_msgs.storage,\n unencrypted_logs_hash: unencrypted_logs_hash,\n unencrypted_log_preimages_length: unencrypted_log_preimages_length,\n block_header: self.inputs.block_header,\n prover_address: self.prover_address,\n };\n pub_circuit_pub_inputs\n }\n\n pub fn push_new_note_hash(&mut self, note_hash: Field) {\n let side_effect = SideEffect {\n value: note_hash,\n counter: self.side_effect_counter\n };\n self.new_commitments.push(side_effect);\n self.side_effect_counter = self.side_effect_counter + 1;\n }\n\n pub fn push_new_nullifier(&mut self, nullifier: Field, _nullified_commitment: Field) {\n let side_effect = SideEffectLinkedToNoteHash {\n value: nullifier,\n note_hash: 0, // cannot nullify pending notes in public context\n counter: self.side_effect_counter\n };\n self.new_nullifiers.push(side_effect);\n self.side_effect_counter = self.side_effect_counter + 1;\n }\n\n pub fn message_portal(&mut self, content: Field) {\n self.new_l2_to_l1_msgs.push(content);\n }\n\n // PrivateContextInputs must be temporarily passed in to prevent too many unknowns\n // Note this returns self to get around an issue where mutable structs do not maintain mutations unless reassigned\n pub fn consume_l1_to_l2_message(&mut self, msg_key: Field, content: Field, secret: Field) {\n let this = (*self).this_address();\n let nullifier = process_l1_to_l2_message(self.block_header.l1_to_l2_message_tree_root, this, self.this_portal_address(), self.chain_id(), self.version(), msg_key, content, secret);\n\n // Push nullifier (and the \"commitment\" corresponding to this can be \"empty\")\n self.push_new_nullifier(nullifier, 0)\n }\n\n pub fn accumulate_encrypted_logs<N>(&mut self, log: [Field; N]) {\n let _void1 = self;\n let _void2 = log;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n }\n\n pub fn accumulate_unencrypted_logs<T>(&mut self, log: T) {\n let _void1 = self;\n let _void2 = log;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n }\n\n pub fn call_public_function<ARGS_COUNT>(\n _self: Self,\n contract_address: AztecAddress, \n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT],\n ) -> [Field; RETURN_VALUES_LENGTH] {\n let args_hash = hash_args(args);\n assert(args_hash == arguments::pack_arguments(args));\n call_public_function_internal(\n contract_address, \n function_selector, \n args_hash,\n )\n }\n\n pub fn call_public_function_no_args(\n _self: Self,\n contract_address: AztecAddress, \n function_selector: FunctionSelector,\n ) -> [Field; RETURN_VALUES_LENGTH] {\n call_public_function_internal(\n contract_address, \n function_selector, \n 0,\n )\n }\n\n}\n\nstruct Context {\n private: Option<&mut PrivateContext>,\n public: Option<&mut PublicContext>,\n}\n\nimpl Context {\n pub fn private(context: &mut PrivateContext) -> Context {\n Context {\n private: Option::some(context),\n public: Option::none()\n }\n }\n\n pub fn public(context: &mut PublicContext) -> Context {\n Context {\n public: Option::some(context),\n private: Option::none()\n }\n }\n\n pub fn none() -> Context {\n Context {\n public: Option::none(),\n private: Option::none()\n }\n }\n}\n",
859
875
  "path": "/usr/src/yarn-project/aztec-nr/aztec/src/context.nr"
860
876
  },
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",
877
+ "80": {
878
+ "source": "use dep::protocol_types::{\n abis::function_selector::FunctionSelector,\n address::AztecAddress,\n};\n\n// contract_address + \n// args_hash +\n// crate::abi::FUNCTION_DATA_SIZE +\n// crate::abi::CALL_CONTEXT_SIZE\n// = 2 + 4 + 8\nglobal ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_SIZE: Field = 14;\n\n#[oracle(enqueuePublicFunctionCall)]\nfn enqueue_public_function_call_oracle(\n _contract_address: AztecAddress,\n _function_selector: FunctionSelector,\n _args_hash: Field,\n _side_effect_counter: u32\n) -> [Field; ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_SIZE] {}\n\nunconstrained pub fn enqueue_public_function_call_internal(\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n side_effect_counter: u32\n) -> [Field; ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_SIZE] {\n enqueue_public_function_call_oracle(\n contract_address,\n function_selector,\n args_hash,\n side_effect_counter\n )\n}\n",
863
879
  "path": "/usr/src/yarn-project/aztec-nr/aztec/src/oracle/enqueue_public_function_call.nr"
864
880
  },
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",
881
+ "85": {
882
+ "source": "use dep::protocol_types::{\n abis::function_selector::FunctionSelector,\n address::AztecAddress,\n constants::CALL_PRIVATE_FUNCTION_RETURN_SIZE,\n};\n\n#[oracle(callPrivateFunction)]\nfn call_private_function_oracle(\n _contract_address: AztecAddress,\n _function_selector: FunctionSelector,\n _args_hash: Field,\n _start_side_effect_counter: u32\n) -> [Field; CALL_PRIVATE_FUNCTION_RETURN_SIZE] {}\n\nunconstrained pub fn call_private_function_internal(\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n start_side_effect_counter: u32\n) -> [Field; CALL_PRIVATE_FUNCTION_RETURN_SIZE] {\n call_private_function_oracle(\n contract_address,\n function_selector,\n args_hash,\n start_side_effect_counter\n )\n}\n",
867
883
  "path": "/usr/src/yarn-project/aztec-nr/aztec/src/oracle/call_private_function.nr"
868
884
  },
869
- "90": {
885
+ "92": {
870
886
  "source": "#[oracle(storageRead)]\nfn storage_read_oracle<N>(_storage_slot: Field, _number_of_elements: Field) -> [Field; N] {}\n\nunconstrained fn storage_read_oracle_wrapper<N>(_storage_slot: Field) -> [Field; N] {\n storage_read_oracle(_storage_slot, N)\n}\n\npub fn storage_read<T, N>(storage_slot: Field, deserialize: fn([Field; N]) -> T) -> T {\n let fields = storage_read_oracle_wrapper(storage_slot);\n deserialize(fields)\n}\n\n#[oracle(storageWrite)]\nfn storage_write_oracle<N>(_storage_slot: Field, _values: [Field; N]) -> [Field; N] {}\n\n// TODO: Remove return value.\nunconstrained pub fn storage_write<N>(storage_slot: Field, fields: [Field; N]) {\n let _hash = storage_write_oracle(storage_slot, fields);\n}\n",
871
887
  "path": "/usr/src/yarn-project/aztec-nr/aztec/src/oracle/storage.nr"
872
888
  },
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",
889
+ "98": {
890
+ "source": "global ARGS_LENGTH: Field = 16;\nglobal RETURN_VALUES_LENGTH: Field = 4;\n\n/**\n * Convention for constant array lengths are mainly divided in 2 classes:\n * - FUNCTION CALL\n * - TRANSACTION\n *\n * Agreed convention is to use MAX_XXX_PER_CALL resp. MAX_XXX_PER_TX, where XXX denotes a type of element such as\n * commitment, or nullifier, e.g.,:\n * - MAX_NEW_NULLIFIERS_PER_CALL\n * - MAX_NEW_COMMITMENTS_PER_TX\n *\n * In the kernel circuits, we accumulate elements such as commitments and the nullifiers from all functions calls in a\n * transaction. Therefore, we always must have:\n * MAX_XXX_PER_TX ≥ MAX_XXX_PER_CALL\n *\n * For instance:\n * MAX_NEW_COMMITMENTS_PER_TX ≥ MAX_NEW_COMMITMENTS_PER_CALL\n * MAX_NEW_NULLIFIERS_PER_TX ≥ MAX_NEW_NULLIFIERS_PER_CALL\n *\n */\n\n// docs:start:constants\n// \"PER CALL\" CONSTANTS\nglobal MAX_NEW_COMMITMENTS_PER_CALL: Field = 16;\nglobal MAX_NEW_NULLIFIERS_PER_CALL: Field = 16;\nglobal MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL: Field = 4;\nglobal MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL: Field = 4;\nglobal MAX_NEW_L2_TO_L1_MSGS_PER_CALL: Field = 2;\nglobal MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL: Field = 16;\nglobal MAX_PUBLIC_DATA_READS_PER_CALL: Field = 16;\nglobal MAX_READ_REQUESTS_PER_CALL: Field = 32;\n\n// \"PER TRANSACTION\" CONSTANTS\nglobal MAX_NEW_COMMITMENTS_PER_TX: Field = 64;\nglobal MAX_NEW_NULLIFIERS_PER_TX: Field = 64;\nglobal MAX_PRIVATE_CALL_STACK_LENGTH_PER_TX: Field = 8;\nglobal MAX_PUBLIC_CALL_STACK_LENGTH_PER_TX: Field = 8;\nglobal MAX_NEW_L2_TO_L1_MSGS_PER_TX: Field = 2;\nglobal MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX: Field = 16;\nglobal MAX_PUBLIC_DATA_READS_PER_TX: Field = 16;\nglobal MAX_NEW_CONTRACTS_PER_TX: Field = 1;\nglobal MAX_OPTIONALLY_REVEALED_DATA_LENGTH_PER_TX: Field = 4;\nglobal MAX_READ_REQUESTS_PER_TX: Field = 128;\nglobal NUM_ENCRYPTED_LOGS_HASHES_PER_TX: Field = 1;\nglobal NUM_UNENCRYPTED_LOGS_HASHES_PER_TX: Field = 1;\n// docs:end:constants\n\n// ROLLUP CONTRACT CONSTANTS - constants used only in l1-contracts\nglobal NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP: Field = 16;\n\n// TREES RELATED CONSTANTS\nglobal VK_TREE_HEIGHT: Field = 3;\nglobal FUNCTION_TREE_HEIGHT: Field = 5;\nglobal CONTRACT_TREE_HEIGHT: Field = 16;\nglobal NOTE_HASH_TREE_HEIGHT: Field = 32;\nglobal PUBLIC_DATA_TREE_HEIGHT: Field = 40;\nglobal NULLIFIER_TREE_HEIGHT: Field = 20;\nglobal L1_TO_L2_MSG_TREE_HEIGHT: Field = 16;\nglobal ROLLUP_VK_TREE_HEIGHT: Field = 8;\n\n// SUB-TREES RELATED CONSTANTS\nglobal CONTRACT_SUBTREE_HEIGHT: Field = 0;\nglobal CONTRACT_SUBTREE_SIBLING_PATH_LENGTH: Field = 16;\nglobal NOTE_HASH_SUBTREE_HEIGHT: Field = 6;\nglobal NOTE_HASH_SUBTREE_SIBLING_PATH_LENGTH: Field = 26;\nglobal NULLIFIER_SUBTREE_HEIGHT: Field = 6;\nglobal PUBLIC_DATA_SUBTREE_HEIGHT: Field = 4;\nglobal ARCHIVE_HEIGHT: Field = 16;\nglobal NULLIFIER_SUBTREE_SIBLING_PATH_LENGTH: Field = 14;\nglobal PUBLIC_DATA_SUBTREE_SIBLING_PATH_LENGTH: Field = 36;\nglobal L1_TO_L2_MSG_SUBTREE_HEIGHT: Field = 4;\nglobal L1_TO_L2_MSG_SUBTREE_SIBLING_PATH_LENGTH: Field = 12;\n\n// MISC CONSTANTS\nglobal FUNCTION_SELECTOR_NUM_BYTES: Field = 4;\nglobal MAPPING_SLOT_PEDERSEN_SEPARATOR: Field = 4;\n// sha256 hash is stored in two fields to accommodate all 256-bits of the hash\nglobal NUM_FIELDS_PER_SHA256: Field = 2;\nglobal ARGS_HASH_CHUNK_LENGTH: u32 = 32;\nglobal ARGS_HASH_CHUNK_COUNT: u32 = 16;\n\n// NOIR CONSTANTS - constants used only in yarn-packages/noir-contracts\n// Some are defined here because Noir doesn't yet support globals referencing other globals yet.\n// Move these constants to a noir file once the issue bellow is resolved:\n// https://github.com/noir-lang/noir/issues/1734\nglobal L1_TO_L2_MESSAGE_LENGTH: Field = 8;\nglobal L1_TO_L2_MESSAGE_ORACLE_CALL_LENGTH: Field = 26;\nglobal MAX_NOTE_FIELDS_LENGTH: Field = 20;\n// GET_NOTE_ORACLE_RETURN_LENGT = MAX_NOTE_FIELDS_LENGTH + 1 + 2\n// The plus 1 is 1 extra field for nonce.\n// + 2 for EXTRA_DATA: [number_of_return_notes, contract_address]\nglobal GET_NOTE_ORACLE_RETURN_LENGTH: Field = 23;\nglobal MAX_NOTES_PER_PAGE: Field = 10;\n// VIEW_NOTE_ORACLE_RETURN_LENGTH = MAX_NOTES_PER_PAGE * (MAX_NOTE_FIELDS_LENGTH + 1) + 2;\nglobal VIEW_NOTE_ORACLE_RETURN_LENGTH: Field = 212;\nglobal CALL_CONTEXT_LENGTH: Field = 8;\nglobal BLOCK_HEADER_LENGTH: Field = 7;\nglobal FUNCTION_DATA_LENGTH: Field = 4;\nglobal CONTRACT_DEPLOYMENT_DATA_LENGTH: Field = 6;\n// Change this ONLY if you have changed the PrivateCircuitPublicInputs structure.\n// In other words, if the structure/size of the public inputs of a function call changes then we\n// should change this constant as well as the offsets in private_call_stack_item.nr\nglobal PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH: Field = 189;\nglobal CONTRACT_STORAGE_UPDATE_REQUEST_LENGTH: Field = 3;\nglobal CONTRACT_STORAGE_READ_LENGTH: Field = 2;\n// Change this ONLY if you have changed the PublicCircuitPublicInputs structure.\nglobal PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH: Field = 190;\nglobal GET_NOTES_ORACLE_RETURN_LENGTH: Field = 674;\nglobal CALL_PRIVATE_FUNCTION_RETURN_SIZE: Field = 195;\nglobal PUBLIC_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH: Field = 87;\nglobal PRIVATE_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH: Field = 177;\nglobal COMMITMENTS_NUM_BYTES_PER_BASE_ROLLUP: Field = 2048;\nglobal NULLIFIERS_NUM_BYTES_PER_BASE_ROLLUP: Field = 2048;\nglobal PUBLIC_DATA_WRITES_NUM_BYTES_PER_BASE_ROLLUP: Field = 1024;\nglobal CONTRACTS_NUM_BYTES_PER_BASE_ROLLUP: Field = 32;\nglobal CONTRACT_DATA_NUM_BYTES_PER_BASE_ROLLUP: Field = 64;\nglobal CONTRACT_DATA_NUM_BYTES_PER_BASE_ROLLUP_UNPADDED: Field = 52;\nglobal L2_TO_L1_MSGS_NUM_BYTES_PER_BASE_ROLLUP: Field = 64;\nglobal LOGS_HASHES_NUM_BYTES_PER_BASE_ROLLUP: Field = 64;\n\n/**\n * Enumerate the hash_indices which are used for pedersen hashing.\n * We start from 1 to avoid the default generators. The generator indices are listed\n * based on the number of elements each index hashes. The following conditions must be met:\n *\n * +-----------+-------------------------------+----------------------+\n * | Hash size | Number of elements hashed (n) | Condition to use |\n * |-----------+-------------------------------+----------------------|\n * | LOW | n ≤ 8 | 0 < hash_index ≤ 32 |\n * | MID | 8 < n ≤ 16 | 32 < hash_index ≤ 40 |\n * | HIGH | 16 < n ≤ 48 | 40 < hash_index ≤ 48 |\n * +-----------+-------------------------------+----------------------+\n *\n * Note: When modifying, modify `GeneratorIndexPacker` in packer.hpp accordingly.\n */\n// Indices with size ≤ 8\nglobal GENERATOR_INDEX__COMMITMENT = 1;\nglobal GENERATOR_INDEX__COMMITMENT_NONCE = 2;\nglobal GENERATOR_INDEX__UNIQUE_COMMITMENT = 3;\nglobal GENERATOR_INDEX__SILOED_COMMITMENT = 4;\nglobal GENERATOR_INDEX__NULLIFIER = 5;\nglobal GENERATOR_INDEX__INITIALIZATION_NULLIFIER = 6;\nglobal GENERATOR_INDEX__OUTER_NULLIFIER = 7;\nglobal GENERATOR_INDEX__PUBLIC_DATA_READ = 8;\nglobal GENERATOR_INDEX__PUBLIC_DATA_UPDATE_REQUEST = 9;\nglobal GENERATOR_INDEX__FUNCTION_DATA = 10;\nglobal GENERATOR_INDEX__FUNCTION_LEAF = 11;\nglobal GENERATOR_INDEX__CONTRACT_DEPLOYMENT_DATA = 12;\nglobal GENERATOR_INDEX__CONSTRUCTOR = 13;\nglobal GENERATOR_INDEX__CONSTRUCTOR_ARGS = 14;\nglobal GENERATOR_INDEX__CONTRACT_ADDRESS = 15;\nglobal GENERATOR_INDEX__CONTRACT_LEAF = 16;\nglobal GENERATOR_INDEX__CALL_CONTEXT = 17;\nglobal GENERATOR_INDEX__CALL_STACK_ITEM = 18;\nglobal GENERATOR_INDEX__CALL_STACK_ITEM_2 = 19;\nglobal GENERATOR_INDEX__L1_TO_L2_MESSAGE_SECRET = 20;\nglobal GENERATOR_INDEX__L2_TO_L1_MSG = 21;\nglobal GENERATOR_INDEX__TX_CONTEXT = 22;\nglobal GENERATOR_INDEX__PUBLIC_LEAF_INDEX = 23;\nglobal GENERATOR_INDEX__PUBLIC_DATA_LEAF = 24;\nglobal GENERATOR_INDEX__SIGNED_TX_REQUEST = 25;\nglobal GENERATOR_INDEX__GLOBAL_VARIABLES = 26;\nglobal GENERATOR_INDEX__PARTIAL_ADDRESS = 27;\nglobal GENERATOR_INDEX__BLOCK_HASH = 28;\nglobal GENERATOR_INDEX__SIDE_EFFECT = 29;\n// Indices with size ≤ 16\nglobal GENERATOR_INDEX__TX_REQUEST = 33;\nglobal GENERATOR_INDEX__SIGNATURE_PAYLOAD = 34;\n// Indices with size ≤ 44\nglobal GENERATOR_INDEX__VK = 41;\nglobal GENERATOR_INDEX__PRIVATE_CIRCUIT_PUBLIC_INPUTS = 42;\nglobal GENERATOR_INDEX__PUBLIC_CIRCUIT_PUBLIC_INPUTS = 43;\nglobal GENERATOR_INDEX__FUNCTION_ARGS = 44;\n",
875
891
  "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/constants.nr"
876
892
  },
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",
893
+ "104": {
894
+ "source": "use crate::address::{AztecAddress, EthAddress};\nuse crate::mocked::VerificationKey;\nuse crate::abis::function_selector::FunctionSelector;\nuse crate::abis::function_leaf_preimage::FunctionLeafPreimage;\nuse crate::abis::new_contract_data::NewContractData as ContractLeafPreimage;\nuse crate::abis::function_data::FunctionData;\nuse crate::abis::side_effect::{SideEffect};\nuse crate::utils::uint256::U256;\nuse crate::utils::bounded_vec::BoundedVec;\nuse crate::constants::{\n ARGS_HASH_CHUNK_COUNT,\n ARGS_HASH_CHUNK_LENGTH,\n CONTRACT_TREE_HEIGHT, \n FUNCTION_TREE_HEIGHT, \n NOTE_HASH_TREE_HEIGHT,\n NUM_FIELDS_PER_SHA256,\n GENERATOR_INDEX__SILOED_COMMITMENT,\n GENERATOR_INDEX__OUTER_NULLIFIER,\n GENERATOR_INDEX__VK,\n GENERATOR_INDEX__CONSTRUCTOR,\n GENERATOR_INDEX__PARTIAL_ADDRESS,\n GENERATOR_INDEX__CONTRACT_ADDRESS,\n GENERATOR_INDEX__COMMITMENT_NONCE,\n GENERATOR_INDEX__UNIQUE_COMMITMENT,\n GENERATOR_INDEX__FUNCTION_ARGS,\n};\n\nuse dep::std::hash::{pedersen_hash_with_separator, sha256};\n\npub fn sha256_to_field<N>(bytes_to_hash: [u8; N]) -> Field {\n let sha256_hashed = sha256(bytes_to_hash);\n\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (sha256_hashed[15 - i] as Field) * v;\n low = low + (sha256_hashed[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n let hash_in_a_field = low + high * v;\n\n hash_in_a_field\n}\n\npub fn hash_args<N>(args: [Field; N]) -> Field {\n if args.len() == 0 {\n 0\n } else {\n let mut chunks_hashes = [0; ARGS_HASH_CHUNK_COUNT];\n for i in 0..ARGS_HASH_CHUNK_COUNT {\n let mut chunk_hash = 0;\n let start_chunk_index = i * ARGS_HASH_CHUNK_LENGTH;\n if start_chunk_index < (args.len() as u32) {\n let mut chunk_args = [0; ARGS_HASH_CHUNK_LENGTH];\n for j in 0..ARGS_HASH_CHUNK_LENGTH {\n let item_index = i * ARGS_HASH_CHUNK_LENGTH + j;\n if item_index < (args.len() as u32) {\n chunk_args[j] = args[item_index];\n }\n }\n chunk_hash = pedersen_hash(chunk_args, GENERATOR_INDEX__FUNCTION_ARGS);\n }\n chunks_hashes[i] = chunk_hash;\n }\n pedersen_hash(chunks_hashes, GENERATOR_INDEX__FUNCTION_ARGS)\n }\n}\n\n// Checks that `value` is a member of a merkle tree with root `root` at position `index`\n// The witness being the `sibling_path`\npub fn assert_check_membership<N>(value: Field, index: Field, sibling_path: [Field; N], root: Field) {\n let calculated_root = root_from_sibling_path(value, index, sibling_path);\n assert(calculated_root == root, \"membership check failed\");\n}\n\n// Calculate the Merkle tree root from the sibling path and leaf.\n//\n// The leaf is hashed with its sibling, and then the result is hashed\n// with the next sibling etc in the path. The last hash is the root.\n//\n// TODO(David/Someone): The cpp code is using a uint256, whereas its\n// TODO a bit simpler in Noir to just have a bit array.\n// TODO: I'd generally like to avoid u256 for algorithms like \n// this because it means we never even need to consider cases where \n// the index is greater than p.\npub fn root_from_sibling_path<N>(leaf: Field, leaf_index: Field, sibling_path: [Field; N]) -> Field {\n let mut node = leaf;\n let indices = leaf_index.to_le_bits(N);\n\n for i in 0..N {\n let (hash_left, hash_right) = if indices[i] == 1 {\n (sibling_path[i], node)\n } else {\n (node, sibling_path[i])\n };\n node = merkle_hash(hash_left, hash_right);\n }\n node\n}\n\n// Calculate the function tree root from the sibling path and leaf preimage.\n//\n// TODO: The cpp code passes in components of the FunctionLeafPreimage and then \n// builds it up. We should build it up and then pass the leaf preimage as a parameter.\n// We can then choose to have a general method that takes in anything hashable\n// and deduplicate the logic in `contract_tree_root_from_siblings`\npub fn function_tree_root_from_siblings(\n selector: FunctionSelector,\n is_internal: bool,\n is_private: bool,\n vk_hash: Field,\n acir_hash: Field,\n function_leaf_index: Field,\n function_leaf_sibling_path: [Field; FUNCTION_TREE_HEIGHT]\n) -> Field {\n let function_leaf_preimage = FunctionLeafPreimage { selector, is_internal, is_private, vk_hash, acir_hash };\n\n let function_leaf = function_leaf_preimage.hash();\n\n let function_tree_root = root_from_sibling_path(function_leaf, function_leaf_index, function_leaf_sibling_path);\n\n function_tree_root\n}\n\n// Calculate the contract tree root from the sibling path and leaf preimage.\npub fn contract_tree_root_from_siblings(\n function_tree_root: Field,\n storage_contract_address: AztecAddress,\n portal_contract_address: EthAddress,\n contract_leaf_index: Field,\n contract_leaf_sibling_path: [Field; CONTRACT_TREE_HEIGHT]\n) -> Field {\n //TODO(Kev): if we use shorthand syntax here, we get an error as expected,\n // since variable name is `storage_contract_address` but the span is incorrect.\n let contract_leaf_preimage = ContractLeafPreimage { contract_address: storage_contract_address, portal_contract_address, function_tree_root };\n\n let contract_leaf = contract_leaf_preimage.hash();\n\n let computed_contract_tree_root = root_from_sibling_path(contract_leaf, contract_leaf_index, contract_leaf_sibling_path);\n\n computed_contract_tree_root\n}\n\npub fn read_request_root_from_siblings(\n read_request: Field,\n leaf_index: Field,\n sibling_path: [Field; NOTE_HASH_TREE_HEIGHT]\n) -> Field {\n root_from_sibling_path(read_request, leaf_index, sibling_path)\n}\n\npub fn silo_commitment(address: AztecAddress, inner_commitment: Field) -> Field {\n pedersen_hash(\n [\n address.to_field(),\n inner_commitment\n ],\n GENERATOR_INDEX__SILOED_COMMITMENT\n )\n}\n\npub fn silo_nullifier(address: AztecAddress, nullifier: Field) -> Field {\n pedersen_hash(\n [\n address.to_field(),\n nullifier\n ],\n GENERATOR_INDEX__OUTER_NULLIFIER\n )\n}\n\nfn merkle_hash(left: Field, right: Field) -> Field {\n pedersen_hash([left, right], 0)\n}\n\npub fn stdlib_recursion_verification_key_compress_native_vk(_vk: VerificationKey) -> Field {\n // Original cpp code\n // stdlib::recursion::verification_key<CT::bn254>::compress_native(private_call.vk, GeneratorIndex::VK);\n // The above cpp method is only ever called on verification key, so it has been special cased here\n let _hash_index = GENERATOR_INDEX__VK;\n 0\n}\n\n// TODO CPP uses blake2s for this\npub fn compute_new_contract_address_hash(new_contract_address: AztecAddress) -> Field {\n dep::std::hash::pedersen_hash([new_contract_address.to_field()])\n}\n\npub fn compute_l2_to_l1_hash(\n contract_address: AztecAddress,\n rollup_version_id: Field,\n portal_contract_address: EthAddress,\n chain_id: Field,\n content: Field\n) -> Field {\n let mut bytes: BoundedVec<u8, 160> = BoundedVec::new(0);\n\n let inputs = [\n contract_address.to_field(), rollup_version_id, portal_contract_address.to_field(), chain_id, content\n ];\n for i in 0..inputs.len() {\n // TODO are bytes be in fr.to_buffer() ?\n let item_bytes = inputs[i].to_be_bytes(32);\n for j in 0..32 {\n bytes.push(item_bytes[j]);\n }\n }\n\n sha256_to_field(bytes.storage)\n}\n\npub fn compute_constructor_hash(\n function_data: FunctionData,\n args_hash: Field,\n constructor_vk_hash: Field\n) -> Field {\n let function_data_hash = function_data.hash();\n\n pedersen_hash(\n [\n function_data_hash,\n args_hash,\n constructor_vk_hash\n ],\n GENERATOR_INDEX__CONSTRUCTOR\n )\n}\n\n// Computes sha256 hash of 2 input hashes stored in 4 fields.\n// \n// This method is bn254 specific. Two fields is needed in order to \n// encode the sha256 output. It can be abstracted away with any 4-2 hash function.\n//\n// TODO(Jan and David): This is used for the encrypted_log hashes.\n// Can we check to see if we can just use hash_to_field or pedersen_compress here?\n//\n// Returning a Field would be desirable because then this can be replaced with \n// poseidon without changing the rest of the code\n//\npub fn accumulate_sha256(input: [U128; 4]) -> [Field; NUM_FIELDS_PER_SHA256] {\n // This is a note about the cpp code, since it takes an array of Fields\n // instead of a U128.\n // 4 Field elements when converted to bytes will usually \n // occupy 4 * 32 = 128 bytes.\n // However, this function is making the assumption that each Field \n // only occupies 128 bits.\n //\n // TODO(David): This does not seem to be getting guaranteed anywhere in the code?\n //\n // Concatenate 4 u128 bit integers into a byte array.\n let mut hash_input_flattened = [0; 64];\n for offset in 0..4 {\n let input_as_bytes = input[offset].to_be_bytes();\n for byte_index in 0..16 {\n hash_input_flattened[offset * 16 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n let sha_digest = dep::std::hash::sha256(hash_input_flattened);\n\n U256::from_bytes32(sha_digest).to_u128_limbs()\n}\n\npub fn compute_logs_hash(\n previous_log_hash: [Field; 2],\n current_log_hash: [Field; 2]\n) -> [Field; NUM_FIELDS_PER_SHA256] {\n accumulate_sha256(\n [\n U128::from_integer(previous_log_hash[0]),\n U128::from_integer(previous_log_hash[1]),\n U128::from_integer(current_log_hash[0]),\n U128::from_integer(current_log_hash[1])\n ]\n )\n}\n\npub fn compute_commitment_nonce(first_nullifier: Field, commitment_index: Field) -> Field {\n pedersen_hash(\n [\n first_nullifier,\n commitment_index\n ],\n GENERATOR_INDEX__COMMITMENT_NONCE\n )\n}\n\npub fn compute_unique_siloed_commitment(nonce: Field, siloed_commitment: Field) -> Field {\n pedersen_hash(\n [\n nonce,\n siloed_commitment\n ],\n GENERATOR_INDEX__UNIQUE_COMMITMENT\n )\n}\n\npub fn compute_unique_siloed_commitments<N>(\n first_nullifier: Field,\n siloed_commitments: [SideEffect; N]\n) -> [SideEffect; N] {\n let mut unique_siloed_commitments = [SideEffect::empty(); N];\n for i in 0..N {\n let siloed_commitment = siloed_commitments[i];\n if siloed_commitment.value != 0 {\n let nonce = compute_commitment_nonce(first_nullifier, i);\n unique_siloed_commitments[i] = SideEffect {\n value: compute_unique_siloed_commitment(nonce, siloed_commitment.value),\n counter: siloed_commitment.counter\n };\n }\n }\n unique_siloed_commitments\n}\n\npub fn pedersen_hash<N>(inputs: [Field; N], hash_index: u32) -> Field {\n dep::std::hash::pedersen_hash_with_separator(inputs, hash_index)\n}\n",
879
895
  "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/hash.nr"
880
896
  },
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",
897
+ "120": {
898
+ "source": "use crate::{\n constants::{\n GENERATOR_INDEX__CONTRACT_ADDRESS,\n GENERATOR_INDEX__PARTIAL_ADDRESS,\n },\n hash::pedersen_hash,\n utils,\n grumpkin_point::GrumpkinPoint,\n};\nuse dep::std::cmp::Eq;\nuse crate::traits::{Empty, ToField};\n\n// Aztec address\nstruct AztecAddress {\n inner : Field\n}\n\nimpl Eq for AztecAddress {\n fn eq(self, other : Self) -> bool {\n self.to_field() == other.to_field()\n }\n}\n\nimpl Empty for AztecAddress {\n fn empty() -> Self {\n Self {\n inner : 0\n }\n }\n}\n\nimpl ToField for AztecAddress {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl AztecAddress {\n pub fn zero() -> Self {\n Self {\n inner: 0\n }\n }\n\n pub fn from_field(field : Field) -> Self {\n Self {\n inner : field\n }\n }\n\n pub fn compute(pub_key: GrumpkinPoint, partial_address: PartialAddress) -> AztecAddress {\n AztecAddress::from_field(\n pedersen_hash(\n [pub_key.x, pub_key.y, partial_address.to_field()],\n GENERATOR_INDEX__CONTRACT_ADDRESS\n )\n )\n }\n\n pub fn is_zero(self) -> bool {\n self.inner == 0\n }\n \n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n\n pub fn conditional_assign(predicate: bool, lhs : Self, rhs : Self) -> Self{\n let result = utils::conditional_assign(predicate, rhs.to_field(), lhs.to_field());\n Self {\n inner : result\n }\n }\n\n pub fn serialize(self: Self) -> [Field; 1] {\n [self.inner]\n }\n\n pub fn deserialize(fields: [Field; 1]) -> Self {\n Self {\n inner: fields[0]\n }\n }\n}\n\nstruct EthAddress{\n inner : Field\n}\n\nimpl Eq for EthAddress {\n fn eq(self, other : Self) -> bool {\n self.to_field() == other.to_field()\n }\n}\n\nimpl Empty for EthAddress {\n fn empty() -> Self {\n Self {\n inner : 0\n }\n }\n}\n\nimpl ToField for EthAddress {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl EthAddress{\n pub fn zero() -> Self {\n Self {\n inner: 0\n }\n }\n\n pub fn from_field(field : Field) -> Self {\n Self {\n inner : field\n }\n }\n\n pub fn is_zero(self) -> bool {\n self.inner == 0\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n\n pub fn conditional_assign(predicate: bool, lhs : Self, rhs : Self) -> Self{\n let result = utils::conditional_assign(predicate, rhs.to_field(), lhs.to_field());\n Self {\n inner : result\n }\n }\n\n pub fn serialize(self: Self) -> [Field; 1] {\n [self.inner]\n }\n\n pub fn deserialize(fields: [Field; 1]) -> Self {\n Self {\n inner: fields[0]\n }\n }\n}\n\n// Partial address\nstruct PartialAddress {\n inner : Field\n}\n\nimpl ToField for PartialAddress {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl PartialAddress {\n pub fn from_field(field : Field) -> Self {\n Self {\n inner : field\n }\n }\n\n pub fn compute(contract_address_salt : Field, function_tree_root : Field, constructor_hash : Field) -> Self {\n PartialAddress::from_field(\n pedersen_hash([\n // TODO why the zeroes?\n 0,\n 0,\n contract_address_salt,\n function_tree_root,\n constructor_hash\n ], GENERATOR_INDEX__PARTIAL_ADDRESS)\n )\n }\n\n pub fn to_field(self) -> Field {\n self.inner\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n}\n",
883
899
  "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/address.nr"
884
900
  },
885
- "120": {
901
+ "125": {
886
902
  "source": "use crate::address::EthAddress;\nuse crate::constants::{\n CONTRACT_DEPLOYMENT_DATA_LENGTH,\n GENERATOR_INDEX__CONTRACT_DEPLOYMENT_DATA,\n};\nuse crate::hash::pedersen_hash;\nuse crate::grumpkin_point::GrumpkinPoint;\nuse crate::traits::Hash;\n\n// docs:start:contract-deployment-data\nstruct ContractDeploymentData {\n deployer_public_key : GrumpkinPoint,\n constructor_vk_hash : Field,\n function_tree_root : Field,\n contract_address_salt : Field,\n portal_contract_address : EthAddress,\n}\n// docs:end:contract-deployment-data\n\nimpl Hash for ContractDeploymentData {\n fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__CONTRACT_DEPLOYMENT_DATA)\n }\n}\n\nimpl ContractDeploymentData {\n fn serialize(self) -> [Field; CONTRACT_DEPLOYMENT_DATA_LENGTH] {\n [\n self.deployer_public_key.x,\n self.deployer_public_key.y,\n self.constructor_vk_hash,\n self.function_tree_root,\n self.contract_address_salt,\n self.portal_contract_address.to_field(),\n ]\n }\n\n fn assert_is_zero(self) {\n self.deployer_public_key.assert_is_zero();\n assert(self.constructor_vk_hash == 0);\n assert(self.function_tree_root == 0);\n assert(self.contract_address_salt == 0);\n self.portal_contract_address.assert_is_zero();\n }\n\n}\n",
887
903
  "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/contrakt/deployment_data.nr"
888
904
  },
889
- "121": {
905
+ "126": {
890
906
  "source": "use crate::{\n constants::{\n CONTRACT_STORAGE_UPDATE_REQUEST_LENGTH,\n GENERATOR_INDEX__PUBLIC_DATA_UPDATE_REQUEST,\n },\n hash::pedersen_hash,\n};\nuse dep::std::cmp::Eq;\nuse crate::traits::{Hash, Empty};\n\nstruct StorageUpdateRequest{\n storage_slot : Field,\n old_value : Field,\n new_value : Field,\n}\n\nimpl Eq for StorageUpdateRequest {\n fn eq(self, request: Self) -> bool {\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/3595)\n (request.storage_slot == self.storage_slot)\n & (request.old_value == self.old_value)\n & (request.new_value == self.new_value)\n }\n}\n\nimpl Empty for StorageUpdateRequest {\n fn empty() -> Self {\n StorageUpdateRequest {\n storage_slot: 0,\n old_value: 0,\n new_value: 0,\n }\n }\n}\n\nimpl Hash for StorageUpdateRequest {\n fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__PUBLIC_DATA_UPDATE_REQUEST)\n }\n}\n\nimpl StorageUpdateRequest {\n pub fn serialize(self) -> [Field; CONTRACT_STORAGE_UPDATE_REQUEST_LENGTH] {\n [self.storage_slot, self.old_value, self.new_value]\n }\n\n pub fn is_empty(self) -> bool {\n self.storage_slot == 0\n }\n}\n",
891
907
  "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/contrakt/storage_update_request.nr"
892
908
  },
893
- "122": {
909
+ "127": {
894
910
  "source": "use crate::{\n constants::{\n CONTRACT_STORAGE_READ_LENGTH,\n GENERATOR_INDEX__PUBLIC_DATA_READ,\n },\n hash::pedersen_hash,\n};\nuse crate::traits::Empty;\n\nstruct StorageRead {\n storage_slot: Field,\n current_value: Field,\n}\n\nimpl Empty for StorageRead { \n fn empty() -> Self {\n Self {\n storage_slot: 0,\n current_value: 0,\n }\n }\n}\n\nimpl StorageRead {\n\n pub fn serialize(self) -> [Field; CONTRACT_STORAGE_READ_LENGTH] {\n [self.storage_slot, self.current_value]\n }\n\n pub fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__PUBLIC_DATA_READ)\n }\n\n pub fn is_empty(self) -> bool {\n self.storage_slot == 0\n }\n}\n",
895
911
  "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/contrakt/storage_read.nr"
896
912
  },
897
- "131": {
913
+ "135": {
898
914
  "source": "use crate::abis::{\n function_data::FunctionData,\n private_circuit_public_inputs::PrivateCircuitPublicInputs,\n public_circuit_public_inputs::PublicCircuitPublicInputs,\n};\nuse crate::address::AztecAddress;\nuse crate::constants::{\n GENERATOR_INDEX__CALL_STACK_ITEM,\n};\nuse crate::traits::Hash;\n\nstruct PrivateCallStackItem {\n // This is the _actual_ contract address relating to where this function's code resides in the\n // contract tree. Regardless of whether this is a call or delegatecall, this\n // `contract_address` _does not change_. Amongst other things, it's used as a lookup for\n // getting the correct code from the tree. There is a separate `storage_contract_address`\n // within a CallStackItem which varies depending on whether this is a call or delegatecall.\n contract_address: AztecAddress,\n public_inputs: PrivateCircuitPublicInputs,\n function_data: FunctionData,\n // Not really needed for PrivateCallStackItem.\n is_execution_request: bool,\n}\n\nimpl Hash for PrivateCallStackItem {\n fn hash(self) -> Field {\n dep::std::hash::pedersen_hash_with_separator([\n self.contract_address.to_field(),\n self.function_data.hash(),\n self.public_inputs.hash(),\n ], GENERATOR_INDEX__CALL_STACK_ITEM)\n }\n}\n\nstruct PublicCallStackItem {\n contract_address: AztecAddress,\n public_inputs: PublicCircuitPublicInputs,\n function_data: FunctionData,\n // True if this call stack item represents a request to execute a function rather than a\n // fulfilled execution. Used when enqueuing calls from private to public functions.\n is_execution_request: bool,\n}\n\nimpl Hash for PublicCallStackItem {\n fn hash(self) -> Field {\n let item = if self.is_execution_request {\n self.as_execution_request()\n } else {\n self\n };\n\n dep::std::hash::pedersen_hash_with_separator([\n item.contract_address.to_field(),\n item.function_data.hash(),\n item.public_inputs.hash(),\n ], GENERATOR_INDEX__CALL_STACK_ITEM)\n }\n}\n\nimpl PublicCallStackItem {\n fn as_execution_request(self) -> Self {\n let public_inputs = self.public_inputs;\n let mut request_public_inputs: PublicCircuitPublicInputs = dep::std::unsafe::zeroed();\n request_public_inputs.call_context = public_inputs.call_context;\n request_public_inputs.args_hash = public_inputs.args_hash;\n\n let call_stack_item = PublicCallStackItem {\n contract_address: self.contract_address,\n function_data: self.function_data,\n is_execution_request: true,\n public_inputs: request_public_inputs,\n };\n call_stack_item\n }\n}\n",
899
915
  "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/call_stack_item.nr"
900
916
  },
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",
917
+ "140": {
918
+ "source": "use crate::constants::{GENERATOR_INDEX__SIDE_EFFECT};\nuse dep::std::cmp::Eq;\nuse crate::traits::{Empty, Hash};\n\ntrait Ordered {\n fn counter(self) -> u32;\n}\n\nstruct SideEffect{\n value: Field,\n counter: u32,\n}\n\nimpl Ordered for SideEffect {\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl Eq for SideEffect {\n fn eq(self, side_effect: SideEffect) -> bool {\n (self.value == side_effect.value)\n & (self.counter == side_effect.counter)\n }\n}\n\nimpl Empty for SideEffect {\n fn empty() -> Self {\n SideEffect {\n value: 0,\n counter: 0,\n }\n }\n}\n\nimpl Hash for SideEffect {\n fn hash(self) -> Field {\n dep::std::hash::pedersen_hash_with_separator(\n self.serialize() , GENERATOR_INDEX__SIDE_EFFECT)\n }\n}\n\nimpl SideEffect {\n pub fn serialize(self) -> [Field; 2] {\n [self.value, self.counter as Field]\n }\n\n pub fn deserialise(values: [Field; 2]) -> Self {\n Self {\n value: values[0],\n counter: values[1] as u32,\n }\n }\n\n pub fn is_empty(self) -> bool {\n (self.value == 0)\n & (self.counter == 0)\n }\n}\n\nstruct SideEffectLinkedToNoteHash{\n value: Field,\n note_hash: Field,\n counter: u32,\n}\n\nimpl Ordered for SideEffectLinkedToNoteHash {\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl Eq for SideEffectLinkedToNoteHash {\n fn eq(self, side_effect: SideEffectLinkedToNoteHash) -> bool {\n (self.value == side_effect.value)\n & (self.note_hash == side_effect.note_hash) \n & (self.counter == side_effect.counter)\n }\n}\n\nimpl Empty for SideEffectLinkedToNoteHash {\n fn empty() -> Self {\n SideEffectLinkedToNoteHash {\n value: 0,\n note_hash: 0,\n counter: 0,\n }\n }\n}\n\nimpl Hash for SideEffectLinkedToNoteHash {\n fn hash(self) -> Field {\n dep::std::hash::pedersen_hash_with_separator(\n self.serialize(),\n GENERATOR_INDEX__SIDE_EFFECT)\n }\n}\n\nimpl SideEffectLinkedToNoteHash{\n pub fn serialize(self) -> [Field; 3] {\n [self.value, self.note_hash, self.counter as Field]\n }\n\n pub fn deserialise(values: [Field; 3]) -> Self {\n Self {\n value: values[0],\n note_hash: values[1],\n counter: values[2] as u32,\n }\n }\n\n pub fn is_empty(self) -> bool {\n (self.value == 0)\n & (self.note_hash == 0)\n & (self.counter == 0)\n }\n}\n\n",
903
919
  "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/side_effect.nr"
904
920
  },
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",
921
+ "143": {
922
+ "source": "use crate::constants::{\n MAX_NEW_L2_TO_L1_MSGS_PER_CALL,\n MAX_NEW_NULLIFIERS_PER_CALL,\n MAX_NEW_COMMITMENTS_PER_CALL,\n MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL,\n MAX_PUBLIC_DATA_READS_PER_CALL,\n MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL,\n NUM_FIELDS_PER_SHA256,\n RETURN_VALUES_LENGTH,\n GENERATOR_INDEX__PUBLIC_CIRCUIT_PUBLIC_INPUTS,\n PUBLIC_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH,\n PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH,\n};\nuse crate::{\n abis::{\n call_context::CallContext,\n side_effect::{SideEffect, SideEffectLinkedToNoteHash},\n block_header::BlockHeader,\n },\n address::AztecAddress,\n contrakt::{\n storage_read::StorageRead,\n storage_update_request::StorageUpdateRequest,\n },\n utils::bounded_vec::BoundedVec,\n};\n\nstruct PublicCircuitPublicInputs{\n call_context: CallContext,\n\n args_hash: Field,\n return_values: [Field; RETURN_VALUES_LENGTH],\n\n contract_storage_update_requests: [StorageUpdateRequest; MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL],\n contract_storage_reads: [StorageRead; MAX_PUBLIC_DATA_READS_PER_CALL],\n\n // todo: add sideeffect ranges for the input to these hashes\n public_call_stack_hashes: [Field; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL],\n new_commitments: [SideEffect; MAX_NEW_COMMITMENTS_PER_CALL],\n new_nullifiers: [SideEffectLinkedToNoteHash; MAX_NEW_NULLIFIERS_PER_CALL],\n new_l2_to_l1_msgs: [Field; MAX_NEW_L2_TO_L1_MSGS_PER_CALL],\n\n unencrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n\n // Here so that the gas cost of this request can be measured by circuits, without actually needing to feed in the\n // variable-length data.\n unencrypted_log_preimages_length: Field,\n\n block_header: BlockHeader,\n\n prover_address: AztecAddress,\n}\n\nimpl PublicCircuitPublicInputs{\n fn hash(self) -> Field { \n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/3595) have mercy por favor \n let mut inputs: BoundedVec<Field, PUBLIC_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH> = BoundedVec::new(0);\n inputs.push(self.call_context.hash());\n inputs.push(self.args_hash);\n inputs.push_array(self.return_values);\n for i in 0..MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL {\n inputs.push(self.contract_storage_update_requests[i].hash());\n }\n for i in 0..MAX_PUBLIC_DATA_READS_PER_CALL {\n inputs.push(self.contract_storage_reads[i].hash());\n }\n inputs.push_array(self.public_call_stack_hashes);\n\n for i in 0..MAX_NEW_COMMITMENTS_PER_CALL{\n inputs.push(self.new_commitments[i].hash());\n }\n for i in 0..MAX_NEW_NULLIFIERS_PER_CALL{\n inputs.push(self.new_nullifiers[i].hash());\n }\n inputs.push_array(self.new_l2_to_l1_msgs);\n inputs.push_array(self.unencrypted_logs_hash);\n inputs.push(self.unencrypted_log_preimages_length);\n inputs.push_array(self.block_header.serialize());\n inputs.push(self.prover_address.to_field());\n\n assert_eq(inputs.len(), PUBLIC_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH, \"Incorrect number of input fields when hashing PublicCircuitPublicInputs\");\n\n dep::std::hash::pedersen_hash_with_separator(inputs.storage, GENERATOR_INDEX__PUBLIC_CIRCUIT_PUBLIC_INPUTS)\n }\n\n pub fn serialize(self) -> [Field; PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH] {\n let mut fields: BoundedVec<Field, PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH> = BoundedVec::new(0); \n fields.push_array(self.call_context.serialize()); \n fields.push(self.args_hash);\n fields.push_array(self.return_values);\n for i in 0..MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL {\n fields.push_array(self.contract_storage_update_requests[i].serialize());\n }\n for i in 0..MAX_PUBLIC_DATA_READS_PER_CALL {\n fields.push_array(self.contract_storage_reads[i].serialize());\n }\n fields.push_array(self.public_call_stack_hashes);\n\n for i in 0..MAX_NEW_COMMITMENTS_PER_CALL{\n fields.push_array(self.new_commitments[i].serialize());\n }\n for i in 0..MAX_NEW_NULLIFIERS_PER_CALL{\n fields.push_array(self.new_nullifiers[i].serialize());\n }\n fields.push_array(self.new_l2_to_l1_msgs);\n fields.push_array(self.unencrypted_logs_hash);\n fields.push(self.unencrypted_log_preimages_length);\n fields.push_array(self.block_header.serialize());\n fields.push(self.prover_address.to_field());\n fields.storage\n }\n}\n",
907
923
  "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/public_circuit_public_inputs.nr"
908
924
  },
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",
925
+ "145": {
926
+ "source": "use crate::{\n abis::{\n call_context::CallContext,\n block_header::BlockHeader,\n side_effect::{SideEffect, SideEffectLinkedToNoteHash},\n },\n contrakt::deployment_data::ContractDeploymentData,\n hash::{\n pedersen_hash,\n },\n utils::bounded_vec::BoundedVec,\n};\nuse crate::constants::{\n MAX_READ_REQUESTS_PER_CALL,\n MAX_NEW_COMMITMENTS_PER_CALL,\n MAX_NEW_NULLIFIERS_PER_CALL,\n MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL,\n MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL,\n MAX_NEW_L2_TO_L1_MSGS_PER_CALL,\n NUM_FIELDS_PER_SHA256,\n RETURN_VALUES_LENGTH,\n PRIVATE_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH,\n PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH,\n GENERATOR_INDEX__PRIVATE_CIRCUIT_PUBLIC_INPUTS,\n};\nuse crate::traits::Hash;\n\nstruct PrivateCircuitPublicInputs {\n call_context: CallContext,\n \n args_hash: Field,\n return_values: [Field; RETURN_VALUES_LENGTH],\n\n read_requests: [SideEffect; MAX_READ_REQUESTS_PER_CALL],\n\n new_commitments: [SideEffect; MAX_NEW_COMMITMENTS_PER_CALL],\n new_nullifiers: [SideEffectLinkedToNoteHash; MAX_NEW_NULLIFIERS_PER_CALL],\n private_call_stack_hashes: [Field; MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL],\n public_call_stack_hashes: [Field; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL],\n new_l2_to_l1_msgs: [Field; MAX_NEW_L2_TO_L1_MSGS_PER_CALL],\n end_side_effect_counter : u32,\n\n encrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n unencrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n\n // Here so that the gas cost of this request can be measured by circuits, without actually needing to feed in the\n // variable-length data.\n encrypted_log_preimages_length: Field,\n unencrypted_log_preimages_length: Field,\n\n block_header: BlockHeader,\n\n contract_deployment_data: ContractDeploymentData,\n\n chain_id: Field,\n version: Field,\n}\n\nimpl Hash for PrivateCircuitPublicInputs {\n fn hash(self) -> Field {\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/3595)\n let mut fields: BoundedVec<Field, PRIVATE_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH> = BoundedVec::new(0); \n fields.push(self.call_context.hash());\n fields.push(self.args_hash);\n fields.push_array(self.return_values);\n\n for i in 0..MAX_READ_REQUESTS_PER_CALL{\n fields.push_array(self.read_requests[i].serialize());\n }\n for i in 0..MAX_NEW_COMMITMENTS_PER_CALL{\n fields.push_array(self.new_commitments[i].serialize());\n }\n for i in 0..MAX_NEW_NULLIFIERS_PER_CALL{\n fields.push_array(self.new_nullifiers[i].serialize());\n }\n fields.push_array(self.private_call_stack_hashes);\n fields.push_array(self.public_call_stack_hashes);\n fields.push_array(self.new_l2_to_l1_msgs);\n fields.push(self.end_side_effect_counter as Field);\n fields.push_array(self.encrypted_logs_hash);\n fields.push_array(self.unencrypted_logs_hash);\n fields.push(self.encrypted_log_preimages_length);\n fields.push(self.unencrypted_log_preimages_length);\n fields.push_array(self.block_header.serialize());\n fields.push(self.contract_deployment_data.hash());\n fields.push(self.chain_id);\n fields.push(self.version);\n\n assert_eq(fields.len(), PRIVATE_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH, \"Incorrect number of input fields when hashing PrivateCircuitPublicInputs\");\n\n pedersen_hash(fields.storage, GENERATOR_INDEX__PRIVATE_CIRCUIT_PUBLIC_INPUTS)\n }\n}\n\nimpl PrivateCircuitPublicInputs {\n fn serialize(self) -> [Field; PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH] {\n let mut fields: BoundedVec<Field, PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH> = BoundedVec::new(0); \n fields.push_array(self.call_context.serialize());\n fields.push(self.args_hash);\n fields.push_array(self.return_values);\n\n for i in 0..MAX_READ_REQUESTS_PER_CALL{\n fields.push_array(self.read_requests[i].serialize());\n }\n for i in 0..MAX_NEW_COMMITMENTS_PER_CALL{\n fields.push_array(self.new_commitments[i].serialize());\n }\n for i in 0..MAX_NEW_NULLIFIERS_PER_CALL{\n fields.push_array(self.new_nullifiers[i].serialize());\n }\n fields.push_array(self.private_call_stack_hashes);\n fields.push_array(self.public_call_stack_hashes);\n fields.push_array(self.new_l2_to_l1_msgs);\n fields.push(self.end_side_effect_counter as Field);\n fields.push_array(self.encrypted_logs_hash);\n fields.push_array(self.unencrypted_logs_hash);\n fields.push(self.encrypted_log_preimages_length);\n fields.push(self.unencrypted_log_preimages_length);\n fields.push_array(self.block_header.serialize());\n fields.push_array(self.contract_deployment_data.serialize());\n fields.push(self.chain_id);\n fields.push(self.version);\n\n assert_eq(fields.len(), PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH);\n\n fields.storage\n }\n}\n\n#[test]\nfn serialization_smoke() {\n let pcpi: PrivateCircuitPublicInputs = dep::std::unsafe::zeroed();\n let _serialized = pcpi.serialize();\n}\n\n#[test]\nfn hash_smoke() {\n let pcpi: PrivateCircuitPublicInputs = dep::std::unsafe::zeroed();\n let _hashed = pcpi.hash();\n}\n",
911
927
  "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/private_circuit_public_inputs.nr"
912
928
  },
913
- "144": {
929
+ "148": {
914
930
  "source": "use crate::abis::function_selector::FunctionSelector;\nuse crate::constants::GENERATOR_INDEX__FUNCTION_DATA;\n\nstruct FunctionData {\n // First four bytes of the abi encoding \n // of a function. \n selector : FunctionSelector,\n is_internal : bool,\n is_private : bool,\n is_constructor : bool,\n}\n\nimpl FunctionData {\n // A field is ~256 bits\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/3057): Since, function data can fit into a Field,\n // This method will simply return a bit packed Field instead of hashing\n fn hash(self) -> Field {\n dep::std::hash::pedersen_hash_with_separator([\n self.selector.to_field(),\n self.is_internal as Field,\n self.is_private as Field,\n self.is_constructor as Field,\n ], GENERATOR_INDEX__FUNCTION_DATA)\n }\n}\n",
915
931
  "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/function_data.nr"
916
932
  },
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",
933
+ "153": {
934
+ "source": "use crate::{\n abis::function_selector::FunctionSelector,\n address::{EthAddress,AztecAddress},\n constants::{\n CALL_CONTEXT_LENGTH,\n GENERATOR_INDEX__CALL_CONTEXT,\n },\n hash::pedersen_hash,\n};\nuse dep::std::cmp::Eq;\nuse crate::traits::Hash;\n\n// docs:start:call-context\nstruct CallContext {\n msg_sender : AztecAddress,\n storage_contract_address : AztecAddress,\n portal_contract_address : EthAddress,\n\n function_selector : FunctionSelector,\n\n is_delegate_call : bool,\n is_static_call : bool,\n is_contract_deployment : bool,\n\n start_side_effect_counter : u32,\n}\n// docs:end:call-context\n\nimpl Eq for CallContext {\n fn eq(self, call_context: CallContext) -> bool {\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/3595)\n call_context.msg_sender.eq(self.msg_sender)\n & call_context.storage_contract_address.eq(self.storage_contract_address)\n & call_context.portal_contract_address.eq(self.portal_contract_address)\n & call_context.function_selector.eq(self.function_selector)\n & (call_context.is_delegate_call == self.is_delegate_call)\n & (call_context.is_static_call == self.is_static_call)\n & (call_context.is_contract_deployment == self.is_contract_deployment)\n & (call_context.start_side_effect_counter == self.start_side_effect_counter)\n }\n}\n\nimpl Hash for CallContext {\n fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__CALL_CONTEXT)\n }\n}\n\nimpl CallContext {\n fn serialize(self) -> [Field; CALL_CONTEXT_LENGTH] {\n [\n self.msg_sender.to_field(),\n self.storage_contract_address.to_field(),\n self.portal_contract_address.to_field(),\n self.function_selector.to_field(),\n self.is_delegate_call as Field,\n self.is_static_call as Field,\n self.is_contract_deployment as Field,\n self.start_side_effect_counter as Field,\n ]\n }\n\n fn assert_is_zero(self) {\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/3595)\n assert(self.msg_sender.to_field() == 0);\n assert(self.storage_contract_address.to_field() == 0);\n assert(self.portal_contract_address.to_field() == 0);\n assert(self.function_selector.to_field() == 0);\n assert(self.is_delegate_call == false);\n assert(self.is_static_call == false);\n assert(self.is_contract_deployment == false);\n assert(self.start_side_effect_counter == 0);\n }\n}\n",
919
935
  "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/call_context.nr"
920
936
  },
921
- "153": {
937
+ "159": {
922
938
  "source": "use crate::utils::field::field_from_bytes;\nuse dep::std::cmp::Eq;\n\nglobal SELECTOR_SIZE = 4;\n\nstruct FunctionSelector {\n // 1st 4-bytes of abi-encoding of function.\n inner: u32,\n}\n\nimpl Eq for FunctionSelector {\n fn eq(self, function_selector: FunctionSelector) -> bool {\n function_selector.inner == self.inner\n }\n}\n\nimpl FunctionSelector {\n fn to_field(self) -> Field {\n self.inner as Field\n }\n\n pub fn from_u32(value: u32) -> Self {\n Self {\n inner : value,\n }\n }\n\n pub fn from_field(value : Field) -> Self {\n Self {\n inner : value as u32,\n }\n }\n\n pub fn from_signature<N>(signature: str<N>) -> Self {\n let bytes = signature.as_bytes();\n let hash = dep::std::hash::keccak256(bytes, bytes.len() as u32);\n\n let mut selector_be_bytes = [0; SELECTOR_SIZE];\n for i in 0..SELECTOR_SIZE {\n selector_be_bytes[i] = hash[i];\n }\n\n FunctionSelector::from_field(field_from_bytes(selector_be_bytes, true))\n }\n\n pub fn zero() -> Self {\n Self { inner: 0 }\n }\n\n pub fn serialize(self: Self) -> [Field; 1] {\n [self.inner as Field]\n }\n\n pub fn deserialize(fields: [Field; 1]) -> Self {\n Self {\n inner: fields[0] as u32\n }\n }\n}\n",
923
939
  "path": "/usr/src/yarn-project/noir-protocol-circuits/src/crates/types/src/abis/function_selector.nr"
924
940
  },
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",
941
+ "187": {
942
+ "source": "use dep::aztec::abi;\nuse dep::aztec::types::vec::BoundedVec;\nuse dep::aztec::context::PrivateContext;\nuse dep::aztec::protocol_types::{\n abis::{\n call_stack_item::{\n PrivateCallStackItem,\n PublicCallStackItem,\n },\n function_selector::FunctionSelector,\n },\n address::AztecAddress,\n constants::GENERATOR_INDEX__SIGNATURE_PAYLOAD,\n hash::pedersen_hash,\n};\n\nglobal ACCOUNT_MAX_CALLS: Field = 4;\n// 1 (ARGS_HASH) + 1 (FUNCTION_SELECTOR) + 1 (TARGET_ADDRESS) + 1 (IS_PUBLIC)\nglobal FUNCTION_CALL_SIZE: Field = 4;\n// 3 * 32 + 1\nglobal FUNCTION_CALL_SIZE_IN_BYTES: Field = 97;\n\nstruct FunctionCall {\n args_hash: Field,\n function_selector: FunctionSelector,\n target_address: AztecAddress,\n is_public: bool,\n}\n\nimpl FunctionCall {\n fn serialize(self) -> [Field; FUNCTION_CALL_SIZE] {\n [self.args_hash, self.function_selector.to_field(), self.target_address.to_field(), self.is_public as Field]\n }\n\n fn to_be_bytes(self) -> [u8; FUNCTION_CALL_SIZE_IN_BYTES] {\n let mut bytes: [u8; FUNCTION_CALL_SIZE_IN_BYTES] = [0; FUNCTION_CALL_SIZE_IN_BYTES];\n let args_hash_bytes = self.args_hash.to_be_bytes(32);\n for i in 0..32 { bytes[i] = args_hash_bytes[i]; }\n let function_selector_bytes = self.function_selector.to_field().to_be_bytes(32);\n for i in 0..32 { bytes[i + 32] = function_selector_bytes[i]; }\n let target_address_bytes = self.target_address.to_field().to_be_bytes(32);\n for i in 0..32 { bytes[i + 64] = target_address_bytes[i]; }\n bytes[96] = self.is_public as u8;\n bytes\n }\n}\n\n// FUNCTION_CALL_SIZE * ACCOUNT_MAX_CALLS + 1\nglobal ENTRYPOINT_PAYLOAD_SIZE: Field = 17;\n// FUNCTION_CALL_SIZE_IN_BYTES * ACCOUNT_MAX_CALLS + 32\nglobal ENTRYPOINT_PAYLOAD_SIZE_IN_BYTES: Field = 420;\n\n// Note: If you change the following struct you have to update default_entrypoint.ts\n// docs:start:entrypoint-struct\nstruct EntrypointPayload {\n function_calls: [FunctionCall; ACCOUNT_MAX_CALLS],\n nonce: Field,\n}\n// docs:end:entrypoint-struct\n\nimpl EntrypointPayload {\n fn hash(self) -> Field {\n pedersen_hash(\n self.serialize(), \n GENERATOR_INDEX__SIGNATURE_PAYLOAD\n )\n }\n\n // Serializes the entrypoint struct\n fn serialize(self) -> [Field; ENTRYPOINT_PAYLOAD_SIZE] {\n let mut fields: BoundedVec<Field, ENTRYPOINT_PAYLOAD_SIZE> = BoundedVec::new(0); \n for call in self.function_calls {\n fields.push_array(call.serialize());\n }\n fields.push(self.nonce);\n fields.storage\n }\n\n // Serializes the payload as an array of bytes. Useful for hashing with sha256.\n fn to_be_bytes(self) -> [u8; ENTRYPOINT_PAYLOAD_SIZE_IN_BYTES] {\n let mut bytes: [u8; ENTRYPOINT_PAYLOAD_SIZE_IN_BYTES] = [0; ENTRYPOINT_PAYLOAD_SIZE_IN_BYTES];\n\n for i in 0..ACCOUNT_MAX_CALLS {\n let item_bytes = self.function_calls[i].to_be_bytes();\n for j in 0..FUNCTION_CALL_SIZE_IN_BYTES { \n bytes[i * FUNCTION_CALL_SIZE_IN_BYTES + j] = item_bytes[j];\n }\n }\n\n let nonce_bytes = self.nonce.to_be_bytes(32);\n let nonce_offset = FUNCTION_CALL_SIZE_IN_BYTES * ACCOUNT_MAX_CALLS;\n for j in 0..32 {\n bytes[nonce_offset + j] = nonce_bytes[j];\n }\n \n bytes\n }\n\n // Executes all private and public calls \n // docs:start:entrypoint-execute-calls\n fn execute_calls(self, context: &mut PrivateContext) {\n for call in self.function_calls {\n if !call.target_address.is_zero() {\n if call.is_public {\n context.call_public_function_with_packed_args(\n call.target_address, call.function_selector, call.args_hash\n );\n } else {\n let _result = context.call_private_function_with_packed_args(\n call.target_address, call.function_selector, call.args_hash\n );\n }\n }\n }\n }\n // docs:end:entrypoint-execute-calls\n}\n",
927
943
  "path": "/usr/src/yarn-project/aztec-nr/authwit/src/entrypoint.nr"
928
944
  },
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",
945
+ "188": {
946
+ "source": "use dep::aztec::context::{PrivateContext, PublicContext, Context};\nuse dep::aztec::state_vars::{map::Map, public_state::PublicState};\nuse dep::aztec::types::type_serialization::bool_serialization::{BoolSerializationMethods,BOOL_SERIALIZED_LEN};\n\nuse crate::entrypoint::EntrypointPayload;\nuse crate::auth::IS_VALID_SELECTOR;\n\nstruct AccountActions {\n context: Context,\n is_valid_impl: fn(&mut PrivateContext, Field) -> bool,\n approved_action: Map<Field, PublicState<bool, BOOL_SERIALIZED_LEN>>,\n}\n\nimpl AccountActions {\n pub fn init(context: Context, approved_action_storage_slot: Field, is_valid_impl: fn(&mut PrivateContext, Field) -> bool) -> Self {\n AccountActions {\n context: context,\n is_valid_impl: is_valid_impl,\n approved_action: Map::new(\n context,\n approved_action_storage_slot,\n |context, slot| {\n PublicState::new(context, slot, BoolSerializationMethods)\n },\n ),\n }\n }\n\n pub fn private(context: &mut PrivateContext, approved_action_storage_slot: Field, is_valid_impl: fn(&mut PrivateContext, Field) -> bool) -> Self {\n AccountActions::init(Context::private(context), approved_action_storage_slot, is_valid_impl)\n }\n\n pub fn public(context: &mut PublicContext, approved_action_storage_slot: Field, is_valid_impl: fn(&mut PrivateContext, Field) -> bool) -> Self {\n AccountActions::init(Context::public(context), approved_action_storage_slot, is_valid_impl)\n }\n \n // docs:start:entrypoint\n pub fn entrypoint(self, payload: EntrypointPayload) {\n let message_hash = payload.hash();\n let valid_fn = self.is_valid_impl;\n let private_context = self.context.private.unwrap();\n assert(valid_fn(private_context, message_hash));\n payload.execute_calls(private_context);\n }\n // docs:end:entrypoint\n\n pub fn is_valid(self, message_hash: Field) -> Field {\n let valid_fn = self.is_valid_impl;\n if (valid_fn(self.context.private.unwrap(), message_hash)) {\n IS_VALID_SELECTOR\n } else {\n 0\n }\n }\n\n pub fn is_valid_public(self, message_hash: Field) -> Field {\n let value = self.approved_action.at(message_hash).read();\n if (value){\n IS_VALID_SELECTOR\n } else {\n 0\n }\n }\n\n pub fn internal_set_is_valid_storage(self, message_hash: Field, value: bool) {\n self.approved_action.at(message_hash).write(value);\n }\n}\n",
931
947
  "path": "/usr/src/yarn-project/aztec-nr/authwit/src/account.nr"
932
948
  },
933
- "185": {
949
+ "191": {
934
950
  "source": "#[oracle(getAuthWitness)]\nfn get_auth_witness_oracle<N>(_message_hash: Field) -> [Field; N] {}\n\nunconstrained pub fn get_auth_witness<N>(message_hash: Field) -> [Field; N] {\n get_auth_witness_oracle(message_hash)\n}\n",
935
951
  "path": "/usr/src/yarn-project/aztec-nr/authwit/src/auth_witness.nr"
936
952
  },
937
- "206": {
953
+ "212": {
938
954
  "source": "mod util;\nmod auth_oracle;\n\ncontract SchnorrSingleKeyAccount {\n use dep::std::{\n option::Option,\n };\n use dep::aztec::context::{ PrivateContext, PublicContext, Context };\n\n use dep::authwit::{\n entrypoint::EntrypointPayload,\n account::AccountActions,\n };\n\n use crate::{ util::recover_address, auth_oracle::get_auth_witness };\n\n global ACCOUNT_ACTIONS_STORAGE_SLOT = 1;\n\n #[aztec(private)]\n fn constructor() {}\n\n // Note: If you globally change the entrypoint signature don't forget to update default_entrypoint.ts\n #[aztec(private)]\n fn entrypoint(payload: pub EntrypointPayload) {\n let actions = AccountActions::private(&mut context, ACCOUNT_ACTIONS_STORAGE_SLOT, is_valid_impl);\n actions.entrypoint(payload);\n }\n\n #[aztec(private)]\n fn is_valid(message_hash: Field) -> Field {\n let actions = AccountActions::private(&mut context, ACCOUNT_ACTIONS_STORAGE_SLOT, is_valid_impl);\n actions.is_valid(message_hash)\n }\n\n #[aztec(public)]\n fn is_valid_public(message_hash: Field) -> Field {\n let actions = AccountActions::public(&mut context, ACCOUNT_ACTIONS_STORAGE_SLOT, is_valid_impl);\n actions.is_valid_public(message_hash)\n }\n\n #[aztec(public)]\n internal fn set_is_valid_storage(message_hash: Field, value: bool) {\n let actions = AccountActions::public(&mut context, ACCOUNT_ACTIONS_STORAGE_SLOT, is_valid_impl);\n actions.internal_set_is_valid_storage(message_hash, value)\n }\n\n #[contract_library_method]\n fn is_valid_impl(context: &mut PrivateContext, message_hash: Field) -> pub bool {\n let witness = get_auth_witness(message_hash);\n assert(recover_address(message_hash, witness).eq(context.this_address()));\n true\n }\n}\n",
939
955
  "path": "/usr/src/yarn-project/noir-contracts/contracts/schnorr_single_key_account_contract/src/main.nr"
940
956
  },
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",
957
+ "213": {
958
+ "source": "use dep::authwit::auth_witness;\nuse dep::aztec::protocol_types::{\n address::PartialAddress,\n grumpkin_point::GrumpkinPoint,\n};\n\nstruct AuthWitness {\n owner: GrumpkinPoint,\n signature: [u8; 64],\n partial_address: PartialAddress,\n}\n\nimpl AuthWitness {\n fn deserialize(values: [Field; 67]) -> Self {\n let mut signature = [0; 64];\n for i in 0..64 {\n signature[i] = values[i + 2] as u8;\n }\n Self {\n owner: GrumpkinPoint::new(values[0], values[1]),\n signature,\n partial_address: PartialAddress::from_field(values[66]),\n }\n }\n}\n\nunconstrained pub fn get_auth_witness(message_hash: Field) -> AuthWitness {\n let witness: [Field; 67] = auth_witness::get_auth_witness(message_hash);\n AuthWitness::deserialize(witness)\n}\n",
943
959
  "path": "/usr/src/yarn-project/noir-contracts/contracts/schnorr_single_key_account_contract/src/auth_oracle.nr"
944
960
  },
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",
961
+ "214": {
962
+ "source": "use dep::aztec::protocol_types::address::AztecAddress;\nuse dep::std::{schnorr::verify_signature};\nuse crate::auth_oracle::{AuthWitness};\n\npub fn recover_address(message_hash: Field, witness: AuthWitness) -> AztecAddress {\n let message_bytes = message_hash.to_be_bytes(32);\n let verification = verify_signature(\n witness.owner.x,\n witness.owner.y,\n witness.signature,\n message_bytes\n );\n assert(verification == true);\n\n AztecAddress::compute(witness.owner, witness.partial_address)\n}\n",
947
963
  "path": "/usr/src/yarn-project/noir-contracts/contracts/schnorr_single_key_account_contract/src/util.nr"
948
964
  }
949
965
  }