@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.
- package/README.md +1 -1
- package/dest/artifacts/EcdsaAccount.json +90 -78
- package/dest/artifacts/SchnorrAccount.json +90 -78
- package/dest/artifacts/SchnorrSingleKeyAccount.json +77 -61
- package/dest/defaults/account_contract.d.ts +2 -1
- package/dest/defaults/account_contract.d.ts.map +1 -1
- package/dest/defaults/account_contract.js +1 -1
- package/dest/defaults/account_entrypoint.d.ts +1 -1
- package/dest/defaults/account_entrypoint.d.ts.map +1 -1
- package/dest/defaults/account_entrypoint.js +2 -2
- package/dest/defaults/account_interface.d.ts +2 -1
- package/dest/defaults/account_interface.d.ts.map +1 -1
- package/dest/defaults/account_interface.js +1 -1
- package/dest/defaults/entrypoint_payload.d.ts +1 -1
- package/dest/defaults/entrypoint_payload.d.ts.map +1 -1
- package/dest/defaults/entrypoint_payload.js +2 -2
- package/dest/ecdsa/account_contract.d.ts +1 -1
- package/dest/ecdsa/account_contract.d.ts.map +1 -1
- package/dest/ecdsa/account_contract.js +2 -2
- package/dest/ecdsa/index.d.ts +1 -1
- package/dest/ecdsa/index.d.ts.map +1 -1
- package/dest/schnorr/account_contract.d.ts +1 -1
- package/dest/schnorr/account_contract.d.ts.map +1 -1
- package/dest/schnorr/account_contract.js +2 -2
- package/dest/schnorr/index.d.ts +1 -1
- package/dest/schnorr/index.d.ts.map +1 -1
- package/dest/single_key/account_contract.d.ts +1 -1
- package/dest/single_key/account_contract.d.ts.map +1 -1
- package/dest/single_key/account_contract.js +2 -2
- package/dest/single_key/index.d.ts +1 -1
- package/dest/single_key/index.d.ts.map +1 -1
- package/dest/testing/configuration.d.ts +28 -0
- package/dest/testing/configuration.d.ts.map +1 -0
- package/dest/testing/configuration.js +61 -0
- package/dest/testing/create_account.d.ts +1 -1
- package/dest/testing/create_account.d.ts.map +1 -1
- package/dest/testing/create_account.js +4 -1
- package/dest/testing/index.d.ts +2 -2
- package/dest/testing/index.d.ts.map +1 -1
- package/dest/testing/index.js +3 -3
- package/package.json +7 -6
- package/dest/testing/sandbox.d.ts +0 -22
- package/dest/testing/sandbox.d.ts.map +0 -1
- package/dest/testing/sandbox.js +0 -48
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"isInternal": false,
|
|
8
8
|
"parameters": [],
|
|
9
9
|
"returnTypes": [],
|
|
10
|
-
"bytecode": "H4sIAAAAAAAA/+
|
|
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": "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",
|
|
93
|
+
"bytecode": "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",
|
|
94
94
|
"verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f"
|
|
95
95
|
},
|
|
96
96
|
{
|
|
@@ -107,7 +107,7 @@
|
|
|
107
107
|
}
|
|
108
108
|
],
|
|
109
109
|
"returnTypes": [],
|
|
110
|
-
"bytecode": "H4sIAAAAAAAA/+
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "H4sIAAAAAAAA/+
|
|
465
|
+
"bytecode": "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",
|
|
460
466
|
"verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f"
|
|
461
467
|
},
|
|
462
468
|
{
|
|
@@ -573,7 +579,9 @@
|
|
|
573
579
|
{
|
|
574
580
|
"name": "start_side_effect_counter",
|
|
575
581
|
"type": {
|
|
576
|
-
"kind": "
|
|
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": "
|
|
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": "
|
|
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": "H4sIAAAAAAAA/+
|
|
827
|
+
"bytecode": "H4sIAAAAAAAA/+2dB3wUR5bGZySEGI0kogAhCY2EJET0jABjDBhhwIDDOuAcARNtQBiEccQ555xzztnGOGeDM7fBe7tn7+3eem/31nu7tzn6XvXUM5+KXnlqXWV64PXv99Fdr7vr/evVq5qe7h6xMRaLxWPZpZBUEdt84f2tep3+ekvGYV1pn5zxPOEsyBPOwjzh7JInnEV5wtk1TziL84SzW55wJvKEsyRPOJN5wlmaJ5xlecJZniec3fOEs0eecPbME85eecLZO084+zjkHACc/N2ur1730+v+el2p13xOlV5X63WNbmsXXR5IqiWlSHV6HwemnjSI1EBqJDWRBpOaSUNIQ0nDSMNJI0gjSdvp89UXxBbSKNJo0hjS9qSxpB1I40g7ksaTJpAmknYiTdJxm0zamTSFNJU0jbQLaTppBmkmaVfSbqTdSXuQvkXak7QXaW/dlpRuyz6kWaR9SfuR9icdQDqQdBDpYNIhpENJh5EOJx1Bmk2aQ5pLOpI0jzSftIC0kLSItJh0FOlo0hLSUtIyUhtpOekYI+YrSCtJ7aRVBuexpNWk40jHk04gnUg6iXQyaQ3pFNKppNNIp5POIJ1JOot0Nukc0rmk80jnky4gXUi6iHQx6RLSpaTLSJeTriBdSboq1rH/ryZdQ7qWdB3petINpBtJN5FuJt1CupV0G+l20h2kO0l3ke4m3UO6l3Qf6X7SA6QHSQ+RHiY9QnqU9BjpcdITpCdJT5GeJj1DWkt6lrSO9BzpedILpBdJL5FeJr1CepX0Gul10hu6LQW6LW+S3jJsb5PW6+0Nev2OXr+r1+/p9ft6/YFef6jXH+n1RtInpdltdc1s3oNRNh6zcbDx+C0AG4/lQrDxuO4CNh7jRWDj8d4VbDz2i8FWo7e7gW0gbPO6Vm+XgC2lt5Ngq9PbpWCr19tlYBukt8vB1qC3u4OtUW/3AFuT3u4JtsF6uxfYmvV2b7AN0dt99Jrjo5ZWvU5/zUXV6fhzJK3YOTcqoD2cG33BxrnRD2ycG/3Bxm2vBBvnxgCwcW5UgY1zoxpsnBs1YOPcwJzi3KgFG+dGCmycG3Vg49yoBxvnxiCwcW40gI1zoxFsnBtNYOPcGAw2jnkz2DjmnFMqxjNgPy84pvH+LNt4P47pQqiTbbwfxzTvxzHN+3FM435e834c07wfxzTvx/HL+3Gscr/iuORzcAxyv2Iecz2Ys9yvmJ9cN+Yi9yvmIvvDXOR+xVxkBsxF7tcU2JgLc5HHEuYis+L81hV4W/U6/fWWDM77vMSNcits4+dBjVuWUfjZkgsL9gn3RV/gq3XL15KEWNWCnzrHfvAzMZc41AFLvVuW4D7tILd1BpeDDcCf0mv2k4T9FdC2Bsdti4NPrpfLyJcr68AtzKpYqg1OvEaqjgAf23D+awjha3TL1xKPdezHVig3Ah/b6oHFcf63JAwWtXQ2vgcBy2CnLJk0XhvnwjIYWJqcsmTnmma3dQbX0EMc16nqGAox4fgxexL2D4F4DXUcrzj45Hq5jHzCKqzCKqzCKqzCKqzCum2z4vccvIfJxzVEgI9tTcDi+rsB3o/jutW90bXg0+39lEwavyer+lPAwL4K4ZhHk5u4nte2ktjm363xmUmDUb87/mz/sR+ul8sp4OO24L0px/fJApZ6g2Xr9dtypPt7mpm0uteO94hqjXak9BrvU7NN5eQGaG9U7k3jfdoC4HN8vzrzr96vxvt0hcDn+H51Bu+L58JXC3x8Hj4rcj2O/tX73Ek4rwj4HN+ny+Az51z48J4w3j/kteN7mhnb+4hh9zmLgc/tvcUsX5MF32Dg4/O6AZ/j+3gZvObJhW8I8OHzW+Yb5oFvqAXfMODj80qAb4QHvuEWfCOAbzhsM992HvhGWvBtB0x8XinwZTzwpWO582WAj88rA75RHvhaLPhGAR+fVw58YzzwjbbgGwN8fF534BvrgW97C76xwMfn9QC+cR74drDgGwd8fF5P4BvvgW9HC77xwMfn9QK+iR74JljwTQQ+Pq838E3ywLeTBd8k4OPz8P22yR74Wi34JgMf2/Hzd4oHvp0t+KYAH5/XH/imueULniNPteCbBiwz3LKMViy7WLDMAJbpblmC58gz3dYZPEfe1XGdqo7dICYcP2ZPwv5dIV67OY5XHHxyvVxGPmHdtlkVy1SDMwHHTY0AH9ume2RJGCxq6WyuC+PDvtzDLV/wubC7Bd8ewLKXU5ZRwT32b1mw7AUsezplyX4u7O22zmAO3wf4ua3sJwn7sc/3cdy2OPjkermMfMIqrMIqrMIqrMIqrMIqrMIqrMIqrMIqrMIqrMIqrMIqrMIqrMIqrMIqrMIqrMLqnlWx7G5wJuC43SPAx7Y9PbIkDBa1dPaeSBgf9uW+bvmCd2pmWfDtCywHOGVpCd6p2c+C5QBg2d8pS/admgPd1hm8U3MQ8HNb2U8S9mOfH+S4bXHwyfVyGfmEVViFVViFVViFVViFVViFVViFVViFVViFVViFVVjzhVWxzDI4E3DcrAjwsW1/jywJg0Utnd1nD+PDvjzELV/wTOJgC75DgOVwtyzB33841ILlcGA5zC1L8EziCLd1Bs8kZgM/t5X9JGE/9vlsx22Lg0+ul8uzwS6s2zarYjnY4EzAcQdHgI9th3lkSRgsaulsXpodwod9OdctXzCHz7Hgmwss852yZJ8rH2nBMh9Y5jllyc7hC9zWGczhC4Gf28p+krAf+3yh47bFwSfXy+WF/vwG7V/0Fe1fFMKx6BtsP/LlyrprHrFKXCWuEleJq8RV4ipxlbhKXCWuEleJq8RV4ipxlbhKXCWuEtfcWRXLHIMzAcfNiQAf2+Z5ZEkYLGrp7N59GB/m3VFu+YLnHIst+I4ClqVOWbJ/k/poC5alwLLEKUv2Occyt3UG9/nbgJ/byn6SsB/7vM1x2+Lgk+vlMvJtjawL84hVcsAPq+SAsEoOCKvkgLBKDgir5ICwSg4Iq+SAsEoOCKvkgLBKDgir5ICwSg4Iq+SAsEoOCOuWzgHFstjgTMBxiyPAx7YlHlkSBotaOntPJIwP8+4Yt3zBOzXLLfiOAZZ2DywrLFjagWWlW5bgnZpVbusM3qk5Fvi5rewnCfuxz4913LY4+OR6uYx8+cKqWJYbnAk4bnkE+Ni20iNLwmBRS2fjJ4wP+/I4t3zB+F5twXccsJzogeV4C5YTgeUEtyzBXHOS2zqDueZk4Oe2sp8k7Mc+P9lx2+Lgk+vlMvLlC6tiWW1wJuC41RHgY9sJHlkSBotaOhs/YXzYl6d44FtjwXcK8K0J4TvNA9+pFnynAR+fVwJ8Z3jgO92C7wzgOx22me8sD3xnWvCdBUx8XinwneOB72wLvnOAj88rA77zPPCda8F3HvDxeeXAd4EHvvMt+C4APj6vO/Bd5IHvQgu+i4CPz+sBfJd44LvYgu8S4OPzcP67zAPfpRZ8lwHfpSF8V3jgu9yC7wrguzyE7yoPfFda8F0FfFeG8F3jge9qC75rgI/Pw3tY13ngu9aC7zpgud4tSzoJLNeDnxs9tPmGWO5tZv9JOA/5bvbAd5MF383Ad1MI360e+G6x4LsV+Pg8zOnbPfDdZsF3O/DxeTgn3OmB7w4LvjuB744Qvrs98N1lwXc38N0VwnevB757LPjuBb57Qvju98B3nwXf/cB3Xwjfgx74HrDgexD4Hgjhe9gD30MWfA8D30MhfI964HvEgu9R4HskhO9xD3yPWfA9DnyPhfA96YHvCQu+J4HviRC+pz3wPWXB9zTwPRXCt9YD3zMWfGuB75kQvnUe+J614FsHfM+G8D3vge85C77nge+5EL4XPfC9YMH3IvC9EML3sge+lyz4XgY+Pg+v/171wPeKBd+rwMfnYfxed8sXPHN5zYLvdWB5yy1L8H8NvGHB8hawvOmWJXj+87bbOoPnP+uBn9vKfpKwH/t8veO2xcEn18tl5BPWbZtVsbxmcCbguNciwMe2Nz2yJAwWtXQ2L4XxYV++45YvmMM3WPC9AyzvO2UZHfwNnnctWN4HlvecsmTn8A/c1hnM4R8CP7eV/SRhP/b5h47bFgefXC+XkS9X1oV5xCpxlbhKXCWuEleJq8RV4ipxlbhKXCWuEleJq8RV4ipxlbhKXCWuEleJq8RV4ipxlbhKXCWuEleJq8RV4ipxlbhKXCWuEleJq8RV4ipxzZ1VsWwwOBNw3IYI8LHtPY8sCYNFLXGj3ArbYXyYdxvd8gXvhH9kwbcRWL7jlKUleCf83yxYvgMs33bKkn0n/Ltu60yrOr4H/NxW9pOE/djn33Pctjj45Hq5jHy5si7MI1aJq8RV4ipxlbhKXCWuEleJq8RV4ipxlbhKXCWuEleJq8RV4rp1xlWxfGRwJuC4jyLAx7Zve2RJGCxq6ew+exgf5t333fIFzyQ+tuD7PrD80CnLqOCZxL9bsPwQWH7glCX7TOI/3NYZPJP4BPi5rewnCfuxzz9x3LY4+OR6uYx8WyPrwjxilRzwwyo5IKySA8IqOSCskgPCKjkgrJIDwio5IKySA8IqOSCskgPCKjkgrJIDwio5IKySA8K6pXNAsXxscCbguI8jwMe2H3hkSRgsaunsPZEwPsy7H7nlC96p+dSC70fA8hO3LMH/3/efFiw/AZYfu2UJ3qn5L7d1Bu/U/BT4ua3sJwn7sc9/6rhtcfDJ9XIZ+YR122ZVLJ8anAk47tMI8LHtxx5ZEgaLWjqbl8L4sC9/5pYvmMM/s+D7GbD8wi1LMIf/twXLL4Dl525Zgjn8f9zWGczhvwR+biv7ScJ+7PNfOm5bHHxyvVxGPmHdtlkVy2cGZwKO+ywCfGz7uUeWhMGils7mpTA+7MtfueUL5vDPLfh+BSy/8cDyvxYsvwGWX7tlCebw/3NbZzCH/xb4ua3sJwn7sc9/67htcfDJ9XIZ+fKFVbF8bnAm4LjPI8DHtl97ZEkYLGrpbPyE8WFf/t4D3+8s+H4PfL8L4fujB74/WPD9Efj+EML3Zw98f7Lg+zPw/SmE768e+P5iwfdX4PtLCN/fPfD9zYLv78D3txC+Lzzw/cOC7wvg+0cIXzzuns8E6oyP/SfhQOTr4pYvuH4osOBj/4ql0HGsVJ1FbutMqzq7OuZUdRRDkDh+RdB3vL8rxKvYMUccfHK9XEa+XFkrYluW1YPfltJY9rqmwPDFz1yQqZve7gJ2HnuqmODY6TIff70+phCOiXXLrsq0f7b3jW1qa6mHuabEYiyXQtyTHsZymeOxrOoohwZxW8sgl3l/AtpW7iGXy4xc5nI5zt96KYhtYinzwIJLK2yXhbBgXLY0S1GEWLrHosNSGiGWRIRYukaIpTBCLD0ixFIWIZaSCLEUR4ilS4RYKiPE0j9CLP0ixFIeIZZkhFi6RYilKEIs8S3Mkoht/r0nAfuL4Di+Xi8BW3duE9gKQnzwNUA52Hhu7Q7fFb9bunndGCMf30/QTyuUv2wvMHT3/F0pF5aiCLF0ixBLMkIs5RFi6Rchlv4RYqmMEEuXCLEUR4ilJEIsZRFi6REhlsIIsXSNEEsiQiylEWLpHiEWvr6NRL5EiKUgpI96uGUZjd8peDGKHb6z9AAW19+VVJ093dYZPE/t5bhOVUdvCBLHj9mTsL8XxKu3hzzqGe/YT1xGPmHdtlmV3z5O/Wb/RnFPi3mjj8cYqDorPIzxvtAgbmsF9G/fkP7t66F/K4z+5TLyCauwCquwCquwCquwCquwCquwCquwCquwCquwCquwCquwCquwCquwCquwCquwCqt7VuW3n1O/LcE7F+hXLUbxS18x8O8jBqrO/m7rDN65qIQGcVv7Q/9WhvRvpYf+7W/0L5eRT1iFVViFVViFVViFVViFVViFVViFVViFVViFVViFNV9Yld8Bbv0Gvy9Gv2oxih3uWQ/wGANVZ5XbOoN71tXQIG5rFfRvdUj/Vnvo3yqjf7mMfMK6bbMqvzVO/WafS1VZjPEajzFQdQ70MMZroUHc1oHQv7Uh/VvroX8HGv3L5Vp/foP2p76i/akQjtQ32H7ky5W1Vx6xSlwlrhJXiavEVeIqcZW4SlwlrhJXiavEVeIqcZW4SlwlrhLX3FmV3zqnfrN/ExP9qsUodrgPXucxBqrOerd1BveBB0GDuK310L+DQnJxkIf+rTf6l8vItzWy1kpct3lWyQFhlRwQVskBYZUcEFbJAWGVHBBWyQFhlRwQVskBYZUcEFbJAWGVHBBWyQFhlRwQ1i2dA8pvg1u/LQnDr1qM4pe+YuDfRwxUnY1u6wzeuWiCBnFbG6F/m0JysclD/zYa/ctl5MsXVuV3sIdcbLTIxcEeY6DqbPaQi0OgQdzWZujfISH9O8RD/zYb/ctl5MsX1gTYCmKbbLy/EGxDta0L2IZpWxHYhkOb2DZC24rBNlLbuoFtO+DidVrb+oMto23lcHyL3i4D2yi93RNso/V2b7CN0dsVYNteb/cF21hmAdsOersSbOP0dhXYdtTb1WAbr7cHgm2C3k6BbaLx2apsOxmfcco2yZj3lK3VmH+UbbKRf8q2s94uiW2yTYGcZdtUbSsF2zSOPdh24T4C23Rt6w62GdrWA2wzQ/g4P5vBxvmJ+cz5ORRsnJ/DwMb5ORxsnJ8jwMb5ORJsnJ+Yrxy3NNg4bhmwcdxawMZxGwU2jttosHHcxoCN47Y92Hpq21iw9dK2HcDWW9vGga2Ptu0ItgptGw+2vto2AWz9tG0i2Hjc7gS2Sm2bBLYB2tYKtiptmwy2am3bGWw12jYFbAO1bSrYarVtGthS2rYL2Oq0bTrY6rVtBtgGadtMmN+6wrGtep3+eksGffESN8qtsM3+g3eN3bKkk8BSB35qnfppCYZRStdVoLc5v2rBb40bvxneUH6rjfgxB/sqhGOe04O8TB9f7TQO6WCaqAGeFPBUAw8f85LmUfPg3NKO7XDJhWOCl85yEnPFUZ8xShrHcS4sGE+3eZu9/nWcA+ng70c5rlPVMQBiktJrZk/C/iqI1wDH8cLxxvVyGfmEVViFVViFVViFVViFVViFVViFVViFVViFVViFVVjzhVWx1Buc+HyrPgJ8bMPnLa7vbePzQK5bPbvYC55dpJz6zD5bwucRKWBgX4VwzPmlm7j21dslsJ/7Cp8xYv+5fd6R7T/2w/VymX2VQFuw/1w/78DndFzv1uu35Uj3Y6AlrVIKnzub4477FJ+9sg2f86k+57xr0Gt8NtbgLS659QeOmRTYeHsQ8LmNccbHM7SMqmMA9AO3jf0Uwv6lMIe0lW7qG3O+UPvXhOznJW6UW2Ebn1s3uW1rMGcOhvpbwQf6bXbrN4N+41rsg+2FsH0yv2ADx6mF48vMKu8aQ47D7VrjnCTsb/Tc5ibgaIUy+1J5sgJyag18Xrr+vMH2Ylz6QVx4fwri4nq8qbiY13fMUAUsDQYnXlfhHNjoge+fXVc1Ah/baoCP24HzyVpgTTll7XgNZL5fkwK/jj4nOrxfg+9f1AEH+8L3WS7Vea3erzGve1JwbiXU+U28E2R+NuM7QVcB8zf1ThDzhL0TdB3MExu/4vq1xrB54M8gP9dbY/DjdUGNP5acYunrOxjPWer9VORgX4VwzJ1GTjn+fM/+hiDWcensWqMJYjPYcWw8fKZmf0MA/OZnfxL2V0DbhjhuG16/cL1cRr5cWQdGgLU5hBWv+auM4xTrUKesLcH1/TCndWave4brutTcmdLb7KcQ9q+FOXYdXL9zm+ugnvUh+3npbMwNhfiNdNvW4DNuO6i/FXyg37Rbvxn0y9f37IPthbD9NlzfpzdtfhlfZlZ5NyLkONxuNs5Jwv4Rnts8Ejhaocy+VJ68ADm1Hq7vXY9zbC/GpRLiwvvxOrveOD74/Y/exusH1+MyDn64Xi4PAz62DYGYbvR2XzHLVQdcqdjm9xXxfifOCXi/s8gDV5dYx3hxmX0pv8WO/eJvb3jpbH4rBpaujlnU73h46ljZ3rZizsL5B6xY3D4/DlxFBmMBsBXAvkLjuOLY5u1yBl4R6xi8Ag3QRQNzx6kG8g+Rkrqx6mJR/ZBI/XBI/VBI/TBI/RBI/fCnD9T7ol4rX+qHPeqLoPrhjkpUdTGqBr26GFYXqOqCQ324p2LZBFYDXd24U1+s1Ye/ujBUF4RqUlADT314qEGpBqOaRNREpyZzNdGpmaeFNIo0mjSGtD1pLGkH0jjSjqTxpAmkiaSdSJN0fCeTdiZNIU0lTSPtQppOmkGaSdqVtBtpd9IepG+R9iTtRdqbtA9pFmlf0n6k/UkHkA4kHUQ6mHQI6VDSYaTDSUeQZpPmkOaSjiTNI80nLSAtJC0iLSYdRTqatIS0lLSM1EZaTjqGtIK0ktROWkU6lrSadBzpeNIJpBNJJ5FOJq0hnUI6lXQa6XTSGaQzSWeRziadQzqXdB7pfNIFpAtJF5EuJl1CupR0Gely0hWkK0lXka4mXUO6lnQd6XrSDaQbSTeRbibdQrqVdBvpdtIdpDtJd5HuJt1Dupd0H+l+0gOkB0kPkR4mPUJ6lPQY6XHSE6QnSU+RniY9E8ve/HiWtI70HOl50guxbK6+RHqZ9ArpVdJrpNdJb5DeJL1Fepu0nrSB9A7pXdJ7pPdJH5A+JH1E2hjbfOCr5Qs9G03Q5VnZSSO1cklbeyqdWkb/zlmypG31/HkjU7hvZWrpqpXtqZXtc1a0pxasaFuayozEetfpH+jw5D+nvX3+0uXtqfY2OnFJ++LlS45PrV7cvijVduz8FQvIAZ58SenXOPlKfXL15ifPmTfvn593hz6Pfy44c9m8+cel2la1p9oWpOa2rVo2b+X/A/UIbnZGOQIA",
|
|
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
|
-
"eJztndGK3EgSRf+
|
|
825
|
-
"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c7iQOVzIHC5kDhcyhwuZw4XM4ULmcCFzuJA5XMgcLmQOFzKHC5nDhczhQuZwIXO4kDlcyBwuZA4XMocLmcOFzOFC5nAhc7iQOVzIHC5kDhcyhwuZw4XM4ULmcCFzuJA5XMgcLmQOFzKHC5nDhczhQuZwIXO4kDlcyBwuZA4XModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrModrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMofrMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbMocbModLmcOlzOFS5nApc7iUOVzKHC5lDpcyh0uZw6XM4VLmcClzuJQ5XMocLmUOlzKHS5nDpczhUuZwKXO4lDlcyhwuZQ6XModLmcOlzOFS5nApc7iUOVzKHC5lDpcyh0uZw6XM4VLmcClzuJQ5XMocLmUOlzKHS5nDpczhUuZwKXO4lDlcyhwuZQ6XModLmcOlzOFS5nApc7iUOVzKHC5lDpcyh0uZw6XM4VLmcClzuJQ5XMocLmUOlzKHS5nDpczhUuZwKXO4lDlcyhwuZQ6XModLmcOlzOFS5nApc7iUOVzKHC5lDpcyh0uZw6XM4VLmcClzuJQ5XMocLmUOlzKHS5nDpczhUuZwKXO4lDlcyhwuZQ6XModLmcOlzOFS5nApc7jykEHcsUQ99WOJeuzHEvXcjyXqwR9L1JM/lqhHfyxRz/5Yoh7+sUQ/fRnJHUv005eh3LFEP30Zyx1L9NOXwdyxRD99Gc0dS/TTl+HcsUQ/fRnPHUv005cB3bFEP30Z0R1L9NOXId2xRD99GdMdS/TTl0HdsUQ/fRnVHUv005dh3bFEP30Z1x1L9NOXgd2xRD99GdkdS/TTl6HdsUQ/fRnbHUv005fB3bFEP30Z3R1L9NOX4d2xRD99Gd8dS/TTlwHesUQ/fRnhHUv005ch3rFEP30Z4x1L9NOXQd6xRD99GeUdS/TTl2HesUQ/fRnnHUv005eB3rFEP30Z6R1L9NOXod6xRD99GesdS/TTl8HesUQ/fRntHUv005fh3rFEP30Z7x1L9NOXAd+xRD99GfEdS/TTlyHfsUQ/fRnzHUv005dB37FEP30Z9R1L5NMvOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrOusrc9b3axN5rjoKyv9d+Mvfv9pa+3i1/fDqMurk1bXV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",
|
|
826
|
-
"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xxyuYw7XMYfrmMN1zOE65nAdc7iOOVzHHK5jDtcxh+uYw3XM4TrmcB1zuI45XMccrmMO1zGH65jDdczhOuZwHXO4jjlcxxyuYw7XMYfrmMN1zOE65nAdc7iOOVzHHK5jDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMO55jDOeZwjjmcYw7nmMM55nCOOZxjDueYwznmcI45nGMONzCHG5jDDczhBuZwA3O4gTncwBxuYA43MIcbmMMNzOEG5nADc7iBOdzAHG5gDjcwhxuYww3M4QbmcANzuIE53MAcbmAONzCHG5jDDczhBuZwA3O4gTncwBxuYA43MIcbmMMNzOEG5nADc7iBOdzAHG5gDjcwhxuYww3M4QbmcANzuIE53MAcbmAONzCHG5jDDczhBuZwA3O4gTncwBxuYA43MIcbmMMNzOEG5nADc7iBOdzAHG5gDjcwhxuYww3M4QbmcANzuIE53MAcbmAONzCHG5jDDczhBuZwA3O4gTncwBxuYA43MIcbmMMNzOEG5nADc7iBOdzAHG5gDjcwhxuYww3M4QbmcANzuIE53MAcbmAONzCHG5jDDczhBuZwE3O4iTncxBxuYg43MYebmMNNzOEm5nATc7iJOdzEHG5iDjcxh5uYw03M4SbmcBNzuIk53MQcbmIONzGHm5jDTczhJuZwE3O4iTncxBxuYg43MYebmMNNzOEm5nATc7iJOdzEHG5iDjcxh5uYw03M4SbmcBNzuIk53MQcbmIONzGHm5jDTczhJuZwE3O4iTncxBxuYg43MYebmMNNzOEm5nATc7iJOdzEHG5iDjcxh5uYw03M4SbmcBNzuIk53MQcbmIONzGHm5jDTczhJuZwE3O4iTncxBxuYg43MYebmMNNzOEm5nATc7iJOdzEHG5i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"
|
|
835
|
+
"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",
|
|
836
|
+
"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",
|
|
837
|
+
"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4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4YrM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4arM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4ZrM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4brM4ULmcCFzuJA5XMgcLmQOFzKHC5nDhczhQuZwIXO4kDlcyBwuZA4XMocLmcOFzOFC5nAhc7iQOVzIHC5kDhcyhwuZw4XM4ULmcCFzuJA5XMgcLmQOFzKHC5nDhczhQuZwIXO4kDlcyBwuZA4XMocLmcOFzOFC5nAhc7iQOVzIHC5kDhcyhwuZw4XM4ULmcCFzuJA5XMgcLmQOFzKHC5nDhczhQuZwIXO4kDlcyBwuZA4XMocLmcOFzOFC5nAhc7iQOVzIHC5kDhcyhwuZw4XM4ULmcCFzuJA5XMgcLmQOFzKHC5nDhczhQuZwIXO4kDlcyBwuZA4XMocLmcOFzOFC5nAhc7iQOVzIHC5kDhcyhwuZw4XM4ULmcCFzuJA5XMgcLt1kELctUU99W6Ie+7ZEPfdtiXrw2xL15Lcl6tFvS9Sz35aoh78t0U9fRnLbEv30ZSi3LdFPX8Zy2xL99GUwty3RT19Gc9sS/fRlOLct0U9fxnPbEv30ZUC3LdFPX0Z02xL99GVIty3RT1/GdNsS/fRlULct0U9fRnXbEv30ZVi3LdFPX8Z12xL99GVgty3RT19GdtsS/fRlaLct0U9fxnbbEv30ZXC3LdFPX0Z32xL99GV4ty3RT1/Gd9sS/fRlgLct0U9fRnjbEv30ZYi3LdFPX8Z42xL99GWQty3RT19GedsS/fRlmLct0U9fxnnbEv30ZaC3LdFPX0Z62xL99GWoty3RT1/GetsS/fRlsLct0U9fRnvbEv30Zbi3LdFPX8Z72xL99GXAty3RT19GfNsS/fRlyLct0U9fxnzbEv30ZdC3LdFPX0Z92xL59JPO+pLO+pLO+pLO+pLO+pLO+pLO+pLO+pLO+pLO+pLO+pLO+pLO+pLO+pLO+pLO+pLO+pLO+pLO+pLO+pLO+pLO+pLO+pLO+pLO+pLO+pLO+pLO+pLO+pLO+pLO+pLO+pLO+pLO+pLO+pLO+pLO+pLO+pLO+pLO+pLO+tKY9f3ad/ZVWw367cKffv9pa3b/tEV7fDr1GHw619Z8//j2z70/Pl/b6OKt3T98+y5If2xg+LtI2sDwm0HawPB7StrAsGqQNjCsYaQNDCsqaQPD+k7awLDbgDYw/ksHaQP0Tjz+KxBpA/ROPP4LGWkD9E48/ushaQP0Tjz+yyppA/ROPP6rM2kD9E48/os8aQP0Tjx+WoG0AXonHj/JQdoAvROPn3IhbYDeicdPAJE2QO/E46ejSBugd+Lxk2OkDdA78fipOtIG6J14/MQhaQP0Tjx+GpO0AXonHj+pStoAvROPn+IlbYDeicdPOJM2QO/E46e/SRugd+Lxk/GkDdA78XhqgLQBeiceT1SQNkDvxONpE9IG6J14PIlD2gC8E+fxlBJpA/BOnMcTXKQNwDtxvsE7cR7P2pE2AO/EeTyHSNoAvBPn8YwmaAPjiVHSBuideDxNS9oAvROPJ41JG6B34vEUNmkD9E48nlAnbYDeicfT+6QN0Dvx2GxA2gC9E4+tD6QN0Dvx2IhB2gC9E49tIaQN0Dvx2KRC2gC9E48tM6QN0Dvx2MBD2gC9E4/tRKQN0Dvx2NxE2gC9E4+tVqQN0Dsx3bGV6Y6tTHdsZbpjK9MdW5nu2Mp0x1amO7Yy3bGV6Y6tTHdsZbpjK9MdW5nu2Mp0x1amO7Yy3bGV6Y6tTHdsZbpjK9MdW5nu2Mp0x1amO7Yy3bGV6Y6tTHdsZbpjK9MdW5nu2Mp0x1amO7Yy3bGV6Y6tTHdsZbpjK9MdW5nu2Mp0x1amO7Yy3bGV6Y6tTHdsZbpjK9MdW5nu2Mp0x1amO7Yy3bGV6Y6tTHdsZbpjK9MdW5nu2Mp0x1amO7Yy3bGV6Y4tozu2jO7YMrpjy+iOLbvBO7HRHVtGd2wZ3bFldMeW0R1bRndsGd2xZXTHltEdW0Z3bBndsWV0x5bRHVtGd2wZ3bFldMeW0R1bRndsGd2xZXTHltEdW0Z3bBndsWV0x5bRHVtGd2wZ3bFldMeW0R1bRndsGd2xZXTHltEdW0Z3bBndsWV0x5bRHVtGd2wZ3bFldMeW0R1bRndsGd2xZXTHltEdW0Z3bBndsWV0x5bRHVtGd2wZ3bFldMeW0R1bRndsGd2xZXTHltEdW0Z3bBndsWV0x5bRHVtGd2wZ3bFldMeW0R1bRndsGd2xZXTHltEdW0Z3bBndsWV0x5bRHVtGd2wZ3bFldMeW0R1bRndsGd2xZXTHltEdW0Z3bBndsWV0x5bRHVtGd2wZ3bFldMeW0R1bRndsGd2xZXTHltEdW0Z3bBndseV0x5bTHVtOd2w53bHlN3gndrpjy+mOLac7tpzu2HK6Y8vpji2nO7ac7thyumPL6Y4tpzu2nO7Ycrpjy+mOLac7tpzu2HK6Y8vpji2nO7ac7thyumPL6Y4tpzu2nO7Ycrpjy+mOLac7tpzu2HK6Y8vpji2nO7ac7thyumPL6Y4tpzu2nO7Ycrpjy+mOLac7tpzu2HK6Y8vpji2nO7ac7thyumPL6Y4tpzu2nO7Ycrpjy+mOLac7tpzu2HK6Y8vpji2nO7ac7thyumPL6Y4tpzu2nO7Ycrpjy+mOLac7tpzu2HK6Y8vpji2nO7ac7thyumPL6Y4tpzu2nO7Ycrpjy+mOLac7tpzu2HK6Y8vpji2nO7ac7thyumPL6Y4tpzu2nO7Ycrpjy+mOLac7tpzu2HK6Y8vpji2nO7ac7thyumPL6Y4tpzu2Ct2xVeiOrUJ3bBW6Y6vc4J240B1bhe7YKnTHVqE7tgrdsVXojq1Cd2wVumOr0B1bhe7YKnTHVqE7tgrdsVXojq1Cd2wVumOr0B1bhe7YKnTHVqE7tgrdsVXojq1Cd2wVumOr0B1bhe7YKnTHVqE7tgrdsVXojq1Cd2wVumOr0B1bhe7YKnTHVqE7tgrdsVXojq1Cd2wVumOr0B1bhe7YKnTHVqE7tgrdsVXojq1Cd2wVumOr0B1bhe7YKnTHVqE7tgrdsVXojq1Cd2wVumOr0B1bhe7YKnTHVqE7tgrdsVXojq1Cd2wVumOr0B1bhe7YKnTHVqE7tgrdsVXojq1Cd2wVumOr0B1bhe7YKnTHVqE7tgrdsVXojq1Cd2wVumOr0B1bhe7YKnTHVqE7tgrdsVXojq1Cd2wVumOr0B1bhe7YKnTHVqE7tgrdsVXojq1Cd2xVumOr0h1ble7YqnTHVr3BO3GlO7Yq3bFV6Y6tSndsVbpjq9IdW5Xu2Kp0x1alO7Yq3bFV6Y6tSndsVbpjq9IdW5Xu2Kp0x1alO7Yq3bFV6Y6tSndsVbpjq9IdW5Xu2Kp0x1alO7Yq3bFV6Y6tSndsVbpjq9IdW5Xu2Kp0x1alO7Yq3bFV6Y6tSndsVbpjq9IdW5Xu2Kp0x1alO7Yq3bFV6Y6tSndsVbpjq9IdW5Xu2Kp0x1alO7Yq3bFV6Y6tSndsVbpjq9IdW5Xu2Kp0x1alO7Yq3bFV6Y6tSndsVbpjq9IdW5Xu2Kp0x1alO7Yq3bFV6Y6tSndsVbpjq9IdW5Xu2Kp0x1alO7Yq3bFV6Y6tSndsVbpjq9IdW5Xu2Kp0x1alO7Yq3bFV6Y6tSndsVbpjq9IdW5Xu2Kp0x1alO7Yq3bFV6Y6tSndsVbpjq9IdW5Xu2Gp0x1ajO7Ya3bHV6I6tdoN34kZ3bDW6Y6vRHVuN7thqdMdWozu2Gt2x1eiOrUZ3bDW6Y6vRHVuN7thqdMdWozu2Gt2x1eiOrUZ3bDW6Y6vRHVuN7thqdMdWozu2Gt2x1eiOrUZ3bDW6Y6vRHVuN7thqdMdWozu2Gt2x1eiOrUZ3bDW6Y6vRHVuN7thqdMdWozu2Gt2x1eiOrUZ3bDW6Y6vRHVuN7thqdMdWozu2Gt2x1eiOrUZ3bDW6Y6vRHVuN7thqdMdWozu2Gt2x1eiOrUZ3bDW6Y6vRHVuN7thqdMdWozu2Gt2x1eiOrUZ3bDW6Y6vRHVuN7thqdMdWozu2Gt2x1eiOrUZ3bDW6Y6vRHVuN7thqdMdWozu2Gt2x1eiOrUZ3bDW6Y6vRHVuN7thqdMdWozu2Gt2x1eiOrUZ3bDW6Y6vRHVuN7thqdMdWozu2Gt2x1emOrU53bHW6Y6vTHVv9Bu/Ene7Y6nTHVqc7tjrdsdXpjq1Od2x1umOr0x1bne7Y6nTHVqc7tjrdsdXpjq1Od2x1umOr0x1bne7Y6nTHVqc7tjrdsdXpjq1Od2x1umOr0x1bne7Y6nTHVqc7tjrdsdXpjq1Od2x1umOr0x1bne7Y6nTHVqc7tjrdsdXpjq1Od2x1umOr0x1bne7Y6nTHVqc7tjrdsdXpjq1Od2x1umOr0x1bne7Y6nTHVqc7tjrdsdXpjq1Od2x1umOr0x1bne7Y6nTHVqc7tjrdsdXpjq1Od2x1umOr0x1bne7Y6nTHVqc7tjrdsdXpjq1Od2x1umOr0x1bne7Y6nTHVqc7tjrdsdXpjq1Od2x1umOr0x1bne7Y6nTHVqc7tjrdsdXpjq1Od2x1umOr0x1bne7Y6nTHVqc7tjrdsdXpjq1Od2x1umMr6I6toDu2gu7YCrpjK27wThx0x1bQHVtBd2wF3bEVdMdW0B1bQXdsBd2xFXTHVtAdW0F3bAXdsRV0x1bQHVtBd2wF3bEVdMdW0B1bQXdsBd2xFXTHVtAdW0F3bAXdsRV0x1bQHVtBd2wF3bEVdMdW0B1bQXdsBd2xFXTHVtAdW0F3bAXdsRV0x1bQHVtBd2wF3bEVdMdW0B1bQXdsBd2xFXTHVtAdW0F3bAXdsRV0x1bQHVtBd2wF3bEVdMdW0B1bQXdsBd2xFXTHVtAdW0F3bAXdsRV0x1bQHVtBd2wF3bEVdMdW0B1bQXdsBd2xFXTHVtAdW0F3bAXdsRV0x1bQHVtBd2wF3bEVdMdW0B1bQXdsBd2xFXTHVtAdW0F3bAXdsRV0x1bQHVtBd2wF3bEVdMdW0B1bQXdsBd2xFXTHVtAdWwF3bG0/Y3fi7WfsTrz9jN2Jt5+xO/H2M3Yn3n7G7sTbz9idePsZuxNvP2N34u1n9E4Md2xtG6B3Yrhja9sAvRPDHVvbBuidGO7Y2jZA78Rwx9a2AXonhju2tg2MO/H24XukbO3JBvItyv3/JFl+soHI90tH+/qs+yj8LVp5/Iu8WXxd+lYeOxi3YtIOxr2YtINxMybtYNyNSTsYt2PSDsb9mLSDcUMm7WDckUE7OJBtkXaA78kHui3SDvA9+UC4RdoBvicfKLdIO5jek9PN21cq/9d76DXdt5v6kwt3u3+2+9dn3R5bnd68P7fV6V3+Y1s9MH79v9zq5fcN8WyrueYHujD7PtPvP2zljjksvv6txFf8y28a5sa//I5hbvzLbxfmxr/8XmFu/MtvFObGv/wuYW78yzv/3PiXd/Op8Q9MYJj47K57YAHDxGd33QMDGCY+u+se2L8w8dld98D8hYnP7roH1i9MfHbXPTB+YeKzu+6B7QsTn911D0xfmPjsrntg+cLEZ3fdA8MXJj676x7YvTDx2V33wOyFic/uugdWL0x8dtc9MHph4rO77oHNCxOf3XUPTF6Y+Oyue2DxwsRnd90DgxcmPrvrHti7MPHZXffA3IWJz+66B9YuTHx21z0wdmHis7vuga0LE5/ddQ9MXZj46K6bDixdmPjorpsODF2Y+Oium27orpsO3FyY+Oiumw68XJj46K6bDpxclPgHRi5MfHbXPbBxYeKzu+6BiQsTn911DyxcmPjsrntg4MLEZ3fdA/sWJj67614v3pobn911r1duzY3P7rrXy7bmxmd33es1W3Pjs7vu9YKtufHZXfd6tdbc+Oyue71Ua258dte9Xqc1Nz67617vx5obn911r/dYzY3P7rpsN1Viu6kS202V2G6qxHZTJbabKrHdVIntpkpsN1Viu6kS202V2G6qxHZTJbabKrHdVIntpkpsN1Viu6kS202V2G6qxHZTJbabKrHdVIntpkpsN1Viu6kS202V2G6qxHZTJbabKrHdVIntpkpsN1Viu6kS202V2G6qxHZTJbabKrHdVIntpkpsN1Viu6kS202V2G6qxHZTJbabKrHdVIntpkpsN1Viu6kS202V2G6qxHZTJbabKrHdVIntpkpsN1Viu6ky202V2W6qzHZTZbabKt/W7rr+yOEpvo8/uG7r98v2r8QlPXa6doO+cqdr9/Ird7p22/+xnUYZ7XTtO4Qrd7r2zcSFO73e0pKf7DTy/dLRvj7rPgp/i3a/ckq37/8l3spjB5ef1ewdXO9qmb6Dy2//pu/g8jvA6Tu4/CZw+g4uvw+cvoPL7++m7+Dy+7bpO7j8fmz6DvA9+XqNy+wdXG9ymb4DfE++3ucyfQf4nny91WX6Dqb35HTz9pXK//Ueek337ab+5MLd7p/t/vVZf4C06yUw6251epf/3Fan3w58bqvT7xs+ttXrpTXrbpX9xyG24CazBTeZLbjJbMFNZgtuMltwk9mCm8wW3GS24CazBTeZLbjJbMFNZgtuMltwk9mCm8wW3GS24CazBTeZLbjJbMFNZgtuMltwk9mCm8wW3GS24CazBTeZLbjJbMFNZgtuMltwk9mCm8wW3GS24CazBTeZLbjJbMFNZgtuMltwk9mCm8wW3GS24CazBTeZLbjJbMFNZgtuMltwk9mCm8wW3GS24CazBTeZLbjJbMFNZgtuMltwk9mCm8wW3GS24CazBTfGFtwYW3BjbMGNsQU3dkN3XVvcWvM0Prrr2uJ+mafx0V3XFjfBPIuf2F03sbtuYnfdxO66id11E7vrJnbXTeyue73Wa258dte9Xug1Nz67616v8pobn911r5d4zY3P7rrX67vmxmd33evFXXPjs7vu9cquufHZXfd6Wdfc+Oyue72ma258dte93rs1Nz67617vx5obn911r/dYzY3P7rpsN5Wx3VTGdlMZ201lbDeVsd1UxnZTGdtNZWw3lbHdVMZ2UxnbTWVsN5Wx3VTGdlMZ201lbDeVsd1UxnZTGdtNZWw3lbHdVMZ2UxnbTWVsN5Wx3VTGdlMZ201lbDeVsd1UxnZTGdtNZWw3lbHdVMZ2UxnbTWVsN5Wx3VTGdlMZ201lbDeVsd1UxnZTGdtNZWw3lbHdVMZ2UxnbTWVsN5Wx3VTGdlMZ201lbDeVsd1UxnZTGdtNZWw3lbHdVM52UznbTeVsN5Wz3VR+Q3ddZ7upnO2mcrabytluKme7qZztpnK2m8rZbipnu6mc7aZytpvK2W4qZ7upnO2mcrabytluKme7qXxxN5U/cmy/5t/HH1y39ftl+1fikh47XbtBX7nTtXv5lTtdu+3/2E6jjHa69h3ClTtd+2biwp2OLS33y9+e7LFE2z9Z09dny6OyjyUql119eM902dWHtzRXXX1sCLns6sMbgsuuPuzXl1192CMvu/qwL1129WEvuOzqb/2ujtULl139rd/VsbjgqquPvQKXXf2t39XxVP5lV3/rd3U8037Z1d/6XR1PhF929bd+V8fz1Jdd/a3f1fE08mVXf+t3dTzLe9nV3/pdHU/CXnN1y69l327bH3fit/x13+5pdMPc/Z5l+8f+ddt+K480L+318jQv1bHL07xU9y5P81KdvDzNS3VVTNPr47/7Uh6meakOX51mPM/6sTQv1fnL07zUFy5PM7MWP08zsRZHjkeaOvyGj0c7P5ZmXr3ZPhyPD3/Xwr9PM6/enEgznuT7WJp59eZMmnn15kyaefXmTJp59eZMmnn15kyaefd+Z9LMu/c7k2apWjweCPtUmvF818fSLFWLx9NXH0uzVC0ez0Z9LM1StXg8ufSxNEvV4vFc0cfSrFSLD95I/7E0K9Xig/fFfyzNSrX44G3uH0uzUi0+eNf6x9KsVIsP3oT+sTRL1eLxLMjH0ixVi8eTGh9Ls1QtHs9RfCzNUrV4POXwsTRL1eLxDMLH0ixVi8cTAh9Ls1QtHj+//7E0S9Xi8XPwH0uzVC0eP0/+sTRL1eLxW5M/lmapWjx+p/HH0ixVi8dvHP5YmqVq8fh9wB9Ls1Qtfm0O5PI0S9Xi1+ZMLk+zVC1+bY7l8jRL1eLX5mQuT7NULX5tDufyNEvV4tfmfC5Ps1Qtfm2O6PI0S9Xi1+aULk+zVC1+bQ7q8jRL1eLX5qwuT7NULX5tjuvyNEvV4tfmxC5Ps1Qtfm0O7fI0S9Xi1+bcLk+zVC2eOFt2Js1StXjibNmZNEvV4omzZWfSLFWLJ86WnUmzVC2eOFt2Js1StXjibNmZNEvV4vFbAD+WZqlavNTc3cEr9z6VZqm5u4MX4n0szVK1eKm5u4O3z30szVK1eKm5u4NXvX0szVK1eKm5u4P3qn0szVK1eKm5u4OXmH0szVK1eKm5u4M3hn0szVK1eKm5u4PXc30ozcHbtj6WZqVafPAurI+lWakWH7yp6mNpVqrFB++R+lialWrxwVuePpZmqVq81NzdwSuVPpZmqVq81NzdwfuLPpZmqVq81NzdwcuCPpZmqVq81NzdwRtT3pSmfn34u1d9fJ9m5jf8eZqJv8W53F9Psf2jDdNM/C0+kWbib/HzNDMnlk6kmXhHcSLNvDuKnsq93vRU0+PDEY8w88rNiTATq4253z+8/df/b87p959Ot2j3a6d0+/7lNt+d68T7jzekn3i/8ob0EzvDG9JP7CRvSD+x8/yL9HuamRNRJ9JM/K/HE2km3lueSLNGtb+nWaN639OsUY3vaSZW1+2X9JHGfZhmYrU8kWZi9XueZuZE1Ik0E2vxiTQTa/GJNBNr8Yk0E2vxiTQTa/GJNBNr8Yk0S9XimRNRJ9IsVYtnTkSdSLNULZ45EXUizVK1eOZE1Ik0S9XimRNRJ9IsVYtnTkSdSLNULZ45EXUizVK1eOZE1Ik0S9XimRNRJ9IsVYtnTkSdSLNULZ45EfU8zcypn5Tvb4XMafz3r5lTPyfSTKw3J9JMrDcn0kysNyfSTKw3J9JMrDe/STN8MmLm1M+JNBPv/Z6nmTn1cyLNp2rxOM3MWty/noxIwz41c+rnRJqZ9eZ5mpn15nmamfXmeZqZ9eZZmjJzsuVEmqnPPj3qTW6jrllmTracSDOx3pxIM/He70Saifd+J9JMrMUn0kx9DvVpmqnPoT5NM/U51GdpZk62nEizVC2eOdlyIs1StXjmZMuJNEvV4pmTLU+fpi4zJ1tOpFlpJqDMnGx5nmbmG6VOpFlpJqDMfKPUiTRTa/HTNFNr8dM0U2vx0zRL1eKl5rPKUvNZZan5rLLUfFZZaj6rzHyj1Ik0S9XimRNaJ9IsVYtnTlCdSLNULZ454XQizVK1eOYbpU6kWaoWz5yfOpFmqVo8c37qRJqlavHMiaUTaZaqfuOpnHx7cJ/vHiIKe6wafhOfrhp+Y56uGv5mP101/A18umrYtY9X/fLLPwE4nlVo",
|
|
838
|
+
"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"
|
|
827
839
|
],
|
|
828
840
|
"fileMap": {
|
|
829
|
-
"
|
|
830
|
-
"source": "
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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 ) ->
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
|
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
|
-
"
|
|
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
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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:
|
|
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
|
-
"
|
|
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
|
|
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
|
-
"
|
|
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
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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 :
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
}
|