@aztec/accounts 0.17.0 → 0.19.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 +90 -78
  3. package/dest/artifacts/SchnorrAccount.json +90 -78
  4. package/dest/artifacts/SchnorrSingleKeyAccount.json +77 -61
  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/+Xd5XNUVxzG8U2yu6l7CU5wh9XsXdzdqtQLWzb1lir1UupOlXopdaeutLTUvcAfxPMMm5m8gFeczHDme2eeyUxe3NnP3rtXz/n9dqdSqR2pvUuT0qy0KO3d/udlRuNv7sCWfFrrSO9jvcVcR6lUrxTq+WJ+da5QrSXlXKlc60jySb6clNcUkmKxnpSSSrVWreSq+VKxnu8sV4udjRWnw33GXE+4M1pHpgfcmYPcndU6sj3gzgZ0d+33rd32+9R+9v8D/dxtgbdX19IceLuFNPeOxNwU0NwnEnNzQHPfSMwtAc39IjGnA5r7R2LOBDQPiMScDWgeGIm5NaB5UCTmtoDmdqB5MNA8BGgeCjQPA5qHA80jgOaRQPMooHk00DwGaB4LNI8DmscDzROA5olAcw5ozgPNBaC5CDSXgOYy0NwBNFeA5gRorgLNk4DmyUDzFKB5KtA8DWieDjTPAJpnAs2zgObZQPMcoHku0DwPaJ4PNC8AmhcCzYuA5sVA8xKgeSnQvAxoXg40rwCaTwKaTwaaTwGaTwWaTwOaTweaVwLNZwDNZwLNZwHNZwPN5wDN5wLN5wHN5wPNq4Dm1UBzDWi+AGheAzTXgeZOoPlCoPkioPlioPkSoPlSoPkyoPlyoPkKoPlKoHkt0HwV0Hw10HwN0Hwt0Hwd0Hw90LwOaL4BaL4RaL4JaL4ZaL4FaL4VaL4NaL4daF4PNN8BNG8Amu8Emu8Cmu8Gmu8Bmu8Fmu8Dmu8Hmh8Amh8Emh8Cmh8Gmh8Bmh8FmjcCzY8BzY8DzU8AzU8CzU8BzU8DzZuA5meA5meB5ueA5ueB5heA5heB5peA5peB5s1A8ytA8xag+VWg+TWg+XWg+Q2g+U2g+S2g+W2g+R2g+V2g+T2g+X2g+QOg+UOgeSvQ/BHQ/DHQ/AnQ/CnQ/BnQ/DnQ/AXQ/CXQ/BXQ/DXQ/A3Q/C3QvA1o/i4Sc2tA8/fA7bwdaP4BaP4RaN4BNP8ENP8cifmQgOZfIjEfGtD8ayTmwwKaf4vEfHhA8++RmI8IaP4jEvORAc1/RmI+KqD5r0jMRwc0/x2J+ZiA5n8iMR8b0PxvJObjApr/i8R8fEDz/5GYTwho3hmJ+cSA5l2RmHsFNO8OaG7rZm5quFuUtJJRsoqfX/q+0PdJvm/wdbSvK32d5esOn4d9XvJx2sct/469X3s79+q2/m2Nv72VPkpfpZ/SXxmgDFQGKe3KYGWIMlQZpgxXRigjlVHKaGWMMlYZp4xXJigT/Z0oeaXg71opKWWlQ6koiVJVJimTlSnKVGWaMr3x3c5UZimzlTnKXGWeMl9ZoCxUFimLlSXKUmWZslxZobj/vPuxuz+5+3W7f7X7Oa9U3O/X/W/dD9b9Ud0v1P0z3U/S/RVXKe6/V1Pcn839yty/y/2s3N/J/Y7c/8f9cNwfxv1S3D/E/TTcX2Kt4v4Drsfv+vSu1+765a7nvU5xvWfXP3Y9YNfHdb1Y1091PVHX11yvuP7iBsX1+VyvzvXbXM/M9b1c78r1n1wPyfWBXC/H9WNcT8X1RTYqrj/hegyuT+D5+p6/7vncmxTP9/X8V88H9fxIzxf0/DnPJ/P8qs2K599sUTw/w/MVPH7f49k9vtvjnT3+1+NhPT7U4yU9ftDj6Ty+bKvi8Ucej+PxKR6v4fELfp/v99t+3+v3n34f6Pdjfl/kfdPvE/x8fbvi569+Hunnc35e5ec3fp7h+3vf7/r+z/dDvj/w9bKvH3095esLn299/vHx2Mcn/167lj1HMZVAULsAAA==",
11
11
  "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f"
12
12
  },
13
13
  {
@@ -90,7 +90,7 @@
90
90
  }
91
91
  ],
92
92
  "returnTypes": [],
93
- "bytecode": "H4sIAAAAAAAA/+1dB5wT1dedTbbSiyhI26U3NbO7bLEgXcUGFrChbskCiiAdQQFRUREsCIoNGzZsoIKiiAIWbNhQQQVFUbGBvYDidx+cgdkhamLuzf+9bzK/3+FsksfLLe++OTN5M/NFlmX9nm7t2FIIAUIqIdva/Z7aOoND8W12GvWRFqHfvFBBfn64MDds59klodzi0qKOofyOpQVFdpHdsahjeW5RXl64KL+osLi0uDBUbOfnhe2KjsV5Feg4jc/GkITfKsTpAn6na+53BvWRIeB3BqPfzrhvIDjuG1IfDQXi0FAgDo0F49CU+mgqEIemAnHIEYxDc+qjuUAcmgvEoaVgHFpTH60F4tDa4p0Xrb/xP1472zLnK9OVq/qE7dbOeU3xvuCG4EbgxuAm4KbgbHAOuBm4ObgFuCW4Fbg1uA247f+IOxDaIWcqLrUQl3Ya2NXeZVdtzfLVDDYGrd3j3b1xzwEd+PoKpbrs3A+8P2x2vuMA9T0Em5BLyCPkEzoSCgiFhCJCMeFAwkGEgwmHEDoRDkVfXQhdCd0I3Qk9CD0JhxEOJxxB6EU4knAU4WjCMYRjCb0JfQjHEY4nnEA4kdCX0I9wEuFkwimEUwmnEfoTTiecQTiTUEIoJZQRyglhQgVhAGEgYRDhLMLZhMGEcwhDEIOhhJlIJB0C7Jjn3Vu66+/O4FCcWyT9G4pzc9vusDoWqGLt9s3yfJ7lsiNo7RmDVNd7QU88ahCqRugz3fX/OvP4Zntrr7Prb+e73LYENbIl5X9sizvHlus953P3WPDmXY2fqa7aSI/wfzLwdzBC3+mu99Lwd0aE/+uOUbrHl1B8244Yub+ns+u1811VXDZkaGBLUCNbAgmyxRkfTr9pHlv+l9+byfu9ue5aslw5sDy2OFumy5aqrLbk79hvZMVgS1WXLVVYbdl5bqgab5879rXVmftUfdRwxcSJXzVXjJzPq7viVYM5Ximu73T6dV677UvamrQ1aWvS1qStSVuTtiZtTdqatDVpa9LWpK1JW5O2Jm1N2pq0NWlr0takrUlbk7YmbU3amrQ1aWvS1qStSVuTtiZtTdqatDVpa9LWpK1JW5O2Jm1N2upvW6taldf2O1zNZdf/2j7nvSouW6rx2hJyXxfj9K2ufTgwZfd38q4dzw+51+0717w7NjjfFXS1OTllt12dxOzauSbavY481WNTFavytR+OHdxryFUfVSPYUcXFzvdXdb3nXtfu2Fjd857UeK7usrez63UNl33O+HLbxLyu/R9rS27OyVeXHlo1Xd+bGsF/5/uddlmuv93jqpbrb4ed60qrut6rg7+rud6r6/HVfU2U+3udenN/l2Nzbdd7zrUkdVzvOWOprst2d224x1+W5z2JekmxKtdtZ9drd81kuuwSsiU3ki1Bjy0M18DY3jfc417138Xac44IutqUYx51xom7ZtzX3Tl2V/W0k7gmxVu7ma7vddduTdbvzd9xfU0tXl92zOG1XfF0xl4tVy6cz89x7d+Guq5VdHzOcPUzIcLnzpbied3Z9XdNV/zq8vq6I297ufrv7PoO9/fW4/1e2/29KYDzHc77QdffF7gCVG/3n7vi69isxnudCO3cf1f3/J+qrs/rCPtc12VHZ9dr57vUOBnuGlMTXJqJe9/v9tcdl6ArLt79lES9KRdrW5Xj4t3HuTW/e//oHqMO1xGwr6bHPud1HZd9zns1XPY5frjnE7c+T2O1NT/P/Z3O9k9zi/t6U+7rwzNdsRgQHtll1MiB/QaNHBIeMSLFZZljbbcI1gZckXQy7L7S2z27Ou8FXB4573mvaHbfCWuPsITi2+yAp3Odb9ORjX7OJQwjDCeMIIwkjCKMJowhjCWcRxhHGE84n3ABYQJhImES4ULCZMJFhIsJlxCmEC4lXEa4nDCVcAVhGmE64UrCVQhSCpKnbMm0dr8e5nk93PN6hOf1SM/rUZ7Xoz2vx3hej/W8Ps/zepzn9XjP6/M9ry/wvJ7geT3R83qS5/WFnteTPa8v8ry+2PP6Es/rKZ7Xl3peX+Z5fbnn9VTP6ys8r6d5Xk/3vL7S8/oqa7fEcjanYDuDQ/FtlWom3ltFncvYV6NM3lMgfxe//2pnuEJtIXsYU18qF8MZ49dY+/jt6NoeEX9fufDZHskYvyY6xy9/l532qPj6Crl8tkczxq+prvHLrWSnPea/9xXy+GyPZYxftobxK6jYw077vP/WV1EEn+1xjPHL0S1+RRHttMfH3lfh3/hsn88Yv2Y6xa/wb+20L4itr9x/8NmewBi/5rrEr/Af7bQnRt9X2b/4bE9ijF8LHeJX+K922hdG11coCp/tyYzxa/m/jl8oKjvti/69r45R+mxfzBi/Vv/L+OVHbad9yT/2lV8Rg8/2FMb4tf5fxa8wJjvtS/++r6IYfbYvY4xfm/9B/IorYrbTvjxyX6H/4LM9lTF+bRMdv9B/stO+Ys++7P/osz2NMX7tEhm/8v9spz29cl95cfhsX8kYv/YJil9uRVx22ldZfOcS3efs4o1fhwTFLxTfZjOeZ7ObMMZvP0Pix3ieyM5mjN/+hsSP8TyH3YwxfgcYEj/G43S7BWP8QobEj/E4027FGD/bkPgxHifZbRjjl2tI/Bh1vt2OMX55hsSPUafaHRjjl29I/Bh1lr0/Y/w6GhI/Rp1ghxjjV2BI/Bj3c3YuY/wKDYkf4zxt5zPGr8iQ+DHOM3YBY/yKDYkfY53YjGPG5oyfWs+mFp3uZ+18fNv+YKd/9bgztc4tBLbBueA8cD64I7gAXAguAheDDwQfBD4YfAi4E/hQcGdwF3BXcDdwd3APcE/wYeDDwUeAe4GPBB8FPhp8DPhYcG9wH/Bx4OPBJ4BPBPcF9wOfBD4ZfAr4VPBp4P7g08FngM8El4BLwWXgcnAYXAEeAB4IHgQ+C3w2eDD4HPAQq/LjIJ31js46SGd9pLNu0llP6ayzdNZfXgZ21ms66zid9Z3Ouk9nPehksLN+dBLYWW/qrEN11qc661ad9azOOldn/auzLtZZL+uso3XW1zrrbp31uM46XWf9rrOu92qr8sa9Pvpqi29+TYHNznzore2hYLX0/xqPXwGPX/HaEmCM0TV8fYUS9XjKfS3eudrZZlh7Po7Osio/xo/bF8vzPd741bAEL1CQSs4MgX6vtfgKSMrva/lzVEmMcU8knDGdyRhLVQjea5ekcsbUV0jSzgaG2Fnf4p+YFTvXjs0iXEe4njCbcAPhRsJNhJsJtxDmEG4l3Ea4nXCHtfuaykjXxLmvmU9xvedcD+fUXLrr/3Rm8lFgh1Lp+bvBCH6nRvA7zcXuexNYnhjUQBwyeG0Ou+NteXLhjbllyT4DVIm8BugrPGTYqPCocO9RpYMHlfUcNaRs5KChQ7qVDB7sHpxpruCoLRghcN733UnIxN9prve8N1xwJzXT9Z47wU5gUrirWs3sDV3GM/W7Qy66A+Rs3PZfZ8nMnkzx2HUXCHcs7gTPtXYPDOcyObWpAfRXhJiluP4OoE3gH9qk/E0/f1f9YlLUcU45vt7lrApAtuc7uc9JuQdIvNdk3WnxSaq5lszADTDHj9PnuyL0VRoqK+9olxaUF9rhko5FZWXFebadW1JQUlCaW1QRLu1oF3Usoj7LSnKL6OtyS8rscKikIJyo49G7LH7Zo7a7reTxKEty7hbo9x5L7+NR5fc9/DmKaCvHRHePQL8naf6jiGMn51i61+IbQ5zxc3boyr4cxDAR6u96S2YMWLx25rpjcR94nuUz9acc/9NjDNd3zENAuSeZeZbekwy2SoUQ310gKiruMyB+3CqX0+f7XX3ZRXm5uYV5ql1RecjOLy/LLcrNLS/ND5WFSspyw8X5dnFFfm5+Xll5WSn1WWJXhCpKyoorinbalSiVe7/FuzNwtgespMplSc4DAv0+aOmtcpXfD/LnSETlzoOt3P0+ZPEWpirCh8CJUmmzLZmdAPO4qKTSHgbPt3ym0pTjUiptPgLKXSTzLZkBxq3SZjP47Ki0hw2IH7dK4/R5gWWeSltg8e4MnO0RK6nSWJLziEC/j1p6qzTl96P8ORJRafNhK3e/j1m8hamK8DErsSrtBktmJ8A8LiqptIXgRZbPVJpyXEqlLUJAuYtkkSUzwLhV2g0MPjsqbaEB8eNWaZw+P26Zp9Iet3h3Bs72hJVUaSzJeUKg38WW3ipN+b2YP0ciKm0RbOXu90mLtzBVET5pJVal3WLJ7ASYxkXE9W5PgZdYPlNpynH3ejcVgGzPd3KrF/cAiXe921MWX/EtsWQGLrd64fT56Qh96b7e7WmLd5J0tqVWUr2wJGepQL/PWHqrF+X3M/w5ElEvS2Ard7+nGLLejXMsPWvxjaFTBNa7KftyrMSpvzmWzBiweO2sdI5uGXi55TP1pxyXOke3HAHlnmSWW3pPMtgqFUK85+iWGRA/bpXL6fMKy7xzdCss3p2Bsz1nJVUuS3KeE+j3eUtvlav8fp4/RyIqdzls5e73BYu3MFURvmAl9hzdrZbMToB5XFRSaS+CV1o+U2nKcSmVthIB5S6SlZbMAONWabcy+OyotBcNiB+3SuP0+SXLPJX2ksW7M3C2l62kSmNJzssC/b5i6a3SlN+v8OdIRKWthK3c/b5q8RamKsJXrcSqtNssmZ0A87iopNJeA6+yfKbSlONSKm0VAspdJKssmQHGrdJuY/DZUWmvGRA/bpXG6fPrlnkq7XWLd2fgbG9YSZXGkpw3BPp909JbpSm/3+TPkYhKWwVbuft9y+ItTFWEb1l7KgeunKn70M0UiMPbwvkPxbftuFPp2wJ+n5ap97ifJeR3/0wzhANjfuz+mue6gVCuz8zUu7bnCvldYsgYZ8yPXaJ5rusL5bpc89q+Q8jvsCFjnDE/dljzMb4cubZ4+xWxdaVBtq5KoK0cjyiRqPeBmo/9G4X8HmTIPMeYH3uQ5rm+SSjXgxOUa42OHe3BzCuv1U3ynRODSl+rRzPNA88HLwJXIaxGHjOt3TfYvxGf3wS+GbwEvBy8ErwKfDu4NuEdV7/OScm2+NzL6peTd2Ns/16M7dfE2H5tjO3fj7H9BzG2/zDG9utibL8+xvYfxdj+4xjbb4ix/Scxtv80xvYbY2z/mat94G/aq88+j7LdF1G22xRluy+jbPdVlO2+jrLdN1G2+zbKdpujbLclynbfRdnu+yjb/RBlux+jbPdTlO1+jqJdY8IvUbb7Ncp2v0XZ7vco222Nst22KNv9EWW7P6Nstz3Kdn9F2U41iqZdSpTtAlG2C0bZLjXKdmkp0c+Xqn16jO0zYmyfGWP7rBjbV4mxfdUY21eLsX31GNvXiLF9zRjb14qxfe0Y29eJsX3dGNvvFWP7eq72/dD+HXx+x9/8Py+/C34PvAa8Fvw++APwh+B14PXgj8AfgzeAPwF/Ct4I/gz8OfgL8Cbwl+CvwF+DvwF/C94M3gL+Dvw9+Afwj+CfwD9HGZ9fwL+CfwP/Dt4K3gb+A/wn2MFfYJWwHfM5OAAOglPBaeB0cAY4E5wFrgKuCq4Grg6uAa4JrgWuDa4DrgveC1wvJbr4cHF7wt4Rxv8sfL4avLdjN2Ef5+QANu5j8IaMfdVP4TueTz7Bs7Kdfn+C5wr83YBe7EtoSGhEaExoQmhKyCbkEJoRmhNaEFoSWhFaE9oQ2hLaEdoTOhD2I+xPOICgvlCtBs0l5BHyCR0JBYRCQhGhmHAg4SDCwYRDCJ0Ih6qxT+hC6EroRuhO6EHoSTiMcDjhCEIvwpGEowhHE44hHEvoTehDOI5wPOEEwomEvoR+hJMIJxNOIZxKOI3Qn3A64QzCmYQSQimhjFBOCBMqCAMIAwmDCGcRziaop1CeQxhCGEo4lzCMMJwwgjCSMIowmjCGMJZwHmEcYTzhfMIFhAmEiYRJhAsJkwkXES4mXEKYQriUcBnhcsJUwhWEaYTphCsJVxGuJlxDmEG4ljCTMItwHeF6wmzCDYQbCTcRbibcQphDuJVwG+F2wh2EOwlzCXcR7ibcQ7iXcB9hHuF+wgOEBwkPER4mzCcsIDxCeJTwGGEhYRHhccIThMWEJwlPEZYQniYsJTxDeJawjLCcsILwHOF5wguEFwkrCS8RXia8QniV8BphFeF1whuENwlvEd4mrCa8Q3iX8B5hDWEt4X3CBynJp9K6/dbvqbRlee54W55ceGNuWfJPpa2LvspKBg/uPXzQ6JKRYeeZtCku8xyTnSn3/+XzaOu7EsHUb8KeR6v2f1w2RzA33r4j3p/vQwRhXYrPripRjq93OasCkO35Tu6rLdwDJN77830Yf1+7DhDWCQ1c7h+hOX1eH6Ev3e/Pt54xT257P0pJXm3BkhwVSO5+P2Yc9FJ+fyyw145kK8dE93EKf79DDLk/H+dY2sA3Gdmc8XN26Mq+HCtx1xQ31Fv9OVula4o/QRA+9Zv6U45LXVOsgvmpwCTzaYrekwy2SoUQ7zXFn6ToHz9ulcvp80ZXX6ZcU7xRSOV+llS5PMn5TEDlfq65ylV+f26Iyv0UtnL3+wVzYaoiVH0GrMSptEYGqrRNCMKXflNpmwRVmgrmlwJF8qUhKq0Ro0rblKJ//LhVGqfPXxmo0r4SUmlfJ1UaT3K+FlBp32iu0pTf3xii0r6Erdz9fiug0r5NsEprbKBK24wgbPGbStssqNJUMLcIFMkWQ1RaY0aVtjlF//hxqzROn78zUKV9J6TSvk+qNJ7kfC+g0n7QXKUpv38wRKVtga3c/f4ooNJ+TLBKy9FbpUVc7/YTgvCz31Sacty93k0FINvzndzqJSf+iWjXerefGCe1nw1RL5w+/xKhL93Xu/0ipF5+TaoXnuT8KqBeftNcvSi/fzNEvfwMW7n7PdeQ9W6cY+l3vsnIPldgvZuyL8dKnPprprf6c7ZK5+i2Igjb/Kb+tgqeo1PB3CYwyWwz5BxdM8ZzdFtT9I8ft8rl9PkPA8/R/SGkcv9Mqlye5PwpoHK3a65yld/bDVG522Ard79/CZyj+yvB5+iaG6jSnMCkBHym0tQ/UipNBXMHPP3GWySqTyYbRVVac0aVZgX0jx+3SuP0ORAwT6UFArw7g13jPJBUaSzJCQb4+01lHPRSfqcG2HMkotJSYCt3v2nMhanCqfpMpEprYaBKS8eLDL+ptHRBlaaCmSFQJBmGqLQWjCotPaB//LhVGqfPmQaqtEwhlZaVVGk8yckSUGlVNFdpyu8qhqi0DNjK3W9VAZVWNcEq7QMDVVo1vKjuN5VWTVClqWBWFyiS6oaotA8YVVq1gP7x41ZpnD7XMFCl1RBSaTWTKo0nOTUFVFotzVWa8ruWISqtOmzl7re2gEqrHdhTOXDlzLljMHcc6gRk8x+Kb9vxdIQ6AvkfrvuT5FNk/B5hyFNYGfNjj9A910JjfLTmT59dJzTGxxgyxhnzY4/RPNf1hcb4OM1ru5XQGB9vyBhnzI89XvMxrrRqncDuWOps67YUc2xNMSiuGQm0Ne7FSZbM3DRB8zptIjQnTzRkTmbMjz1R81w3Fcr15ATlWqPjXHsy87V86rFLzklMdSyw4wmm4C/BW8BVCHWRx0xr9yObmuDzpuBs8M/gbWC1D9nxhE9wS7xfm7CXq1/n8VBv4/PV4HfA74LfA68BVyPUc/WzAP3she9rhXatwW3AbcHtwO3BHcD7gfcHHwAOgW1wLjgPnA/uCC4AF4KLwMXgA8EHgQ8GHwLuBD4U3BncBdwV3A3cHdwD3BN8GPhw8BHgXuAjwUeBjwYfAz4W3BvcB3wc+HjwCeATwX3B/cAngU8GnwI+FXwauD/4dPAZ4DPBJeBScBm4HBwGV4AHgAeCB4HPAp8NHgw+BzwEPBR8LngYeDh4BHgkeBR4NHgMeCz4PPA48Hjw+eALwBPAE8GTwBeCJ4MvAl8MvgQ8BXwp+DLw5eCp4CvA08DTwVeCrwJfDb4GPAN8LXgmeBb4OvD14NngG8A3gm8C3wy+BTwHfCv4NvDt4DvAd4Lngu8C3w2+B3wv+D7wPPD94AfAD4IfAj8Mng9eAH4E/Cj4MfBC8CLw4+AnwIvBT4KfAi8BPw1eCn4G/Cx4GXg5eAX4OfDz4BfAL4JXgl8Cvwx+Bfwq+DXwKvDr4DfAb4LfAtfDfLsWr98HtyPs7ZqfnR/KGuDzuvh/e4N3PPkYO+MUtO0MDsW32eo8/j4CmqS+5ufy1ZOe1dOkuf1uwOh3on4YbmLxailn2zf5wzBPcvYV+GG4oeY/DCu/GwqdvHA27gMczpg24ptIEvb4eM6JRNLOxobY2cjin5gV18DfjWmMNSE0JWQTcgjNCM0JLQgtCa0IrQltCG0J7QLJR23r/ajtUFi3R203QF/hIcNGhUeFe48qHTyozHnYdreSwYPdgzPNFRy1/b974Laa2Zu6jGfqN2EP3G4SkJk9meIR8Qak7fGiQ8BnC7KV4+tdzqoAZHu+k3uhcpP4ZdCuG5C2Z5RUHYQGLvdvIpw+7xehL91vQLofY57c9u6fPB7lSc7+AsejB2h+PKr8PkDoeJT7JFQH2Mrd78WG3ICUcyyFGI/DLxa4AamyL8dK3OV4TfVWf85W6XI8Gy9y/ab+lONSl+OpYOYKTDK5Ab0nGWyVCiHey/HsgP7x41a5nD7nufoy5XK8PCGVm59UuTzJyRdQuR01V7nK746GqNxc2MrdbwFzYapwqj4DVuJUWraBKq0QL4r8ptIKBVWaCmaRQJEUGaLSshlVWmFA//hxqzROn4sNVGnFQirtwKRK40nOgQIq7SDNVZry+yBDVFoRbOXu92ABlXZwglVajoEq7RC86OQ3lXaIoEpTwewkUCSdDFFpOYwq7ZCA/vHjVmmcPh9qoEo7VEildU6qNKbkCKi0LpqrNOV3F0NUWifYyt1vVwGV1jXBKq2l3iot4nq3bnjR3W8qTTnuXu+mApDt+U5u9dIy/olo13q3boyTWndD1Aunzz0i9KX7erceQuqlZ1K98CSnp4B6OUxz9aL8PswQ9dIdtnL3O8WQ9W6cY+lwvsnIniKw3k3Zl2MlTv210lv9OVulc3RH4EUvv6m/IwTP0alg9hKYZHoZco6uFeM5uiMC+sePW+Vy+nykgefojhRSuUclVS5Pco4SULlHa65yld9HG6Jye8FW7n6PEThHd0yCz9G1NlClHYsXvf2m0o4VVGkqmL0FiqS3ISqtNaNKOzagf/y4VRqnz30MVGl9hFTacUmVxpOc4wRU2vGaqzTl9/GGqLTesJW73xMEVNoJCVZpbQxUaSfiRV+/qbQTBVWaCmZfgSLpa4hKa8Oo0k4M6B8/bpXG6XM/A1VaPyGVdlJSpfEk5yQBlXay5ipN+X2yISqtL2zl7vcUAZV2SkDuUY7qPnSNBOJwakA2/6H4th13Kj1VwO/LNH8EmLrjp4TflxvyuBnG/NiX655roTE+TfPH7HQQGuPTDRnjjPmxp2ue60ZCY/xqzWu7ndAYv8aQMc6YH/sazcd4L+Ta4u1XxNbeBtnaN4G2cjweUaLeZ2o+9psJzXOzDJnnGPNjz9I8182Fcj3bkMcjch6bzGZeee1+PKLS1+qxVLngInAnsHo84mnIo/vxiM3weXNwC3B3cC9wb3BfcFuwejxif1e/zknJthbaeVj9cnJ6jO3PiLH9mTG2L4mxfWmM7ctibF8eY/twjO0rYmw/IMb2A2NsPyjG9mfF2P7sGNsPjrH9Oa72gb9prz4bEmW7oVG2OzfKdsOibDc8ynYjomw3Msp2o6JsNzrKdmOibDc2ynbnRdluXJTtxkfZ7vwo210QRTt13mlClO0mRtluUpTtLoyy3eQo210UZbuLo2x3SZTtpkTZ7tIo210WZbvLo2w3Ncp2V0TZblqU7abHMF+q9lfG2P6qGNtfHWP7a2JsPyPG9tfG2H5mjO1nxdj+uhjbXx9j+9kxtr8hxvY3xtj+phjb3xxj+1tc7fuhfX/o43aByP/Py6ej3RngM8El4FJwGbgcHAZXgAeAB4IHgc8Cnw0eDD4HPAQ8FHwueBh4OHgEeCR4FHg0eAx4LPg88DjwePD54AuijM8EtJsIngS+EDwZfBH4YvAl4CngS8GXgS8HTwVfAZ4Gng6+EnwV+GrwNeAZ4GvBM8GzwNeBrwfPBt8AvhF8E/hm8C1RxoeL2xPmRBj/jWHHaeA5YPUY5FsDe65W5D4PMZP6aOjqn6lfzhWLtvcNdzxuw4vbAz5bsagcX+pyVgWgs8c4ru9UA2SmxX+y6sYE3XIgRjtDHjvt2wJ8PrvzFIpvs6XiF2AeP5zxu+Mf+ioqDJdWFObnlYTyK0qpn4KKcF5JbrFdUZRH3efl26Ul4VB5fmlhQX5BUUVhwp45fgdfziutYLwzkFzByJKcOwP8/c5lHPRSfs8NsOdI5BfB22Erd783a3rPG6+dnGPpLsYdEGf8HCGj7OtiJe46nXh2yBWVt7II5oqo3rvx4p5/UL1dI8TMq3q7Wv+ueiP1k3DV6/5yrj5VEO8WmFTuDvAXxT2uPp2N+zqd2//7JLOHYr6bccK6R6hAA4J5j7evewN6145aunCvQO3ovpReHQU3EPD7Pka/1Q5BKX/nyED1rU5DOZCIi9QZgnmajwc1XucJjIf7Gf1OxXjwbpxxlYjt/QH9bXxAwMYdG/fO6VTGndODBuycbhUoyjmarylUg/FBAb9v1fM07R52PsQ4LhlzbXPGT3gy33V6z4+T+UMBQybzpox9PcxYNKqgg9aeG3eimlgyieK2s7EhdjZitNN96mgF/p5PY2wB4RHCo4THCAsJiwiPE54gLCY8SXiKsITwNGEp4RnCs4RlhOWEFYTnCM8TXiC8SFhJeInwMuEVwquE1wirCK8T3iC8SXiL8DZhNeEdwruE9whrCGsJ7xM+IHxIWEdYT/iI8DFhA+ETwqeEjYTPCJ8TviBsInxJ+IrwNeEbwreEzYQthO8I3xN+IPxI+InwM+EXwq+E3wi/E7YSthH+IPxJ2E74K7CzqFIIAUKQkEpII6QTMgiZhCxCFUJVQjVCdUINQk1CLUJtQh1CXcJehHqEvQn7EOoTGhD2JTQkNCI0JjQhNCVkE3IIzQjNCS0ILQmtCK0JbQhtCe0I7QkdCPsR9iccQFA/tKnJIZeQR8gndCQUEAoJRYRiwoGEgwgHEw4hdCIcSuhM6ELoSuhG6E7oQehJOIxwOOEIQi/CkYSjCEcTjiEcS+hN6EM4jnA84QTCiYS+hH6EkwgnE04hnEo4jdCfcDrhDMKZhBJCKaGMUE5QD8yoIAwgDCQMIpxFOJswmHAOYQhhKOFcwjDCcBV31ESWtedcqd5L9dS4es85xevsR9wCoDNT3Qr8VhjKctkcjOB3agS/01xc1fW55YlBDcQhg9Xmsjx3vC1PLrwxt1zfn27tzguPLSFbLRSqi77KSgYP7j180OiSkeGeo4aUjRw0dIh7qnVMXgEORgiZ9313+J3rVtJc72W5XHPec/rKdL3nTq0TkhT2fRR988MuT5j63bEGwB0gZ+O2f4GUuOSxM+KDtUYgsyODPltcpRxf73JWBSDb851B5u92D5B4H6yl7I+zr10HCCODMgM3wBw/Tp9HRehL9wdrjWLMk9ve0cHkIiOW5KhAcvc7hnHQS/k9JsieI5FFRiNhK3e/d2i6yMjZHDs5x9JYvsnIvkNgkZGyL8dK3CKjR/RWf85W6WbA52GAjfOb+lOOS90MWAVznMAkMy6o9ySDrVIhxHsz4POC+sePW+Vy+jze1ZcpNwMeL6Ryz0+qXJ7knC+gci/QXOUqvy8wROWOg63c/U5gLkxVhKpP/PyREJX2qIEqbSLG3SS/qbSJgipNBXOSQJFMMkSlPcqo0iYG9Y8ft0rj9PlCA1XahUIqbXJSpfEkZ7KASrtIc5Wm/L7IEJU2CbZy93uxgEq7OMEq7TEDVdolGHdT/KbSLhFUaSqYUwSKZIohKu0xRpV2SVD/+HGrNE6fLzVQpV0qpNIuS6o0nuRcJqDSLtdcpSm/LzdEpU2Brdz9ThVQaVMTrNKe0FulRVzvdgXG3TS/qbQrPOvdpiVgvdsT8auXXevdrmCc1KYZol44fZ5u4Hq36ULq5cqkeuFJzpUC6uUqzdWL8vsqQ9TLNNjK3e9cQ9a7cY6lqxnXu80VWO92dYLXuy028BzdNRhgM/ym/q4RPEengjlDYJKZYcg5usWM5+iuCeofP26Vy+nztQaeo7tWSOXOTKpcnuTMFFC5szRXucrvWYao3Bmwlbvf6wTO0V2X4HN0Txqo0q7HuJvtN5V2vaBKU8GcLVAksw1RaU8yqrTrg/rHj1ulcfp8g4Eq7QYhlXZjUqXxJOdGAZV2k+YqTfl9kyEqbTZs5e73ZgGVdnOCVdpTBqq0WzDu5vhNpd0iqNJUMOcIFMkcQ1TaU4wq7Zag/vHjVmmcPt9qoEq7VUil3ZZUaTzJuU1Apd2uuUpTft9uiEqbA1u5+71DQKXdkWCVNlxoJ8A8LiqptDsx7ub6TaXdKajSVDDnSiyrMESlDWeYcB2VdmdQ//hxqzROn+8yUKXdJaTS7k6qNJ7k3C2g0u7RXKUpv+8xRKXNha3c/d4roNLuDe6pHLhy5twxmDsO9wVl8x+Kb9vxdIT7BPJ/d6be4149ZUDC73sMeco2Y37sezTPdWOhMT5P80c8qXuUSvh9vyFjnDE/9v2a57qR0Bh/SPPaflpoHn/YkDHOmB/7Yc3H+FzMZxZvvyK2zjDI1tkG2TongbbGO4eoWpeYmx7RvE4XCs3JjxoyJzPmx35U81wvEsr1ogTlWqPjXHsR87V86rFLzklMdSyw3dp5O3HFk8BTwFUI85DHTGv3I5tULavPF4EfB0/D/5sBng2eA16CdrUJ97v6dR4PdRbanQ0eDD4HPAQ8FFyN8ICrnwXo5358/jS+byn4GfCz4GXg5eAV4OfAz4NfAL8IXgl+Cfwy+BXwq+DXwKvAr4PfAL8Jfgv8Nng1+B3wu+D3wGvAa8Hvgz8AfwheB14P/gj8MXgD+BPwp+CN4M/An4O/AG8Cfwn+Cvw1+Bvwt+DN4C3g78Dfg38A/wj+Cfwz+Bfwr+DfwL+Dt4K3gf8A/wneDv4LbGF8pIAD4CA4FZwGTgdngDPBWU6dgKs64xJcHVwDXBNcC1wbXAdcF7wXuB54b/A+4PrgBuB9wQ3BjcCNwU3ATcHZ4BxwM3BzcAtwS3ArcGtwG3BbcDtwe3AH8H7g/cEHgENgG5wLzgPngzuCC8CF4CJwMfhA8EHgg8GHgDuBDwV3BncBdwV3A3cH9wD3BB8GPhx8BLgX+EjwUeCjwceAjwX3BvcBHwc+HnwC+ERwX3A/8Engk8GngE8FnwbuDz4dfAb4THAJuBRcBi4Hh8EV4AHggeBB4AfA54KHOeOC8KBrfg5aO7f5qMN5aPegUweEh4J7rrjg1iczVQ25fjVj6pdz1YXtfcMdj4cRyPlBn626UI4vdTmrAtDZYxzXdzqDhFvEPpGgm1vEaGfIY6f9cJDxh5UgX16eMOSAjzN+C/6hr6LCcGlFYX5eSSi/opT6KagI55XkFtsVRXnUfV6+XVoSDpXnlxYW5BcUVRTueFxpIlZhLAjyHrg42yPB5CoMluQ8EuTv91HGQS/l96NB9hzJ/BoNW7n7fVLTuyvtcWaPcSw9xrgDelLg7krKvi5W4tYax7NDrqi8lUUwV0T1LsQAW/QPqrdrhJh5VW9X699Vb6R+Eq563V/O1acK4kKBSWVhkL8oFrn6dLZ4JxnPVqkQ4lXMCxknrEVCBRoQzHu8fT0e1Lt21E8ajwvUju7LAXccCQcEjoQZ/VY7BPdPG6rvttZuiMVF4AzBYs3HgxqviyWEKaPfqdbun6vcG2dcJWL7ZFB/G58SsHHHxr1zuo9x57TEgJ3TQwJFuUTztQZqMC4R8PtpPU/T7mkn47hkzLXNGT/hyXzX6T0/TuZPc9po6l63rQE2Lk0maucVWbrb+Eyi5FEovi3XHcx4d0PPJrW7/awB0/0yQwZnHufgXJ4cnPZyAwbnCkMGp72Y8cDyOUYBrwZnumXe4DRBfz3Prb9MTJQJ+usFP+qvF5l3cSYOzhcN2MWt9KP+eik5OO2XDBicL5uiv+YxDs5XND+x39Ta+Wsm9wnuZzU/sa9uvLNUwO9lhpzYf5VxXDLm2l5mwLh5RmDcvKb5r/LK72UCfq8ywO8VAn6/rrnfar8gsQrjOQPq+zkBv583ZL/wBuN+gTHX9vOajxtVL88LjJuVmvt9X0DmJoYvGVIvbzLWC2Ou7ZcMqJcXBOrlLQP2qysF/H7bAL9fFvB7tQF+vyLg96ua1/c8of3Ca4bsF95h3C8w5trmjF+irvVtxtdXpWt9301e68uTnHcFrvV9T/NrfZXf7wXZcyR65zDOmK5hnOCC1u6ic286TySSduYYYme2xT8xK66Bv9fSoHif8AHhQ8I6wnrCR4SPCRsInxA+JWwkfEb4nFAP/z8rwrhS76V64qHec675dWrO/StgZyYfBXYooSyXzcEIfqdG8DvNxVVdn1ueGNRAHDJ4bQ674215cuGNueX6/nRrd16YbLHVarsG6Cs8ZNio8Khw71GlgweV9Rw1pGzkoKFDupUMHuwenGmu4KgtGCFw3vfdSXCW96W53styOei85/SV6XrPnWAnMCncVa1m9uYu45n6DSXq7gPvS/3OzGPnrrsQuGPxBTK7Keize24px9e7nFUByPZ8J/dV+e/HL4Nynavyv2CUVJuEBm6AOX6cPn8Zoa/SUFl5R7u0oLzQDpd0LCorK86z7dySgpKC0tyiinBpR7uoYxH1WVaSW0Rfl1tSZodDJQXhRB2Pfsl8Nwpn+yp5PMqTnK8Ejke/1vx4VPn9tdDxKPdJvE2wlbvfNzS995SzOXZyjqVvGI/D3xC495SyL8dK3L2nPtBb/TlbpefcfosBttlv6k85LvWcWxXMzQKTzOag3pMMtkqFEO9zbr8N6h8/bpXL6fMWV1+mPOd2i5DK/S6pcnmS852Ayv1ec5Wr/P7eEJW7GbZy9/sDc2GqIlR9BqzEqbQPDVRpP2Lc/eQ3lfajoEpTwfxJoEh+MkSlfcio0n4M6h8/bpXG6fPPBqq0n4VU2i9JlcaTnF8EVNqvmqs05fevhqi0n2Ard7+/Cai03xKs0tYZqNJ+x7jb6jeV9rugSlPB3CpQJFsNUWnrGFXa70H948et0jh93magStsmpNL+SKo0nuT8IaDS/tRcpSm//zREpW2Frdz9bhdQadsTrNI2GLje7S/X8lRfqbS/POvdlKfZnu/kVi8bGNe7/cU5qaWaoV44fU5J3bMv3de7paTyTpK78pSaVC8syVGB5O43mKq3elF+B1PZcySiXizYyt3vW4asd+McS6l8k5H9lsB6N2VfjpU49feJgefo0lC36X5Tf8pxqXN0KpjpApNMeqrekwy2SoUQ7zm6tFT948etcjl9zkg17xxdhpDKzUyqXJ7kZAqo3CzNVa7yO8sQlZsOW7n7rcJcmKoIVZ+JPEf3qYEqrSrGXTW/qbSqgipNBbOaQJFUM0Slfcqo0qqm6h8/bpXG6XN1A1VadSGVViOp0niSU0NApdXUXKUpv2saotKqwVbufmsJqLRaCVZpGw1UabUx7ur4TaXVFlRpKph1BIqkjiEqbSOjSqudqn/8uFUap891DVRpdYVU2l5JlcaTnL0EVFo9zVWa8rueISqtDmzl7ndvAZW2d+qeyoErZ82pjzUC6/72SZXNfyi+bcedSvcRyP/qTL3Hvbrjp4Tf72SaIRwY82O/o3muc4TG+BrNb42/SWiMrzVkjDPmx16rea6zhcb4h5rX9udCY3ydIWOcMT/2Os3HuPrdd58E6epQfNuOn99MsbVOAm2Nty5V/UjU+8eaj/31QvPcBkPmOcb82Bs0z/VHQrnemKBca3TsaG9kXnmtbpLvTJVKX2+3dt78UfFP4K3gKoT6yGOmtfsG++vx+Ufgj8GqY8Xp4GrgOuDP0K42oYGrX+ekZFtr5+deVr+c7Btj+4Yxtm8UY/vGMbZvEmP7pjG2z46xfU6M7ZvF2L55jO1bxNi+ZYztW8XYvnWM7dvE2L6tq33gb9qrz9pF2a59lO06RNluvyjb7R9luwOibBeKsp0dZbvcKNvlRdkuP8p2HaNsVxBlu8Io2xVF2a44inaNCQdG2e6gKNsdHGW7Q6Js1ynKdodG2a5zlO26RNmua5TtukXZrnuU7XpE2a5nlO0Oi7Ld4VG2OyKG+VK17xVj+yNjbH9UjO2PjrH9MTG2PzbG9r1jbN8nxvbHxdj++BjbnxBj+xNjbN83xvb9Ymx/UoztT3a174f2DaCTPw9G/n9e3hftG4IbgRuDm4CbgrPBOeBm4ObgFuCW4Fbg1uA24LbgduD24A7g/cD7gw8Ah8A2OBecB84HdwQXgAvBReDi1OjicyDaHQQ+GHwIuBP4UHBncBdwV3A3cHdwD3BP8GHgw8FHgHuBjwQfBT4afAz4WHBvcB/wceDjwSeATwT3BfcDnwQ+Ocr4cHF7wikRxv9ajOP6sOcUcB3Cqal7rlbkPufSkDpUj1fm6q8R9fWO0H2AvNt/7Nv2vuGO72mpO7l/qs9WQCrHl7qcVQHo7DGO6zudQcf+Q5HmJ/2c4uD2+4tMmUILxmdnyGOnfVoqn8/9GfvapPmtL7DZjOPbZhwztlT8uHd2nOPv9H/oq6gwXFpRmJ9XEsqvKKV+CirCeSW5xXZFUR51n5dvl5aEQ+X5pYUF+QVFFYUJe/a92+ZQnJvb3jNSkytpWZJzRip/v2cyDnopv89MZc+RyC/T/WErd7/faLoD8trJOZZK+CYjmzN+jgBW9nWxEne9WP844lFReSuLYK7I0VIp6rbsH46WukaImfdoqav170dLkfpJ+NGS+8u5+lRBLBWYVEpT+YuizNWns3Gr3DiU/R5HHKWME1aZUIFyL63g9Lk8Ve/aUUtoygVqR/dLOtQZlPsEzqBsNuAMypsCZ1C26HkGZQ87w4z1yJhre4sB4+YtgXFTofk8ofx+W8DvAQb4vVrA74GMfivBrJYPOse+qrbVeFKxHeg6IFYb9zwyiHEe0fSspMi4UrpgkIDeOItxXKViXHk3zrhKxPasVP1tPFvAxh0b90HAPowHAYMNOAg4VaAof9B8MlKDcbCA3z8aIobPYRyXjLm2OeMnPJnv+hnFj5P5OaZM5s0Z+xrCWDSqoIPWnht3oppZMonitjPHEDuzGe10n6Jfgb+H0hg7lzCMMJwwgjCSMIowmjCGMJZwHmEcYTzhfMIFhAmEiYRJhAsJkwkXES4mXEKYQriUcBnhcsJUwhWEaYTphCsJVxGuJlxDmEG4ljCTMItwHeF6wmzCDYQbCTcRbibcQphDuJVwG+F2wh2EOwlzCXcR7ibcQ7iXcB9hHuF+wgOEBwkPER4mzCcsIDxCeJTwGGEhYRHhccIThMWEJwlPEZYQniYsJTxDeJawjLCcsILwHOF5wguEFwkrCS8RXia8QniV8BphFeF1whuENwlvEd4mrCa8Q3iX8B5hDWEt4X3CB4QPCesI6wkfET4mbCB8QviUsJHwGeFzwheETYQvCV8RviZ8Q/iWsJmwhfAd4XvCD4QfCT8Rfib8QviV8Bvhd8JWwjbCH4Q/CdsJfxHU70kphAAhSEglpBHSCRmETEIWoQqhKqEaoTqhBqEmoRahNqEOoS5hL0I9wt6EfQj1CQ0I+xIaEhoRGhOaEJoSsgk5hGaE5oQWhJaEVoTWhDaEtoR2hPaEDoT9CPsTDiCow3tbfSdqIivCXKneS/XUeJa1+6c0Zz+S7vo/nZnqVmBNRijLZXMwgt+pEfxOc3FV1+eWJwY1EIcMVpvL8tzxtjy58Mbccn1/urU7Lzy2hGy1MLgu+iorGTy49/BBo0tGhnuOGlI2ctDQIe6p1jHZmXKDEULmfd8dfuc61TTXe1ku15z3nL4yXe+5U+uEJIV7H6Vu1DUkdbfxTP2GEvVzvtr/cdkcwdx4+474IM1cjIa8NJ8tflaOr3c5qwKQ7flO7p+53QMk3gdpKvvj7GvXAUJemszADTDHj9Pn/Ah96f4gzfw0fhGvto5pycWcLMlRgeTut4Bx0Ev5XZDGniORxZx5sJW73180v5rAsZNzLBXyTUb2LwKLOZV9OVbiFnMO01v9OVulm/8XoW6L/ab+lONSN/9XwSwWmGSK0/SeZLBVKoR4b/5flKZ//LhVLqfPB7r6MuXm/wcKqdyDkiqXJzkHCajcgzVXucrvgw1RucWwlbvfQ5gLUxWh6jNgJU6lDTdQpXXCuDvUbyqtk6BKU8E8VKBIDjVEpQ1nVGmd0vSPH7dK4/S5s4EqrbOQSuuSVGk8yekioNK6aq7SlN9dDVFph8JW7n67Cai0bglWaSMMVGndMe56+E2ldRdUaSqYPQSKpIchKm0Eo0rrzjh59zBEpXH63NNAldZTSKUdllRpPMk5TEClHa65SlN+H26ISusBW7n7PUJApR2RYJU2xsD1br0w7o70m0rr5VnvdmQC1ruNYVzv1otxUjvSEPXC6fNRBq53O0pIvRydVC88yTlaQL0co7l6UX4fY4h6ORK2cvf7myHr3TjH0rGM691+E1jvdmyC17uNNfAcXW/UbR+/qb/egufoVDD7CEwyfQw5RzeW8Rxd7zT948etcjl9Ps7Ac3THCanc45Mqlyc5xwuo3BM0V7nK7xMMUbl9YCt3vycKnKM7McHn6M4zUKX1xbjr5zeV1ldQpalg9hMokn6GqLTzGFVa3zT948et0jh9PslAlXaSkEo7OanSeJJzsoBKO0Vzlab8PsUQldYPtnL3e6qASjs1wSptnIEq7TSMu/5+U2mnCao0Fcz+AkXS3xCVNo5RpZ2Wpn/8uFUap8+nG6jSThdSaWckVRpPcs4QUGlnaq7SlN9nGqLS+sNW7n5LBFRaSYJVmi20E2AeF5VUWinGXZnfVFqpoEpTwSwTKJIyQ1SazTDhOiqtNE3/+HGrNE6fyw1UaeVCKi2cVGk8yQkLqLQKzVWa8rvCEJVWBlu5+x0goNIGpO2pHLhy5twxmDsOA9Nk8x+Kb9vxdISBAvnfmqn3uFdPGZDwe1umGcKBMT/2Ns1znSM0xrdr/ogndY9SCb//MmSMM+bH/kvzXGcLjfFAlt61fb7QPB7MMmOMM+bHDmbpPcbLMJ9ZvP2K2NrHIFv7GWRr/wTaGvfcacnMTema1+lIoTk5w5A5mTE/dobmuR4llOsqCcq1Rse5NqfPKh/qsUvOSUx1LLDd2nk7ccWHgnuA1WNCByGPmdbuRzapWlafjwKPBh+J/9cH3A/cHzwe7WoTznL16zweqi3atQO3B3cA7wfeH1yNcLarnwXo5yx8fj6+7wLwBPBE8CTwheDJ4IvAF4MvAU8BXwq+DHw5eCr4CvA08HTwleCrwFeDrwHPAF8LngmeBb4OfD14NvgG8I3gm8A3g28BzwHfCr4NfDv4DvCd4Lngu8B3g+8B3wu+DzwPfD/4AfCD4IfAD4PngxeAHwE/Cn4MvBC8CPw4+AnwYvCT4KfAS8BPg5eCnwE/C14GXg5eAX4O/Dz4BfCL4JXgl8Avg18Bvwp+DbwK/Dr4DfCb4LfAb4NXg98Bvwt+D7wGvBb8PvgD8IfgdeD14I/AH4M3gD8BfwreCP4M/Dn4C/Am8Jfgr8Bfg78BfwveDN4C/g78PfgH8I/gn8A/g38B/wr+Dfw7eCt4G/gP8J/g7eC/wBbmiRRwABwEp4LTwOngDHAmOMuZL8FVnfkJXB1cA1wTXAtcG1wHXBe8F7geeG/wPuD64AbgfcENwY3AjcFNwE3B2eAccDNwc3ALcEtwK3BrcBvw2eADwCFnHicMds3Pzg9lQxH/QWg32PGfcE7anisuuLVYQ+pwcZCvv0bU3xuu5yIy9cu5isP2vuGO7xAcOw312yoO5fhSl7NDXT/McItiZ9Bxi+Jqmh8MOMXB7Xd1oYOBYHx2hjx22kMYf5geythXjQTFLxTfZjOOb5txzNg1DDnxwDn+zv2HvooKw6UVhfl5JaH8ilLqp6AinFeSW2xXFOVR93n5dmlJOFSeX1pYkF9QVFEYStRqoHOFVgMNS64G4knOMIHVQMM1Xw2k/B5uyBnrobCVu986mu6AvHZyjqURfJORXYf5zKCaxJR9XazErXkfGkc8KipvZRHMFTlaGom6HfUPR0tdI8TMe7TU1fr3o6VI/ST8aMn95Vx9qiCOFJhURqbxF8UoV5/Oxq1y41D2exxxjGScsEYJFSj3Ty6cPo9O07t21E9rowVqR/dlqeoMyhMCZxL2MuAMyqsCftfT8wzKHnaOYaxHxlzb9QwYN68JjJuxms8Tyu9VAn6fZ4Dfrwv4PY7RbyWY1c/2zpkTVdtqPKnYjnMdEKuNex4ZzziPaHpWUmRcKV0wXkBvnM84rlIxrrwbZ1wlYnt+mv42XiBg446N+yBgIONBwAQDDgLOESjK+ppPRmowThDwu4EhYngi47hkzLXNGT/hyXzXzyh+nMwnctpo6l63rQE2TkomaucV2LrbeGGi5FEovi3XHcx4d0OTk9rdnmzAdH+RIYMzj3NwXpwcnPbFBgzOSwwZnPZ4xgPLKYwCXg3OKpZ5g9ME/XUpt/4yMVEm6K/L/Ki/LmfexZk4OC83YBc31Y/664rk4LSvMGBwTjNFfw1K5Ruc0zU/sd/c2vmrKPcJ7kaan9hXN9qbJOB3Y0NO7F/JOC4Zc2031nzcqHoZKzBusg2olwsF/M4xpF6uYqwXxlzbOQbUy3kC46aFAfVykYDfLQ2pl6sZ64Ux13ZLA+plnMC4aWNAvVwi4HdbQ+rlGsZ6Ycy13daAepFYLdjBgHqZIuD3fobUywzGemHMtb2fAfVyqcC4CWnudzhV5ub6tiH1ci1jvTDm2rYNqJfLBOolX3O/K4TqpaMh9TKTsV4Yc213NKBepgrUS5Hmfg8QqpdiQ+plFmO9MObaLjagXqYJ1MvBul/lJVQvhxhSL9cx1gtjru1DDKiX6QL10llzvwcJ1UsXQ+rlesZ6Ycy1zRm/RN2jrhVfX5XuUTc7eY86nuTMFrhH3Q2a36NO+X2D0D3qnM27UCjeOHDG9EbGCS5o7S4696bzRCJpZ0tD7Gxh8U/Mimvg75tojN1MuIUwh3Ar4TbC7YQ7CHcS5hLuItxNuIdwL6Ee/n9WhHGl3kv1xEO955SyU3Pprv/TmclHgR2KOre5y+ZgBL9TI/id5uKqrs8tTwxqIA4ZvDaH3fG2PLnwxtxyfX+6tTsvTLbY6s77DdBXeMiwUeFR4d6jSgcPKus5akjZyEFDh3QrGTzYPTjTXMFRWzBC4Lzvu5PgPCYmzfVelstB5z2nr0zXe+4EO4FJ4a5qNbO3dhnP1G8oUXfNvFlq3S6PnbvunumOxX0YDfPSfPaMAeX4epezKgDZnu/kvpvkzfHLoFznbpL3MUqqeUIDN8AcP06f74/QV2morLyjXVpQXmiHSzoWlZUV59l2bklBSUFpblFFuLSjXdSxiPosK8ktoq/LLSmzw6GSgnCijkfvZ76LqrM9kDwe5UnOAwLHow9qfjyq/H5Q6HiU+yTePNjK3W93zR/a4djJOZYeYjwO54yfs0NX9uVYibtn+i16qz9ny3XH4mHU7Xy/qT/l+J8eY7i+QwVzvsAkMz9N70kGW6VC+K8+h3Fz8ofT9I8ft8rl9HmBqy+7KC83tzBPtSsqD9n55WW5Rbm55aX5obJQSVluuDjfLq7Iz83PKysvK6U+S+yKUEVJWXFF0U67EqVyFwip3EeSKpcnOY8IqNxHNVe5yu9HDVG582Erd7+PMRemKkLVZ8BKnEqbY6BKW4hxt8hvKm2hoEpTwVwkUCSLDFFpcxhV2sI0/ePHrdI4fX7cQJX2uJBKeyKp0niS84SASlusuUpTfi82RKUtgq3c/T4poNKeTLBKu9VAlfYUxt0Sv6m0pwRVmgrmEoEiWWKISruVUaU9laZ//LhVGqfPTxuo0p4WUmlLkyqNJzlLBVTaM5qrNOX3M4aotCWwlbvfZwVU2rMJVml3GrjebRnG3XK/qbRlnvVuyxOw3u1OxvVuyxgnteWGqBdOn1cYuN5thZB6eS6pXniS85yAenlec/Wi/H7eEPWyHLZy99vTkPVunGPpBcb1bj0F1ru9kOD1bnMNPEf3Iup2pd/U34uC5+hUMFcKTDIrDTlHN5fxHN2LafrHj1vlcvr8koHn6F4SUrkvJ1UuT3JeFlC5r2iucpXfrxiiclfCVu5+XxU4R/dqgs/R3WWgSnsN426V31Taa4IqTQVzlUCRrDJEpd3FqNJeS9M/ftwqjdPn1w1Uaa8LqbQ3kiqNJzlvCKi0NzVXacrvNw1RaatgK3e/bwmotLcSrNLuNlClvY1xt9pvKu1tQZWmgrlaoEhWG6LS7mZUaW+n6R8/bpXG6fM7Bqq0d4RU2rtJlcaTnHcFVNp7mqs05fd7hqi01bCVu981AiptTdqeyoErZ+o+dDcKxGFtmmz+Q/FtO+5UulbA78Oz9B736o6fEn4fkWWGcGDMj32E5rluKTTGj9L81vjzhMb40YaMccb82EdrnusWQmO8t+a1fa/QGO9jyBhnzI/dR/MxvhK5tnj7FbF1lUG2rk6grfHWpaofiXo/QfOxf5vQPHeiIfMcY37sEzXP9e1CuT4pQbnW6NjRPol55bW6Sb5zYlDp6+3Wzps/Kl4EXgKuQngfecy0dt9g/zZ8fjv4DvBy8ErwKvBq8D3g2oQPXP06JyXbWjs/97L65eTDGNuvi7H9+hjbfxRj+49jbL8hxvafxNj+0xjbb4yx/Wcxtv88xvZfxNh+U4ztv4yx/Vcxtv/a1T7wN+3VZ99E2e7bKNttjrLdlijbfRdlu++jbPdDlO1+jLLdT1G2+znKdr9E2e7XKNv9FmW736NstzXKdtuiaNeY8EeU7f6Mst32KNv9FWU79UtWNO1SomwXiLJdMMp2qVG2S4uyXXqU7TKibJcZZbusKNtVibJd1fTo50vVvlqM7avH2L5GjO1rxti+Vozta8fYvk6M7evG2H6vGNvXi7H93jG23yfG9vVjbN8gxvb7xti+oat9P7T/APr43rTI/8/LH6LdOvB68Efgj8EbwJ+APwVvBH8G/hz8BXgT+EvwV+Cvwd+AvwVvBm8Bfwf+HvwD+EfwT+Cfwb+AfwX/Bv4dvBW8Lcr4/IF2f4K3g/8Cq32H4hRwABwEp4LTwOngDHAmOAtcBVwVXA1cHVwDXBNcC1wbXAdcF7wXuB54b/A+4PrgBuB9wQ3To4sPF7cnNIow/m9CnN8HN3L8JDRO33O1Ivc5l/foC9Tjlbn6W0P9XS90ntG7/ce+be8b7vg2wVPzmqb7bAWkcnypy1kVgM4e47i+0xl03Ce/TsnS+6SfUxzcfp+aJVNocT7HPOSx026SzudzU8a+TktQ/ELxbTbj+LYZx4wtFT/unR3n+Mv+h76KCsOlFYX5eSWh/IpS6qegIpxXkltsVxTlUfd5+XZpSThUnl9aWJBfUFRRmLBn37ttDsW5ue3NSU+upGVJTk46f7/NGAe9lN/N0tlzJPLLdFPYyt3vmZrugLx2co6l5nyTkc0ZP0cAK/u6WIm7XqxpHPGoqLyVRTBX5GipBeq25T8cLXWNEDPv0VJX69+PliL1k/CjJfeXc/WpgthCYFJpkc5fFC1dfTobt8qNQ9nvccTRgnHCailUoNxLKzh9bpWud+2oJTStBGpH90s61BmUsMAZlFIDzqBcK3AGpUzPMyh72NmasR4Zc22XaT5uVL1UCNRLhQH1MlOgXgYYUi9tGOuFMdf2AAPqZYBAvZxlQL3MEqiXsw2pl7aM9cKYa/tsA+ploEC9DDGgXq4TqJehhtRLO8Z6Ycy1zRk/dWJHnVRxzvArDar2q2quaJduWZLxbc8YX01/PROpS3X82l7guLgD4zmlVIwr78YZV4nYcsZAysb9BGzcsXGfrHKfaIm3r/0NOFnVWKAoh2s+GanBuL+A3yMMEQkHMI5LxlzbnPETnsx3/dzvx8n8AFMm89aMfYUYi0YVdNDac+NOVCtLJlHcdrY0xM4WjHa6f0pegb9tGmO5hDxCPqEjoYBQSCgiFBMOJBxEOJhwCKET4VA1NtXyAEJXQjdCd0IPQk/CYYTDCUcQehGOJBxFOJpwDOFYQm9CH8JxhOMJJxBOJPQl9COcRDiZcArhVMJphP6E0wlnEM4klBBKCWWEckKYUEEYQBhIGEQ4i3A2YTDhHMIQwlDCuYRhhOGEEYSRhFGE0YQxhLGE8wjjCOMJ5xMuIEwgTCRMIlxImEy4iHAx4RLCFMKlhMsIlxOmEq4gTCNMJ1xJuIpwNeEawgzCtYSZhFmE6wjXE2YTbiDcSLiJcDPhFsIcwq2E2wi3E+4g3EmYS7iLcDfhHsK9hPsI8wj3Ex4gPEh4iPAwYT5hAeERwqOExwgLCYsIjxOeICwmPEl4irCE8DRhKeEZwrOEZYTlhBWE5wjPE14gvEhYSXiJ8DLhFcKrhNcIqwivE94gvEl4i/A2YTXhHcK7hPcIawhrCe8TPiB8SFhHWE/4iPAxYQPhE8KnhI2EzwifE74gbCJ8SfiK8DXhG8K3hM2ELYTvCN8TfiD8SKiHmsiKMFeq91I9Na7ec5Z8OPuRdNf/6cxUt+n880ooy2VzMILfqRH8TnNxVdfnlicGNRCHDFaby/Lc8bY8ufDG3HJ9f7q1Oy88toRsdQFLXfRVVjJ4cO/hg0aXjAz3HDWkbOSgoUPcU61jsjPlBiOEzPu+O/zO/RTSXO9luVxz3nP6ynS9506tE5IU7n2UuqFkyDXwmfoNJWrZmdr/cdkcwdx4+474wOefEO+f0312kY5yfL3LWRWAbM93ci/Hcg+QeB/4/FP8fe06QPhZaOAGmOPH6fMvEfrS/YHPvzDmyW3vr+nJiw5YkqMCyd3vb4yDXsrv3wT22pFs5Zjofkvn73e05le9OXZyjqXf+SYjmzN+zg5d2ZdjJe6igzy91Z+zVXpIzVbU7Ta/qT/luNRDalQwtwlMMtvS9Z5ksFUqhHgfUrM1Xf/4catcTp//cPVlykNq/hBSuX8mVS5Pcv4UULnbNVe5yu/thqjcbbCVu9+/mAtzh3JIT+yjBPMNVGnOCeiUDJ+pNOW4lEpTwdwBT7/xFonqk8lGUZWWz6jSrAz948et0jh9DmSYp9ICGbw7g13jPCOp0liSE8zg7zeVcdBL+Z2awZ4jEZWWAlu5+01jLkxVhKrPRKq0jgaqtHSMuwy/qbR0QZWmgpkhUCQZhqi0jowqLT1D//hxqzROnzMNVGmZQiotK6nSeJKTJaDSqmiu0pTfVQxRaRmwlbvfqgIqrWqCVVqxgevdqmHcVfebSlOOu9e7qQBke76TW70UM653q8Y4qVU3RL1w+lwjQl+6r3erIaReaibVC09yagqol1qaqxfldy1D1Et12Mrd71hD1rtxjqXafJORPVZgvZuyL8dKnPo70MBzdHVQt3X9pv7qCJ6jU8GsKzDJ1DXkHN2BjOfo6mToHz9ulcvp814GnqPbS0jl1kuqXJ7k1BNQuXtrrnKV33sbonLrwlbufvcROEe3T4LP0R1koEqrj3HXwG8qrb6gSlPBbCBQJA0MUWkHMaq0+hn6x49bpXH6vK+BKm1fIZXWMKnSeJLTUEClNdJcpSm/Gxmi0hrAVu5+GwuotMYJVmkHG6jSmmDcNfWbSmsiqNJUMJsKFElTQ1TawYwqrUmG/vHjVmmcPmcbqNKyhVRaTlKl8SQnR0ClNdNcpSm/mxmi0prCVu5+mwuotOYJVmk/GqjSWmDctfSbSmshqNJUMFsKFElLQ1Taj4wqrUWG/vHjVmmcPrcyUKW1ElJprZMqjSc5rQVUWhvNVZryu40hKq0lbOXut62ASmubsady4MqZc8dg7ji0y5DNfyi+bcfTEdoJ5H9clt7jXj1lQMLv8VlmCAfG/NjjNc91S6ExPkHzRzz9LDTGJxoyxhnzY0/UPNcthMb4ZM1ru5PQGL/IkDHOmB/7Is3HuNKq7RKkq0PxbTuWsptiawODbG2aQFvjvhmXJTM3TdG8TguE5uRLDZmTGfNjX6p5rguFcj01QbnW6DjXnsp8LZ967JJzElMdC2y3dt5OXLG6Z5jiDHAVQnvkMdPa/cimArQvBBeBq+P/1QU3ADcFH4J2tQkdXP06N779Gp9/A/4WvBm8BfwduBphP1c/C9BPB3xfJ7Q7FNwZ3AXcFdwN3B3cA9wTfBj4cPAR4F7gI8FHgY8GHwM+Ftwb3Ad8HPh48AngE8F9wf3AJ4FPBp8CPhV8Grg/+HTwGeAzwSXgUnAZuBwcBleAB4AHggeBzwKfDR4MPgc8BDwUfC54GHg4eAR4JHgUeDR4DHgs+DzwOPB48PngC8ATwBPBk8AXgieDLwJfDL4EPAV8Kfgy8OXgqeArwNPA08FXgq8CXw2+BjwDfC14JngW+Drw9eDZ4BvAN4JvAt8MvgU8B3wr+Dbw7eA7wHeC54LvAt8Nvgd8L/g+8Dzw/eAHwA+CHwI/DJ4PXgB+BPwo+DHwQvAi8OPgJ8CLwU+CnwIvAT8NXgp+BvwseBl4OXgF+Dnw8+AXwC+CV4JfAr8MfgX8Kvg18Crw6+A3wG+C3wK/DV4Nfgf8Lvg98BrwWvD74A/AH4LXgdeDPwJ/DN4A/gT8KXgj+DPw5+AvwJvAX4K/Au+H+fZ7vP4B3I6wv2t+dn4os/F5e/y//cF1CAdk7LnigluLvUdfMD6Nr7811N8M1yMfmfrlXMVhe99wxzeEYyfbb6s4lONLXc7arh9muEWxM+i4RfE0zQ8GnOLg9nt6gm4SEqOdIY+ddojxh2mbsa8rNb/JCjabcXzbjGPGvtKQEw+c4y/3H/oqKgyXVhTm55WE8itKqZ+CinBeSW6xXVGUR93n5dulJeFQeX5pYUF+QVFFYShRq4FyhVYD5SVXA/EkJ09gNVC+5quBlN/5hpyxtmErd78zNN0Bee3kHEsd+SYje4bAXb6UfV2sxK15t+OIR0XlrSyCuSJHSwWo28J/OFrqGiFm3qOlrta/Hy1F6ifhR0vuL+fqUwWxQGBSKRBYYljo6tPZuFVuHMp+jyOOAsYJq1CoQLl/cuH0uShD79pRP60VCdSO7stS1RmUMQJnEmYacAblSgG/Z+l5BmUPO4sZ65Ex1/YszceNqpexAuNmtgH1cpWA3zcYUi8HMtYLY67tGwyol/MExs3NBtTL1QJ+32JIvRzEWC+MubZvMaBexgmMm9sMqJdrBPy+3ZB6OZixXhhzbXPGT53YqWXtPsOvNKjar6q54uAMy5KM7yGM8dX01zORulTHr4cIHBd3YjwuTsW48m6ccZWIbacM/W08VMDGHRv3yap2jCerOhtwsuoAgaKcq/lktGMwCvh9lyEioQvjuGTMtc0ZP+HJfNfP/X6czLtw2mjqXretATZ2TSZq551CdLexW6LkUSi+LdcdzHh3Q92T2t3ubsB038OQwZnHOTh7Jgen3dOAwXkY9y6uhoGJMkGLHJ5MlBla5Ag/apFezNO9iYOzlwHT/ZF+1CJHJQenfZQBg/Nobhu5DWxt7fy1jPvE572an/BVNwrtKuD3fYac8D2G8YQvY67t+zQfN6peDhQYNw8YUC/dBPx+0JB6OZaxXhhzbT9oQL0cJDBu5htQLz0E/F5gSL30ZqwXxlzbCwyol4MFxs1jBtTLYQJ+LzSkXvow1gtjru2FBtTL4QLj5gnd/aZ6kXjYwWJD6uU4xnphzLW92IB6OUKgXpZo7ncboXp52pB6OZ6xXhhzbT9tQL0cKVAvz2rud1uhellmSL2cwFgvjLm2lxlQL0cL1Mtzul/NIFQvzxtSLycy1gtjru3nNR83N6TJ/P6yUnO/1Y+hxwj4/ZIh9dKXsV4Yc22/ZEC9SPz+8qoB9XKsgN+vGVIv/RjrhTHX9msG1IvE7y9vGFAvvQX8ftOQejmJsV4Yc22/aUC9SPz+stqAeukj4Pc7htTLyYz1wphr+x0D6qW1wHHvGgPq5TiBellrSL2cwlgvjLm21xpQL20E6uVDA+rleIF6WWdIvZzKWC+MubbXGVAvbQXq5WMD6uUEgXrZYEi9nMZYL4y5tjcYUC/tBOplowH1cqJAvXxmSL30Z6wXxlzbUvHjzvPpzDdmcrYA8zhPYfT5DKEr57h9DjD6fKYhPgcZfS4xxOdURp9LDfE5jdHnMkN8Tmf0udwQnzMYfQ4b4nMmo88VhvjcntHnAYb43JbR54E+9HmQD30+y4c+n+1Dnwf70OdzfOjzEB/6PNSHPp/rQ5+H+dDn4T70eYQPfR7pQ59H+dDn0T70eYwPfR7rQ5/P86HP43zo83gf+ny+D32+wIc+T/ChzxN96PMkH/p8oQ99nuxDny/yoc8X+9DnS3zo8xQf+nypD32+zIc+X+5Dn6f60OcrfOjzNB/6PN2HPl/pQ5+v8qHPV/vQ52t86PMMH/p8rQ99nulDn2f50OfrfOjz9T70ebYPfb7Bhz7f6EOfb/Khzzf70OdbfOjzHB/6fKsPfb7Nhz7f7kOf7/Chz3f60Oe5PvT5Lh/6fLcPfb7Hhz7f60Of7/Ohz/N86PP9PvT5AR/6/KAPfX7Ihz4/7EOf5/vQ5wU+9PkRH/r8qA99fsyHPi/0oc+LfOjz4z70+Qkf+rzYhz4/6UOfn/Khz0t86PPTPvR5qQ99fsaHPj/rQ5+X+dDn5T70eYUPfX7Ohz4/70OfX/Chzy/60OeVPvT5JR/6/LIPfX7Fhz6/6kOfX/Ohz6t86PPrPvT5DR/6/KYPfX7Lhz6/7UOfV/vQ53d86PO7PvT5PR/6vMaHPq/1oc/v+9DnD3zo84c+9HmdD31e70OfP/Khzx/70OcNPvT5Ex/6/KkPfd7oQ58/86HPn/vQ5y986PMmH/r8pQ99/sqHPn/tQ5+/8aHP3/rQ580+9HmLD33+zoc+f+9Dn3/woc8/+tDnn3zo888+9PkXH/r8qw99/s2HPv/uQ5+3+tDnbYb43DeDz+c/DPG5H6PPfxri80mMPm83xOeTGX3+yxCfT2H02co0w+dTGX1OMcTn0xh9Dhjic39Gn4OG+MypSVJ96HOaIT6fzji2032Y5wwf+pzpQ5+zfOhzFR/6XNWHPlczxOcsRp+rG+JzFUafaxjic1VGn2sa4nM1Rp9rGeJzdUafaxvicw1Gn+sY4nNNRp/rGuJzLUaf9zLE59qMPtczxOc6jD7vbYjPdRl93scQn/di9Lm+IT7XY/S5gSE+783o876G+LwPo88NGX3eB/2kwOcgIZWQRkgn0KlL9VORpY4L1XGSOm5QOlrpSqWzlO5Q+2G1X1LztJq3VB2rca3yvA8+U1t9QgPCvoSGhEaExoQmhKaEbEIOoRmhOaEFoSWhFaE1oQ3hafR1Bhl2JqGEUEooI5QTwoQKwgDCQMIgwlmEswmDCecQhhCGEs4lDCMMJ4wgjCSMIowmjCGMJZxHGEcYTzifcAFhAmEiYRLhQsJkwkWEiwmXEKYQLiVcRricMJVwBWEaYTrhSsJVhKsJ1xBmEK4lzCTMIlxHuJ6gnmGvnumunnGunvmtnoGtngmtnpGsnhmsnqGrnimrnrGqnjmqnsGpnkmpntGonlmonuGnnmmnnvGmnnmmngGmnomlnhGlnpmkniGknqmjnjGjnrminkGinsmhnlGhntmgnmGg7umv7nGv7vmu7oGu7gmu7pGt7hmt7qGs7ims7rGr7jmr7sGq7kmq7tGp7lmp7uGo7mmo7vGn7nmn7gGn7omm7hGm7pml7iGl7qmk7jGk7rmj7kGj7smi7lGi7tmh7mGh7umg7nGgrvlX18Cra8LVNdLqmmF1Da26plRdY6muOVTX4Klr0tQ1WuqaJXUNj7qmRV3joa55UNcAqDXxao24WjOt1hCrNbVqjalac6nWIKo1eWqNmlqzpdYwqTU9ao2LWvOh1kCoNQHqN3L1m7EqDPWbovqNTf3mpH6DUb9JqHP06py1Ooerzmmqc3zqnJc6B6TOiahzBOqYWR1DqmMqdYyhNLfSoEqTKY2i9tlqH6bmdDXHqZpPcdVqLfxdhjcb4XXJyJHhc84dmT1yaHZJeXn2mEEjB2YPHR0eXjF46Jj/A3piMcuVZwYA",
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": "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",
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": "H4sIAAAAAAAA/+2dB3wUR5bGpzWSUGskcg5iACHABI8ExmRENGDjBI7YxgKEwQZEEAYnnHPOOeMccc42xjnjvd1br3fP3tu99Z731nu7t8HedPeqp575aNpj9VGFauD17/cx1a+66/3r9euenu4qsTmRSHiJ7JIktU9su3B9rf7MbN9SbbCtjE1OL084C/KEM5knnIV5wlmUJ5zFecLZIk84S/KE088TztI84UzlCWdZnnCW5wlnyzzhbJUnnK3zhLNNnnC2zRPOdgY5uwIn/2bqoD876s9O+rOz/uyiP3nfbvqzu+5roV7vQaog9SSldR0HphepN6kPqZLUl1RF6kfqTxpA2o00kDSINJg0hLS7bkP9+KohDSUNI+1BGk7akzSCNJI0ijSaNIY0ljSONF7HbgJpImkSaTJpCmkqaS/SNNJ00gzS3qR9SDNJ+5L2I+2v+5LWfTmAdCBpFmk26SDSwaRDSIeSDiMdTppDOoJ0JOko0lzS0aQ60jzSfNICUj1pIekY0iLSYtKxpONIS0hLSctIDaTloZivIK0krSI1hjhXk44nrSGtJZ1AOpF0Eulk0imkdaRTSaeRTiedQTqTdBbpbNI5pHNJ55HOJ11AupB0Eeli0iWkS0mXkS4nXUG6knRVYuvjfzXpGtK1pOtI15NuIN1Iuol0M+kW0q2k20i3k+4g3UlaT7qLdDfpHtK9pPtI95MeID1Ieoj0MOkR0qOkDaTHSI+TniA9SXqK9DTpGdKzpOdIz5NeIL1Ieon0MukV0kbSq6RNpNd0Xwp0X14nvRGyvUl6S5ff1p/v6M939ed7+vN9/fmB/vxQf36kPzeTvizPltW9aPjZhrLxOeuBjc/fArDxuZwEG5/XhWDjc7wIbHy+F4ONz/0WYOuuyyVg6wFl/qzQ5VKw9dTlFNjSulwGtl66XA623rrcEmx9dLkV2Cp1uTXY+upyG7BV6XJbsPXT5Xb6k2Ohllr9mdnORbVp+Dsjo9g5D9pDfzgPOoCN86Aj2DgPOoGN+94ZbJwHXcDGedAVbJwH3cDGedAdbJwHmD+cBxVg4zzoCTbOgzTYOA96gY3zoDfYOA/6gI3zoBJsnAd9wcbxrQIbx5fzR8VzKtTzgucqPs9kG9fjuZqENtnG9Xiucj2eq1yP5yrW8yfX47nK9Xiucj2el1yP5yAfQzzfeJ92YONjiPnJ7WAu8jHEvOO2Mcf4GGKOsT/MMT6GmGPMgDnG50gabMyFOcbnCOYYs3KOqb4WA1ut/sxs31KN12levNB6LZTZfzH03xDLUPwuaApLBbD0NByXFMSlJ/jpZdgPfoc1pc+9gKW3YRbVZh+zbQa3dJXAn9af7CcF9R2gb5WG++aBT26X1yuBpUeIE+8TejjAxza8flRG8PU1y1fjJbY+jrWw3hf42NYbWAznVI0fYlFLrnOmD7D0M8pSncH7w6aw9AOWKqMs2fO3v9k2g/vNAYbbVG3sBjHh+DF7CuoHQLx2MxwvD3xyu7yOfMIqrMIqrMIqrMIqrMK6a7Pi7xx8tsfbVTrAx7YqYDH92wCfcXHb6tniBvBp9hlFdQZ/J6v208DAvpKwzctlW7ie1LbSxLa/rfG9QWWofXP82ePHfrhdXk8DH/cFn/eYfvbkgR9ud+f1WzPf/HPC6oxKL3xG1DPUj7T+xGe/bFM5uQn668qzXXz2WQB8hp/3Vv9/n/fic7ok8KUt8PWMwZcGPt4P37WYfl6L16ym8PUGPt6vCPhMP9PE86IpfFHPOYvh0/TzsrjP7qqAj/drAXyGv1+r8Z1yU/jwXon3KwE+0/ciim9ADD68P+H9fOAbZIFvYAy+QcDH+5UC3xALfINj8A0BvsFQZr6MBb7dY/BlgIn3KwO+Ggt81TH4aoCP9ysHvmEW+IbG4BsGfLxfS+AbboFvjxh8w4GP92sFfCMs8O0Zg28E8PF+rYFvlAW+kTH4RgEf79cG+MZY4Bsdg28M8PF+bYFvnAW+sTH4xgEf74djrWot8I2PwVcLfLxfe+CbaIFvQgy+icDH++H372QLfJNi8E0GPt6vE/BNNcsXvEeeEoNvKrBMN8syTLHsFYNlOrBMM8sSvEeeYbbN4D3y3obbVG3sAzHh+DF7Cur3hnjtYzheHvjkdnkd+YR112ZVLFNCnD5sN8UBPrZNs8jih1jUkutaF8WHx3Jfs3zB98LMGHz7AssBRlmGBs/Y94vBcgCw7G+UJfu9cKDZNoNr+Czg576ynxTU4zGfZbhvHvjkdnkd+YRVWIVVWIVVWIVVWIVVWIVVWIVVWIVVWIVVWIVVWIVVWIVVWIVVWIVVWIVVWIXVPKtimRni9GG7mQ7wsW1/iyx+iEUtucaJRPHhsTzILF8wpmZ2DL6DgOVQoyw1wZiag2OwHAoshxhlyY6pOcxsm8GYmsOBn/vKflJQj8f8cMN988Ant8vryCeswiqswiqswiqswiqswiqswiqswiqswiqswiqswpovrIpldojTh+1mO8DHtkMssvghFrXkes4exYfH8gizfME7iTkx+I4AlrlmWYK//3BkDJa5wHKUWZbgncTRZtsM3knUAT/3lf2koB6PeZ3hvnngk9vldeQT1l2bVbHMCXH6sN0cB/jYdpRFFj/EopZc16UoPjyW883yBdfweTH45gPLQqMs2ffKC2KwLASWeqMs2Wv4MWbbDK7hi4Cf+8p+UlCPx3yR4b554JPb5fVF9vwG/V/8Pf1fHMGxeAf2H/mayrp3HrFKXCWuEleJq8RV4ipxlbhKXCWuEleJq8RV4ipxlbhKXCWuEtemsyqWeSFOH7ab5wAf2+otsvghFrXkenYfxYd5d5xZvuA9x7Ex+I4DlmVGWbJ/k3pJDJZlwLLUKEv2PUeD2TaD5/zLgZ/7yn5SUI/HfLnhvnngk9vldeTbGVkX5RGr5IAdVskBYZUcEFbJAWGVHBBWyQFhlRwQVskBYZUcEFbJAWGVHBBWyQFhlRwQVskBYZUcENbmzgHFcmyI04ftjnWAj21LLbL4IRa15BonEsWHebfSLF8wpmZFDL6VwLLaAsuqGCyrgaXRLEswpuZ4s21mVBtrgJ/7yn5SUI/HfI3hvnngk9vldeTLF1bFsiLE6cN2KxzgY1ujRRY/xKKWXOdPFB8eyxPM8gXn99oYfCcAy8kWWE6MwXIysJxkliW41pxits3gWrMO+Lmv7CcF9XjM1xnumwc+uV1eR758YVUsa0OcPmy31gE+tp1kkcUPsagl1/kTxYfH8jQLfKfG4DsN+E6N4DvDAt/pMfjOAD7erxT4zrLAd2YMvrOA70woM985FvjOjsF3DjDxfmXAd54FvnNj8J0HfLxfOfBdYIHv/Bh8FwAf79cS+C6ywHdhDL6LgI/3awV8l1jguzgG3yXAx/u1Br7LLPBdGoPvMuDj/fD6d4UFvstj8F0BfJdH8F1lge/KGHxXAd+VEXzXWOC7OgbfNcB3dQTfdRb4ro3Bdx3w8X74DOsGC3zXx+C7AVhuNMuSSQHLjeDnZgt9vinR9D6z/xTsh3y3WuC7JQbfrcB3SwTf7Rb4bovBdzvw8X6Y03da4LsjBt+dwMf74TXhLgt862Pw3QV86yP47rHAd3cMvnuA7+4Ivvss8N0bg+8+4Ls3gu8BC3z3x+B7APjuj+B7yALfgzH4HgK+ByP4HrHA93AMvkeA7+EIvg0W+B6NwbcB+B6N4HvcAt9jMfgeB77HIvietMD3RAy+J4HviQi+py3wPRWD72ngeyqC71kLfM/E4HsW+J6J4HveAt9zMfieB77nIvhetMD3Qgy+F4HvhQi+ly3wvRSD72XgeymCb6MFvldi8G0EPt4P7/82WeB7NQbfJuDj/TB+r5vlC965vBaD73VgecssS/B/DbwRg+UtYHnTLEvw/udts20G73/eAX7uK/tJQT0e83cM980Dn9wuryOfsO7arIrltRCnD9u95gAf2960yOKHWNSS67oUxYfH8j2zfME1/N0YfO8By4dGWYYFf4Pn/RgsHwLLB0ZZstfwj8y2GVzDNwM/95X9pKAej/lmw33zwCe3y+vI11TWRXnEKnGVuEpcJa4SV4mrxFXiKnGVuEpcJa4SV4mrxFXiKnGVuEpcJa4SV4mrxFXiKnGVuEpcJa4SV4mrxFXiKnGVuEpcJa4SV4mrxFXiKnFtOqtieTfE6cN27zrAx7YPLLL4IRa15BrnHMWHefcDs3zBmPCPY/D9AFh+ZJSlJhgT/i8xWH4ELD80ypIdE/6vZtvMqDZ+DPzcV/aTgno85j823DcPfHK7vI58TWVdlEesEleJq8RV4ipxlbhKXCWuEleJq8RV4ipxlbhKXCWuEleJq8R154yrYvk4xOnDdh87wMe2H1pk8UMsasn1nD2KD/PuJ2b5gncSn8Tg+wmw/Mwoy9DgncSnMVh+Biw/NcqSfSfxb2bbDN5JfAb83Ff2k4J6POafGe6bBz65XV5Hvp2RdVEesUoO2GGVHBBWyQFhlRwQVskBYZUcEFbJAWGVHBBWyQFhlRwQVskBYZUcEFbJAWGVHBBWyQFhbe4cUCyfhDh92O4TB/jY9lOLLH6IRS25xolE8WHe/dwsXzCm5vMYfD8Hll+aZQn+/75/j8HyS2D5hVmWYEzNf5htMxhT8yvg576ynxTU4zH/leG+eeCT2+V15BPWXZtVsXwe4vRhu88d4GPbLyyy+CEWteS6LkXx4bH8tVm+4Br+RQy+XwPLb8yyBNfw/4zB8htg+dIsS3AN/y+zbQbX8N8CP/eV/aSgHo/5bw33zQOf3C6vI5+w7tqsiuWLEKcP233hAB/bvrTI4odY1JLruhTFh8fyd2b5gmv4VzH4fgcsf7DA8t8xWP4ALL83yxJcw//HbJvBNfyPwM99ZT8pqMdj/kfDffPAJ7fL68iXL6yK5asQpw/bfeUAH9t+b5HFD7GoJdf5E8WHx/LPFvj+FIPvz8D3pwi+ry3w/SUG39fA95cIvr9a4PsmBt9fge+bCL6/W+D7Wwy+vwPf3yL4/mmB7x8x+P4JfP+I4OOdTfL9b6LpfFyZgv2Qr8ACn+c1na8A+Hg/5CsyyxfcPyRj8LF/xVJoOFaqzWKzbWZUmy0Mc6o2SiBIHL9iOHZc3wLiVWKYwwOf3C6vI19TWTskmpfVgt+askT2viYZ8vXtOxdg8nW5EOx87qnVUm0r0uu8/Y16myRs802L7Ge5jjEvBewXtq0109fqXOdtKRxvXro4xFLsucPSwaG4zHCIpZVDLGUOsfgOsRQ7xJJ0iKWrQyydHWLp5BBLR4dYWjvEUu4QS6lDLC0cYil0iGWKQywtHWJJOcRS4hBLkUMsXjOz+Iltn3/4UF8M2xWE9lVx/Kx8S32ZthdAO+XaloxouwzaTulyubftvhijMgsxQj+1sM6+SoGh3Gt+liKHWEocYkk5xNLSIZYpDrEUOsTSwiGWUodYyh1iae0QS0eHWDo5xNLZIZauDrEkHWIpdojFd4ilzCGWVg6xzHCIpYNDLPx7yAWWLg7FpWAHsfDvRG43FWIpbka/Lc36DcYCtgK//Lu5JV6/dLkVcLQ2zOGFODzwy758KPO2SbDdo38oqvv/9SVbWKcnzLIqDr4f4baVz/st+KwfMbxu3rCFC5vicy+z/QzGsbAvPC641EKZ/SuWaWZZgnEsU822GYxjmWyYU7UxCWLC8WP2FNRPhnhNMszhgU9ul9eRr6msHZqZ1dbxn2i2zW/HxnAsJ4Ziiv2pNdwf1cYE3VZhxHFSPscZ9qmO3XjdFo/hYQb2lYRtNurrVa4xPOPNMuZ8Rs2+vmsMT3OztHGIZYZDLK0cYilziMV3iKXYIZakQyxtHWLp6hBLZ4dYOjnE0tEhlkkOsbRziKW1QyzlDrGUOsTSwiGWQodY2jvEMsUhlpYOsaQcYilxiKXIIRavmVm+a5wV108CW0Fo3/A4qzHaXgD7jNblZETbY8A2VpdHR+yLMRoT6ktm+5YgRuinFtbZF46zGu0AS5FDLCUOsaQcYmnpEMsUh1jaO8RS6BBLC4dYSh1iKXeIpbVDLO0cYpnkEEtHh1g6OcTS2SGWrg6xtHWIJekQS7FDLL5DLGUOsbRyiGWGQyxtHGLp4hBLwQ5i4d/y3O7YEEtz+h1l1m8wfmIk+OVnG6Mg7ux/JHCMMMzhhTg88Mu+fCjztkmwna4vtOp30Tp/C6uNsXB8XuC4tLMs+MSxcN/n0/BYuGE7+1g41cZk4I8aC8b1OD7G9Pi5XGPBJtvzG/R/Zxy3J6xNZ1UsU0KcPmw3xQE+tk0DFsPXgmrlh+8Bp4KfCWb9BNdUzA215LqmTgCWiYb7bGs85njgD+dMCuptjzmsTWwdU15HvqayThbWnZLV/PjgocH9IfpVS65zfJzFGKg2x5ptMzjHx0T0hf2koB6Pb3P8ZhJWYRVWYRVWYRVWYRVWYRVWYRVWYRVWYRVWYRVWYRVWYRVWYRVWYRVWYRVWYRVWO6zK72ijfmsyfsivWnKNubA5hnxHjNPmvrKfFNTj8R1puG8e+OR2eR35hFVYhVVYhVVYhVVYhVVYhVVYhVVYhVVYhVVYhVVY84XVwt+8COYCo1+15HpmPcJiDFSbe5ptM3hmPRz4ua/sJwX1eHyHG+6bBz65XV5HPmHdtVmV3z2M+s2+l0K/asl1ju9hMQaqzWFm2wzO8aHAz31lPymox+M71HDfPPDJ7fL6UHt+g/7XfE//ayI4anZg/5GvqayT84hV4ipxlbhKXCWuEleJq8RV4ipxlbhKXCWuwSJxzRNWiavEVeIqcW3uuCq/1Ub9Zv8mJvpVS67n4NUWY6DazJhtM2hud+DnvrKfFNRjLu5uuG8e+OR2eR35dkbWoXnEKjlgh1VyQFglB4RVckBYJQeEVXJAWCUHhFVyQFglB4RVckBYJQeEVXJAWCUHhFVyQFglB4S1uXNA+R1i1m+NH/KrllxjLoZYjIFqc7DZNoOuDQJ+7iv7SUE95uIgw33zwCe3y+vIly+syu9As36DXES/asmViwMtxkC1uZvZNoPDOQD4ua/sJwX1eHwHGO6bBz65XV5Hvnxh9cFWADauT4Ktvy4Xgq2fLheBrQr6xLa+utwCbJW6XAK2vaHMn/vociewzdTlSWDbV5cngm0/Xa4F2/66PB5sB+jyWLAdqMtjwDZLl0eBbbYujwTbQbq8J9gO1uXhYDtEl4eB7VBdrgHbYbqcAdvhurw72Obo8mCwHaHLg8B2pC5PBttRulwKtrm6nALb0bpcBrY6XS4H2zxdbgm2+brcCmwLdLk12Ooj+Dg/dwMb5yfmM+dnf7BxfvYDG+dnFdg4P/uCjfOzEmycn5ivHLd9wMZxmwk2jtu+YOO47Qc2jtv+YOO4HQA2jtuBYGujy7PA1laXZ4OtnS4fBLb2unww2Dro8iFg66jLh4KNz9HDwNZZlw8HWxddngO2rrp8BNi66fKRYOuuy0eBrYcuzwVbhS4fDbaeulwHtrQuzwNbL12eD7beurwAbH10mfNV5U8xbFurPzPbt1SjL15yfb+z/2LoiyGWTApYeoGfnkb91GRU/9K6rQJd5pzrCX4rzPit5oLy2yMUP+ZgX0nY5h19Qpfr7XsYjUOWh/0WaRbm6QE8vM0HmkddB1eUb90Pg1w1eE7wkisnMVcMHTNGyeB53BSWCmAxm7fZ+1/TOaDa7G64TdVGN4hJWn8yewrqu0O8uhmOF55v3C6vI5+wCquwCquwCquwCquwCquwCquwCquwCquwCquwCmu+sCqW3iFOfJfV2wE+tuH7FtPPtvHdH7et3l3MhXcXaaM+s++W8H1EGhjYVxK2ub58C9d8XS6Fej5W+I4Rj5/Z9x3Z48d+uF1eZ1+l0Bc8fqbfd+B7Om535/VbM9/8OVCTUa/s8L1z+LzjY4rvXtmG7/nUMee8w/EK6ZCtuY4HnjNpsHG5D/CZjXG1jXdowZ/R6gbHgfvGfpJQfzJcQ9aVbzk24euFqr84op4XL7ReC2V8b11ltq/BNbMftF8LPtBvf7N+q9Gvp8U+2J6E8kU8mAa2UwvHl5lV3vWN2A7LPUP7pKC+r+U+VwFHLazjOLzTIacuhu9L09832F+MS0eIC9enIS6mzzcVl/D9HTN0B5bKECfeV+E1sK8Fvu+6r+oLfGyrAD7uB15PNgBr2ijr1vdA4fE1afBr6Htiq/E1OP6iF3CwLxzPcqvOa/URvu9Jw75doc0dMSYo/N2MY4LWA/OOGhPEPFFjgu6F68Sn33P/WhGyWeCvRn5utyLEj/cFFfZYYsdyQ+jYmv5thmMcecn1nd8NYmP6embjPkK10Q/4ua/4Hcv1HaBv/Qz3Ldd3LPJVRbDi/WxFaDvz9wM1GRvzA1QbPJZaXRfSuoxj/7l+I1w/NsG9Kfe5F7TzcUQ9L7nyuD/Ez/CclOAcHwzt14IP9Gt4jthW84H43pV9sD0J5c1w7zpkS/Hb+DKzyruBEdthuSq0TwrqB1ruM87FqoV19qXy5A3IqY/h3tX0eY79xbh0hbhwPf7ODv9ewLky+N3YHPN2UmDrBzH91NozsyxXL+BKJ7Z9ZobP8vCagM/ykoa5ihNb5nKYahPnkfCS69pVDJ9FhlnU/BOeR7KqsWFl3TH1B9bXLfAAqzCEWABoWMbpXDzVBadz8VQXnM7F++PULW6nBOrC4THW//bQpqeBkhpcgRZrgJLElnk4Kl7qmZpKOzWPRs2bUfNk1LwYNQ+mHbT5kv5UftT9hvoNpOaxqHkrap6Kymd1j6W++9X9oLpGqO//dCKb4+paoJ5bqd+V6v5LXS/UOam+V9T5qs5TdX1R10B1nVfXQDVnS90IqYuTmuel5kerOWDq/ydV88PUvDH1/xGrOWVqrtnoRHYe2ljSuER27lotaUIiO99NzYNTc6WmkKaS9iJNI00nzUhk5ympeUlqHpKad6TmGal5RWoekZo3pOYJqXlBah6Qmvej5vmoeT1qHo+atzMnkZ2Xc2QiO+9GzbM5OpGdRzMvkZ0no+bFqHkwC0nHkBaRFpOOJR1HWkJaSlpGaiAtJ60grSStIjWSVpOOJ60hrSWdQDqRdBLpZNIppHWkU0mnkU4nnUE6k3QW6WzSOaRzSeeRziddQLqQdBHpYtIlpEtJl5EuJ11BupJ0Felq0jWka0nXka4n3UC6kXQT6WbSLaRbSbeRbifdQbqTtJ50F+lu0j2ke0n3ke4nPUB6kPQQ6WHSI6RHE9nf94+RHic9QXqS9BTpadIzpGdJz5GeJ71AejGRzdeXSa+QNpJeJW0ivUZ6nfQG6U3SW6S3Se+Q3iW9R3qf9AHpQ9JHpM2JLdcuPIG/1mf7GL0+K3vdSa9a0tCYzqSX0b91S5Y0rKlfMCSNdavSS1evakyvaqxb2ZheuLJhabp6CLb7Somddt/Wc174O6eusbF+6fLGdGMD7bikcfHyJSek1yxuXJRuOL5+5UJygDvfUr4dO9+pd+6+7c51CxZ8936P6v34SjR92YL6temG1Y3phoXpeQ2rly1Y9X/QJbxOjWgCAA==",
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
- "eJzVndGOJLlxRf9lnhdGkQwGGfsrhh8EWwYECLJh6U3Yf3cKW107gpjIPjvVzLhPXjSKrcth12X7dMapv3/78//85x/+9qf/+ctfv/3892+Pfxv128///vdvf/3fP/zlH1/469/+8H9/+/bz46dvf/zLfx3/95efvv33n/78x28/14f/8h8//WNBowuMLuh0gdMFgy6YdEF8fsFP//K6MtyfLy0j7PXqFr9+9/n40u9evvS7gx+43/HdwU/n7/ju4Ef5d3x38HP/O747eJP8ju8O3lG/47uDt9/v+O5f+l6NL32vxpe+V+NL36vxpe/V+NL3anzpezW+9L0aX/pejS99r8aXvlfL40vfrOXxpe/W8vjSt2t5/ND7tT4e/fnS+qjj+2+/ymL9lcX89eJ4Zfmhd/ebs/xQF7w5yw81x5uz/FDPvDnLD7XSm7P8UIe9N0v5ocJ7c5Yfasc3Z/mhKn1zlkS9WxL1bknUuyVR75ZEvVsS9W5J1Ls1Ue/WRL1bE/VuTdS7NVHv1kS9WxP1bk3UuzVR79ZEvdsS9W5L1LstUe+2RL3bEvVuS9S7LVHvtkS92xL1bkvUu5aody1R71qi3rVEvWuJetcS9a4l6l1L1LuWqHctUe/2RL3bE/VuT9S7PVHv9kS92xP1bk/Uuz1R7/ZEvdsT9a4n6l1P1LueqHc9Ue96ot71RL3riXrXE/WuJ+pdT9S7I1HvjkS9Sx7z//IsiXqXDCd8eZZEvUtGKr48S6LeJYMgX54lUe/+2ETKm7PsfE9H/cgyS1tk2fmevsqy72e32uuMjv9cndG+n93LLD82ofHmLPt+Z7jOsu93huss+35nmI/58X2P/6y/ZfGPLPv65TrLvn6p9spSuz2+PyP04mfwfb9gvDn4vt9GUPBSHlE++r+U3hfRd14Ab46+8754a/RKpnKeK+iIdX2ASnquoEPWlYyWPFfQMetKxjSeK8APxq8ryMjDcwW4lJ8r8JmTh/yfK/CZkwfmnyvwmZOHz58r8JmTB7l/XUEet36uwGdOHl1+rsBnTh4Dfq7AZ04eqX2uwGdOHk99rsBnTh71fK7AZ04em3yuwGdOHkF8rsBnTh7ne67AZ04ejXuuwGdOHjN7rsBnTh7Zeq7AZ04ef3quwGdOHiV6rsBnTh7Lea7AZ04ecXmuwGdOHhd5rsBnTh69eK7AZ04eY3iuwGdOHgl4rsBnTv68/lyBz5z8qfq5Ap85+bPvcwU+c/In1OcKfObkz5HPFfjMyZ/2nivwmWMbVsU6rIp9WBULsSo2YlWsxKrYiVXJHyx+XUH+rPBcgc+cCKmeK/CZkz9JPFfgMyeCp+cKfObkTwjPFfjMCY5/rsBnTtD2cwU+c4KJnyvwmROK+lyBz5xQw+cKeuaNeHeeK+iZN8zhGuZwDXO4hjlcwxyuYQ7XMIdrmMM1zOEa5nANc7iGOVzDHK5hDtcwh2uYwzXM4RrmcA1zuIY5XMMcrmEO1zCHa5jDNczhGuZwDXO4hjlcwxyuYQ7XMIdrmMM1zOEa5nANc7iGOVzDHK5hDtcwh2uYwzXM4RrmcA1zuIY5XMMcrmEO1zCHa5jDNczhGuZwDXO4hjlcwxyuYQ7XMIdrmMM1zOEa5nANc7iGOVzDHK5hDtcwh2uYwzXM4RrmcA1zuIY5XMMcrmEO1zCHa5jDNczhGuZwDXO4hjlcwxyuYQ7XMIdrmMM1zOEa5nANc7iGOVzDHK5hDtcwh2uYwzXM4RrmcA1zuIY5XMMcrmEO1zCHa5jDNczhGuZwhjmcYQ5nmMMZ5nCGOZxhDmeYwxnmcIY5nGEOZ5jDGeZwhjmcYQ5nmMMZ5nCGOZxhDmeYwxnmcIY5nGEOZ5jDGeZwhjmcYQ5nmMMZ5nCGOZxhDmeYwxnmcIY5nGEOZ5jDGeZwhjmcYQ5nmMMZ5nCGOZxhDmeYwxnmcIY5nGEOZ5jDGeZwhjmcYQ5nmMMZ5nCGOZxhDmeYwxnmcIY5nGEOZ5jDGeZwhjmcYQ5nmMMZ5nCGOZxhDmeYwxnmcIY5nGEOZ5jDGeZwhjmcYQ5nmMMZ5nCGOZxhDmeYwxnmcIY5nGEOZ5jDGeZwhjmcYQ5nmMMZ5nCGOZxhDmeYwxnmcIY5nGEOZ5jDGeZwhjmcYQ5nmMMZ5nAdc7iOOVzHHK5jDtcxh+uYw3XM4TrmcB1zuI45XMccrmMO1zGH65jDdczhOuZwHXO4jjlcxxyuYw7XMYfrmMN1zOE65nAdc7iOOVzHHK5jDtcxh+uYw3XM4TrmcB1zuI45XMccrmMO1zGH65jDdczhOuZwHXO4jjlcxxyuYw7XMYfrmMN1zOE65nAdc7iOOVzHHK5jDtcxh+uYw3XM4TrmcB1zuI45XMccrmMO1zGH65jDdczhOuZwHXO4jjlcxxyuYw7XMYfrmMN1zOE65nAdc7iOOVzHHK5jDtcxh+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/9nJP98h8//bogqQuyusDUBa4uKOqCen7BT7/7XGq17h9NLfzxaU/71dtbr97fevV459W78Nv5A1cXfpV/4OrC7/0PXF34kvzA1YVv1A9cXfj6/cDV3/pd7W/9rva3flf7W7+r8dbvarz1uxpv/a7GW7+r8dbvarz1uxovfVfz7Vb2j+Zbbt9ffRTF7RHFv6KkW9mzvPTNvjjLS3Xg4iwvVY1rs6TbS0Xm6jAv1aSrw7xUwq4O81LFuzrMSwXy6jAv1dOrwyxUftNtofqbbgsV4HRbqQKnlSpwWqkCp5UqcFqpAqeVKnBaqQKnlSpwWqkCp5UqcFqpAueVKnBeqQLnlSpwXqkC55UqcF6pAueVKnBeqQLnlSpwXqkC20oV2FaqwLZSBbaVKrCtVIFtpQpsK1VgW6kC20oV2FaqwL5SBfaVKrCvVIF9pQrsK1VgX6kC+0oV2FeqwL5SBfaVKnBZqQKXlSpwWakCl5UqcFmpApeVKnBZqQKXlSpwWakCl5UqcF2pAteVKnBdqQLXlSpwXakC15UqcF2pAteVKnBdqQLXlSqwMjzx/jArVWBl6OP9YVaqwK8Ne4hh4n7d1FMahZn51X4W5rVxDClM9scxbf84OqbXpjeuDjPvF/hEmHm3ECfCzLuFOBFm3i1E3/5TZP9w3+69Hx+OuGeZV2aeZ5lXZbK3fv9wsf6bQ9I+vUefd7txdfTX5nHeGD3dot2vndLNYhR+Zi+4PPzM3nF5eHU2NilDPPsKoTjtK4QSsq8Qvrn/tyIrsyX7CnUWOitTGvsKdRo634QGva9QzzwrkwP7CvXMs/IM/r5CPnPlafZ9hXzmynPh+wr5zJUnrPcV8pkrzyrvK+QzV5763VfIZ648P7uvkM9ceRJ1XyGfufJM575CPnPl6ch9hXzmynOG+wr5zJUn9vYV8pkrz77tK+QzV54i21fIZ648j7WvkM9cebJpXyGfufKM0L5CPnPlaZt9hXzmynMr+wr5zJUnQPYV8pkrz1LsK+QzV55K2FfIZ678fX9fIZ+58pfyfYV85srfnPcV8pkrf73dV8hnrvwddF8hn7nyF8V9hXzmyt/m9hXymSt/5dpXyGeu/L1oXyGfuaytyrK3Ksviqiybq7Ksrsqyuyor8qp9hXzmyh8S9hXymSsyqH2FfOYK9t9XyGeuAPR9hXzmCoreV8hnrmDdfYV85grE3FfIZ67gun2FfOaKpGdfIZ+5zOGyzOGyzOGyzOFM5nAmcziTOZzJHM5kDmcyhzOZw5nM4UzmcCZzOJM5nMkczmQOZzKHM5nDmczhTOZwJnM4kzmcyRzOZA5nMoczmcOZzOFM5nAmcziTOZzJHM5kDmcyhzOZw5nM4UzmcCZzOJM5nMkczmQOZzKHM5nDmczhTOZwJnM4kzmcyRzOZA5nMoczmcOZzOFM5nAmcziTOZzJHM5kDmcyhzOZw5nM4UzmcCZzOJM5nMkczmQOZzKHM5nDmczhTOZwJnM4kzmcyRzOZA5nMoczmcOZzOFM5nAmcziTOZzJHM5kDmcyhzOZw5nM4UzmcCZzOJM5nMkczmQOZzKHM5nDmczhTOZwJnM4kzmcyRzOZA5nMoczmcOZzOFM5nAmcziTOZzJHM5lDucyh3OZw7nM4VzmcC5zOJc5nMsczmUO5zKHc5nDuczhXOZwLnM4lzmcyxzOZQ7nModzmcO5zOFc5nAucziXOZzLHM5lDucyh3OZw7nM4VzmcC5zOJc5nMsczmUO5zKHc5nDuczhXOZwLnM4lzmcyxzOZQ7nModzmcO5zOFc5nAucziXOZzLHM5lDucyh3OZw7nM4VzmcC5zOJc5nMsczmUO5zKHc5nDuczhXOZwLnM4lzmcyxzOZQ7nModzmcO5zOFc5nAucziXOZzLHM5lDucyh3OZw7nM4VzmcC5zOJc5nMsczmUO5zKHc5nDuczhXOZwLnM4lzmcyxzOZQ7nModzmcO5zOFc5nAucziXOZzLHM5lDucyh3OZw7nM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM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",
838
+ "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"
827
839
  ],
828
840
  "fileMap": {
829
- "15": {
830
- "source": "impl Field {\n pub fn to_le_bits(self: Self, bit_size: u32) -> [u1] {\n crate::assert_constant(bit_size);\n self.__to_le_bits(bit_size)\n }\n \n pub fn to_be_bits(self: Self, bit_size: u32) -> [u1] {\n crate::assert_constant(bit_size);\n self.__to_be_bits(bit_size)\n }\n\n #[builtin(to_le_bits)]\n fn __to_le_bits(_self: Self, _bit_size: u32) -> [u1] {}\n \n #[builtin(to_be_bits)]\n fn __to_be_bits(_self: Self, _bit_size: u32) -> [u1] {}\n\n pub fn to_le_bytes(self: Self, byte_size: u32) -> [u8] {\n self.to_le_radix(256, byte_size)\n }\n\n pub fn to_be_bytes(self: Self, byte_size: u32) -> [u8] {\n self.to_be_radix(256, byte_size)\n }\n\n\n pub fn to_le_radix(self: Self, radix: u32, result_len: u32) -> [u8] {\n crate::assert_constant(radix);\n crate::assert_constant(result_len);\n self.__to_le_radix(radix, result_len)\n }\n\n pub fn to_be_radix(self: Self, radix: u32, result_len: u32) -> [u8] {\n crate::assert_constant(radix);\n crate::assert_constant(result_len);\n self.__to_be_radix(radix, result_len)\n }\n\n\n\n // decompose `_self` into a `_result_len` vector over the `_radix` basis\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(_self: Self, _radix: u32, _result_len: u32) -> [u8] {}\n \n #[builtin(to_be_radix)]\n fn __to_be_radix(_self: Self, _radix: u32, _result_len: u32) -> [u8] {}\n\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b = exponent.to_le_bits(32);\n\n for i in 1..33 {\n r *= r;\n r = (b[32-i] as Field) * (r * self) + (1 - b[32-i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x ∈ {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n}\n\n#[builtin(modulus_num_bits)]\npub fn modulus_num_bits() -> Field {}\n\n#[builtin(modulus_be_bits)]\npub fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub fn modulus_le_bytes() -> [u8] {}\n// Convert a 32 byte array to a field element\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n",
841
+ "16": {
842
+ "source": "mod bn254;\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n pub fn to_le_bits(self: Self, bit_size: u32) -> [u1] {\n crate::assert_constant(bit_size);\n self.__to_le_bits(bit_size)\n }\n \n pub fn to_be_bits(self: Self, bit_size: u32) -> [u1] {\n crate::assert_constant(bit_size);\n self.__to_be_bits(bit_size)\n }\n\n #[builtin(to_le_bits)]\n fn __to_le_bits(_self: Self, _bit_size: u32) -> [u1] {}\n \n #[builtin(to_be_bits)]\n fn __to_be_bits(_self: Self, _bit_size: u32) -> [u1] {}\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(_self: Self, _bit_size: u32) {}\n\n pub fn assert_max_bit_size(self: Self, bit_size: u32) {\n crate::assert_constant(bit_size);\n assert(bit_size < modulus_num_bits() as u32);\n self.__assert_max_bit_size(bit_size);\n }\n\n pub fn to_le_bytes(self: Self, byte_size: u32) -> [u8] {\n self.to_le_radix(256, byte_size)\n }\n\n pub fn to_be_bytes(self: Self, byte_size: u32) -> [u8] {\n self.to_be_radix(256, byte_size)\n }\n\n\n pub fn to_le_radix(self: Self, radix: u32, result_len: u32) -> [u8] {\n crate::assert_constant(radix);\n crate::assert_constant(result_len);\n self.__to_le_radix(radix, result_len)\n }\n\n pub fn to_be_radix(self: Self, radix: u32, result_len: u32) -> [u8] {\n crate::assert_constant(radix);\n crate::assert_constant(result_len);\n self.__to_be_radix(radix, result_len)\n }\n\n\n\n // decompose `_self` into a `_result_len` vector over the `_radix` basis\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(_self: Self, _radix: u32, _result_len: u32) -> [u8] {}\n \n #[builtin(to_be_radix)]\n fn __to_be_radix(_self: Self, _radix: u32, _result_len: u32) -> [u8] {}\n\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b = exponent.to_le_bits(32);\n\n for i in 1..33 {\n r *= r;\n r = (b[32-i] as Field) * (r * self) + (1 - b[32-i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x ∈ {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n}\n\n#[builtin(modulus_num_bits)]\npub fn modulus_num_bits() -> Field {}\n\n#[builtin(modulus_be_bits)]\npub fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub fn modulus_le_bytes() -> [u8] {}\n// Convert a 32 byte array to a field element\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n let num_bytes = (modulus_num_bits() as u32 + 7) / 8;\n let x_bytes = x.to_le_bytes(num_bytes);\n let y_bytes = y.to_le_bytes(num_bytes);\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..num_bytes {\n if (!done) {\n let x_byte = x_bytes[num_bytes - 1 - i] as u8;\n let y_byte = y_bytes[num_bytes - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n}\n\n",
831
843
  "path": "std/field.nr"
832
844
  },
833
- "27": {
845
+ "28": {
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
+ "41": {
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
+ "43": {
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
+ "44": {
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
+ "51": {
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
+ "53": {
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
- "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",
869
+ "65": {
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 lhs.lt(rhs)\n}\n\npub fn full_field_greater_than(lhs: Field, rhs: Field) -> bool {\n rhs.lt(lhs)\n}\n\nstruct Reader<N> {\n data: [Field; N],\n offset: Field,\n}\n\nimpl<N> Reader<N> {\n pub fn new(data: [Field; N]) -> Self {\n Self { data, offset: 0 }\n }\n\n pub fn read(&mut self) -> Field {\n let result = self.data[self.offset];\n self.offset += 1;\n result\n }\n\n pub fn read_array<K>(&mut self, mut result: [Field; K]) -> [Field; K] {\n for i in 0..K {\n result[i] = self.data[self.offset + i];\n }\n self.offset += K;\n result\n }\n\n pub fn read_struct<T, K>(&mut self, deserialise: fn([Field; K]) -> T) -> T {\n let result = deserialise(self.read_array([0; K]));\n result\n }\n\n pub fn read_struct_array<T, K, C>(&mut self, deserialise: fn([Field; K]) -> T, mut result: [T; C]) -> [T; C] {\n for i in 0..C {\n result[i] = self.read_struct(deserialise);\n }\n result\n }\n\n pub fn finish(self) {\n assert(self.offset == self.data.len(), \"Reader did not read all data\");\n } \n}\n",
871
+ "path": "/usr/src/yarn-project/aztec-nr/aztec/src/utils.nr"
872
+ },
873
+ "67": {
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
+ "81": {
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
+ "86": {
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
+ "93": {
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
+ "99": {
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
+ "105": {
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
+ "121": {
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
+ "126": {
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
+ "127": {
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
+ "128": {
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
+ "136": {
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
+ "141": {
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
+ "144": {
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
+ "146": {
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
+ "149": {
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
+ "154": {
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
+ "160": {
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
+ "188": {
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
+ "189": {
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
+ "192": {
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
+ "213": {
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
+ "214": {
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
+ "215": {
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
  }