@aztec/protocol-contracts 4.0.0-devnet.1-patch.1 → 4.0.0-devnet.2-patch.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/artifacts/AuthRegistry.json +26 -26
- package/artifacts/ContractClassRegistry.json +52 -32
- package/artifacts/ContractInstanceRegistry.json +32 -32
- package/artifacts/FeeJuice.json +29 -29
- package/artifacts/MultiCallEntrypoint.json +29 -29
- package/artifacts/PublicChecks.json +19 -19
- package/dest/make_protocol_contract.js +2 -1
- package/dest/protocol_contract_data.js +13 -13
- package/dest/scripts/generate_data.js +7 -9
- package/package.json +4 -4
- package/src/make_protocol_contract.ts +1 -1
- package/src/protocol_contract_data.ts +13 -13
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"transpiled": true,
|
|
3
|
-
"noir_version": "1.0.0-beta.18+
|
|
3
|
+
"noir_version": "1.0.0-beta.18+2db78f8894936db05c53430f364360ac9cc5c61f",
|
|
4
4
|
"name": "AuthRegistry",
|
|
5
5
|
"functions": [
|
|
6
6
|
{
|
|
@@ -76,7 +76,7 @@
|
|
|
76
76
|
}
|
|
77
77
|
},
|
|
78
78
|
"bytecode": "JwACBAEoAAABBIBIJwAABEglAAAATicCBAQDJwIFBAAfCgAEAAUARRwAR0cBLQhFAS0IRgItCEcDJQAAAFknAgEESCcCAgQAOw4AAgABJwBDBAMnAEQAACYlAAABcR4CAAQBHgIABQAKKgQFBiQCAAYAAAB6JQAAAZcnAgQAAikCAAUA71JTTS0IAQYnAgcEBAAIAQcBJwMGBAEAIgYCBy0KBwgtDgUIACIIAggtDgQIACIIAggtDgEIJwIEBActCAAHLQoGCC0IQwkACAAEACUAAAGpLQIAAC0KCAEKIgFEBCcCBgEACioEBgckAgAHAAAA+SUAAAUiLQgBBCcCBwQEAAgBBwEnAwQEAQAiBAIHLQoHCC0OBQgAIggCCC0OAQgAIggCCC0OAggnAgIEBy0IAActCgQILQhDCQAIAAIAJQAAAaktAgAALQoIAQoiAUQCCioCBgQkAgAEAAABZSUAAAUiHAoDAgAwCgACAAEmKAAABAR4SAwAAAQDJAAAAwAAAZYqAQABBdrF9da0SjJtPAQCASYqAQABBcFQNKwlSLxRPAQCASYlAAABcRwKAgQAKwIABQAAAAAAAAAAAQAAAAAAAAAABCoEBQYtCAEEAAABAgEtCAEFJwIHBAUACAEHAScDBQQBACIFAgctCgcILQxECAAiCAIILQxECAAiCAIILQxECAAiCAIILQ4GCC0OBQQGIgJDBScCBgQAJwIHAQEnAggEAScCCQQCLQoGAyMAAAI3DCoDBQokAgAKAAADtyMAAAJJBiICQwUEIgVDCgIqAgoDCioDBgUWCgUKJAIABQAAA1EjAAACbgIqAgMFDioDAgskAgALAAAChSUAAAU0LQsECwAqCwgNLQsNDAwiBUMNJAIADQAAAqQlAAAFRgAiAQIOACoOBQ8tCw8NACoMDQ4tAgsDJwAEBAUlAAAFWC0IBQwAKgwIDS0ODg0tDgwEDCoIAwskAgALAAAC6CMAAANRACoMCQstCwsDACoFCAsOKgULDSQCAA0AAAMIJQAABbcMIgtDBSQCAAUAAAMaJQAABUYAIgECBwAqBwsNLQsNBQAqAwUBLQIMAycABAQFJQAABVgtCAUDACoDCQUtDgEFLQ4DBCMAAANRCioCBgESKgEKAiQCAAIAAANoIwAAA6UtCwQBLQsBAgAiAgICLQ4CAS0IAQInAgMEBQAIAQMBJwMCBAEAIgECAwAiAgIFPw8AAwAFLQ4CBCMAAAOlLQsEAQAqAQgDLQsDAi0KAgEmLQsECgAqCggMLQsMCwQiA0MMBiIMQw4KKg4DDSQCAA0AAAPgJQAABckMIgxDDSQCAA0AAAPyJQAABUYAIgECDgAqDgwPLQsPDQAqCw0OLQIKAycABAQFJQAABVgtCAULACoLCA0tDg4NACoLCQ0tCw0KACoMCA0OKgwNDiQCAA4AAARAJQAABbcMIg1DDiQCAA4AAARSJQAABUYAIgECDwAqDw0QLQsQDgAqCg4NLQILAycABAQFJQAABVgtCAUKACoKCQ4tDg0OACIKQw0tCw0LACoMCQ0OKgwNDiQCAA4AAASgJQAABbcMIg1DDCQCAAwAAASyJQAABUYAIgECDgAqDg0PLQsPDAAqCwwNLQIKAycABAQFJQAABVgtCAULACILQwwtDg0MLQsLCgAiCgIKLQ4KCy0IAQonAgwEBQAIAQwBJwMKBAEAIgsCDAAiCgINPw8ADAANLQ4KBAAqAwgKLQoKAyMAAAI3KgEAAQW6uyHXgjMYZDwEAgEmKgEAAQUbvGXQP9zq3DwEAgEmKgEAAQXkCFBFArWMHzwEAgEmLQEDBgoABgIHJAAABwAABW4jAAAFdy0AAwUjAAAFti0AAQUAAAEEAQAAAwQJLQADCi0ABQsKAAoJDCQAAAwAAAWxLQEKCC0ECAsAAAoCCgAACwILIwAABY0nAQUEASYqAQABBdAH6/TLxmeQPAQCASYqAQABBQUEG5kgr2BMPAQCASY=",
|
|
79
|
-
"debug_symbols": "
|
|
79
|
+
"debug_symbols": "rZnRTiM7DIbfZa57ETuJY/Mqq9WqC2VVqSqoC0c6Qrz7sTNxphxpRpByQ7/+bf44jieeDm/Tw+H3659fx/Pj09/p7sfb9PtyPJ2Of36dnu73L8ens6pvU7A/kqY73E0i013eTRD0LdmrzK9Q5lfE6Q7AoDSI1CAFh9wgu5JdIVcoOXCDEh3cmX0utimSgoBDdpAZMEQHbgCuWOwV0IaTATWIrkRXUnJQZ9TZMUcHbkCukCvFFQu+AoMDNZDgkB1sCg0sWrZn4AaADtTAgp/BlRgcbDgZSIPkSkYHDSwGBVIlxt2UbHhMBhpP1E1PmRqQzhXJIDco9uVikBykAbvCrogrwjPkgA6lAYADNcDgkB2aYY6a3sgKVBqwfUcULKszNIWCKikY5AZWtAkMSoPoihXtDPZlNNBJk+aHcnLgBrbvFQo4aPBJc0i23TO4YoGlbJDbl6U5l5AcXIHo0OYqNeYKZqhbUGxPUzGQBlaZiQ24AblSI6xADdgV26YKtk1JDGQGDslBDbOmjmtgxaA0qIFVcMUuohmoQc1qBTtONL1sycyaXi7oQA04OGQHG6U5ZIkOPIOE6OAKuAKuoM2lqRMrm5wNNNSsOZSEDbLGnIuBTarZEDuaZrDhYiANiivFFS4NBB2aAsHKbiZQSwqVshN2zcIkqCTz1BBqxDOxU+paKk52WTfSNBIa2UXbyGaLRnbZNuoax07sJK5pqJ3M2c5YsGu1UdfqOnKl3OYFW8dMdiI16pqtoxE72Tqo9hc7n2aq6yiVyKl0zbZgJjt3GnXNdqES2olDXKk4QdfqOqT2M2jzYl1HJTsZGy2aONl12Iid+jqwrwNtHaW2StuPmWw/GnWNu8Zdk66JRlqsXqKdayW8v+8m796/Xi6HgzXvq3auTf55fzmcX6a78+vptJv+2Z9e65f+Pu/P9fVlf9FP1fNwftBXNXw8ng5G77tldFgfqtVp11cdrkzULTJ88IB1j2jnTHWIlPr4gl+IoYQlBglrMcR1DwLmZkFaMIuDfHBI6w5Y3ABlcBXXmRRcW8Wmh7bO7pFTWfMoGx5orWq20PuT7sDpgwNvZII9hijcxyegDwaybiBgfbg6CJRlOyOXjzW1kQoK0bNJIS1lGT8fBCcPQo+G9SBw3YN1ZPNg7SHrHhuVGTP2bC77iZrZz26o3hn7hsZAaxsKeSOZPRUlwJrB5+uSVq9QuL0w4ebKhG8oTby5NOEbahO/oTbx5tqE24sTN4oz85LNZUOYBouTV4sTN9cRenFChLUwkLfi4Jh6HJzSWhPCjcrI4GFkvKrwGL8QRpGyhAGyFkaEzZwSdhNtrqsmGxUaqXg+YoE80lMl9J2VK4f/V+iWBS8FKihDFmK/M5pFLmMWBboF44gFBnILvQ9OQxYpeC4w4VgUKS4WV33gKxY59IVkpDGLHLpFhjGLlBYLHIyCukXhm6MYtegFrr9ThgocKWG3yGObStR3hMpgFLnngjjcvJAxC22f3o4icxq0WNpqGNrUKBG6Ba2nM280d32s570kcVwqHOTzUQj1KKSMLUSWWzYZK3DoTUBx7GIPkhaLsYsdoJeWPogYXAgtFrcvZNAClhMcUhmzyKVbkAxa9CZwfR8+upBRi/7UAEHGWhEum4rAgxZhsZBbFzJqsfw8Q+S4/ks1jB05P/Xd/v54+fAPq3fzuhz3v0+H9vbx9Xx/9enLv8/+if/D6/nydH94eL0czGn5r5f++YF6l6UP3H7ac1B9W2jHYG/APtNHnNqafr5bKP8B"
|
|
80
80
|
},
|
|
81
81
|
{
|
|
82
82
|
"name": "consume",
|
|
@@ -152,7 +152,7 @@
|
|
|
152
152
|
}
|
|
153
153
|
},
|
|
154
154
|
"bytecode": "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",
|
|
155
|
-
"debug_symbols": "
|
|
155
|
+
"debug_symbols": "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"
|
|
156
156
|
},
|
|
157
157
|
{
|
|
158
158
|
"name": "is_consumable",
|
|
@@ -225,7 +225,7 @@
|
|
|
225
225
|
}
|
|
226
226
|
},
|
|
227
227
|
"bytecode": "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",
|
|
228
|
-
"debug_symbols": "
|
|
228
|
+
"debug_symbols": "rZndTiM9DIbvpcccxE7ixNzKaoUKlFWlqqAufNInxL2vndgZOJgRSjlhnnGZd/yXeDp93z0e7t/+3B3PT89/d7e/3nf3l+PpdPxzd3p+2L8en89ifd8F/cNpdxtvdsy723Szg1D6EXB3y3os/YjUjzHYMfdjsvNk59nOc7Jj7UeKdjS9YvpFdAEFKjhkBzbg6FA7YIgOxQD08qRABugWdEtMDqosd8cUHapBdkt2C7lFXW9QwIEManDIDnILVMc0vx1qhxjQgQzU+Q5uweCglycFNohuSeggjsUgkMUS9SqSy6N+RNmgmCUluVfMCnKvSAIaVwOtSSwKZKBFiVUhG3BwMEsOwWFY2ACiQzVAdCgGERzIILlg0taUZOYSDVj+OQUF6kABHNQCAprMBig3TZINitHBLRp7g6z/HBXE+ST5IU1dh+TABqUYVIkiZYViwG5pjkkyS3MsKZhygeAwLKZcMDlUg6iCUoKiCypVheygV0k2SvOwgVuahwrNwwZu0XopVK1XDgrZANwCIphBgfu9KkaHahDdEouB9mEHMlBXs6S3ajKzpLeWaqCOdSADrWkHvSorcAcOycEt4BZwC7pFd6acFPQjKQHr6s5FoRpk8TmLh0x6U1YgA10gFBSyQXVLdYtuRB1qBwghOmnfGYkmgZLuQUbDpn4SNsr93kLspD1vNGy6JxlVJ5I8UmxUnHRfor6Jk1MdNt2ROumWZOS2tu930p2fcqPihMPW4iAlXbjtvm0WdNKla7TY2ElngpHmryjp7mqkd6tt5OCgYWs1aKQ7kJHb2jwwUuU2sHTzMRo2jaOERsXuiy2OTuSUhq3F0UgXolEa5HHgiKONiaL1bXPCiJzqsNVh42Fjt7UhUaCR2uDj42bnw/vu9XI46Oz+NM1lxr/sL4fz6+72/HY63ez+25/e2j/9fdmf2/F1f5FPJfrD+VGOIvh0PB2UPm6Wq8P6pZIhnRztcuFchkSGLxqwrsGEZBJM6ZMCf1HADS9CTe6EtO1QKDgbB6/FsamRdNMyjVTDmkbe1hgSnIdCTV8UaF1BHjxMIHId1yegLwJloxygo7KXA8oSRKzli0Rdl6AQPREUEi0S3/dhFJTlqW3VB9goR2V9WmoalYnXNTZaM2YcyVzaSp7bvl1PYPZ6yrJdqyfEjWSOVMgDxJrA99uS15fo9X0JVzcm/EBnwtWtCT/Qm/gDvYlX9yZc35y40Zy5LtlcClJprjkz0Fpz4kYcrE/FvSCy4684gbQ1PzD7CBIu6zOobIkEKEMkxLQqstWeUKsnFAOuSvDGOiuuIF8010bhViDMBZc4Ul1zIm42Z/KyyjBdd2O7KOlTUXg1GXFr8xwlobgIpBi/3aAcfNsChry6zrYk6rLMGHlKgpf+5FzmJAoMiYozEhjIJeQtS5qSSMFzgQnnvEhxkaAwJZHDCCQjzUnkMCQyzEmktEjgpBc0JEq92otZidHgSDDV4EgJh0SeKyrRqAiVSS/yyAXVcHUgcxLyEDD2zlrTpMTycBCmiho5wpCg9XRqxtY0krxiMo1UP+2/wN/3gml4wWUuEF4ePHmuwWEMAcG5xS6vWBaJucUOMFpL3mpMBkKLxPWBTErAsoNDKnMSuQwJ4kmJMQQ+f5uYDWRWYjzwIfDcKMKlqCI3KREWCb42kFmJ5UsmYo2rEgXmtpzfcrZ/OF6+/OT1oVqX4/7+dLDTp7fzw6dPX/9/8U/8J7OXy/PD4fHtclCl5Xcz+fMLZeOVt3e/9VWqnMqzeI16AvqZvCWVofD7Q135Bw=="
|
|
229
229
|
},
|
|
230
230
|
{
|
|
231
231
|
"name": "is_reject_all",
|
|
@@ -275,7 +275,7 @@
|
|
|
275
275
|
}
|
|
276
276
|
},
|
|
277
277
|
"bytecode": "JwACBAEoAAABBIBGJwAABEYlAAAARScCAgQBJwIDBAAfCgACAAMARC0IRAElAAAARi0CAUUnAgIERScCAwQBOw4AAwACJiUAAAFAHgIAAgknAgMBASQCAAIAAABiJQAAAWYpAgACAO9SU00nAgMAASsCAAQAAAAAAAAAAAMAAAAAAAAAAC0IAQUnAgYEBQAIAQYBJwMFBAEAIgUCBi0KBgctDgIHACIHAgctDgMHACIHAgctDgEHACIHAgctDgQHLQsFAQAiAQIBLQ4BBS0IAQEnAgIEBQAIAQIBJwMBBAEAIgUCAgAiAQIDPw8AAgADJwICBAEAKgECBC0LBAMnAgEAAAoqAwECJwIBAQAKKgIBBCQCAAQAAAEfJQAAAXgeAgABAC8qAAMAAQACHAoCAwEcCgMBABwKAQIBLQoCASYoAAAEBHhGDAAABAMkAAADAAABZSoBAAEF2sX11rRKMm08BAIBJioBAAEFoj+MFkXsKv88BAIBJioBAAEFursh14IzGGQ8BAIBJg==",
|
|
278
|
-
"debug_symbols": "
|
|
278
|
+
"debug_symbols": "nZZRjuMgDIbvwnMewBiDe5XRqErbdBQpSqtMu9Kqyt0XOjhpVgKN+lL+mPDFxsbloU7d4f6178fz5VvtPh7qMPXD0H/th8uxvfWXMVofSqcf79TONirEB4yDew5sf4agdsY0ymifhYEsrBUhUyhTKBYnFicWMiJcFl6LQBGcRZBPBHGDBcj0I0AbEQlok+AsDIoQC4gFxGLFgskNTMJl4cTi0juUBGdBYiGxeLEEEBFDBogi+QyRY3UEAiXhsjBPyzw3StKyv01dl7LykqeYvWs7deNN7cb7MDTqTzvcny99X9vxOd7aKc7qRnXjKY4ReO6HLqm5WVfr8lJjrIa8PGrABeHMhmHKDKYU1BPBhH4l8IYAFS90wMUJvRI8vBsHleKoMhD0wkA0JYarMGIdCQLYLYSAGwKVCRDEB8thWY+GNgBfSYdZNpMB1iBs8BtEKCMCg2xmYOIigssI62AJY00oxJA2VVVJB8TjnxHxJNN7jDUdAMGWGZXiRM/CwGBhYRj+tRuWeU3qS1b/d6NWWIZZCstqKhWWqSBcsJlAem0Vgd48H6SLvaJWneilOD2UnDCh1ivASbuJ2hf7jeEaRBu/QLTFYtOq7AetBUqgoYiotE7wS4kzltpeLRCOu7jGgaHohK0dVZTCsK7iRj0p+JIULm+Gq+2npIRejhlaO8+f8bE99tPmGjMn1NS3h6HLj+f7eHyZvf29yoxcg67T5did7lOXSOtdKP0hf5BpiD7TXSc+eN14+JzTp/8B"
|
|
279
279
|
},
|
|
280
280
|
{
|
|
281
281
|
"name": "public_dispatch",
|
|
@@ -351,7 +351,7 @@
|
|
|
351
351
|
}
|
|
352
352
|
},
|
|
353
353
|
"bytecode": "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",
|
|
354
|
-
"debug_symbols": "
|
|
354
|
+
"debug_symbols": "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"
|
|
355
355
|
},
|
|
356
356
|
{
|
|
357
357
|
"name": "set_authorized",
|
|
@@ -405,7 +405,7 @@
|
|
|
405
405
|
}
|
|
406
406
|
},
|
|
407
407
|
"bytecode": "JwACBAEoAAABBIBHJwAABEclAAAASicCAwQCJwIEBAAfCgADAAQARRwARkYBLQhFAS0IRgIlAAAAVScCAQRHJwICBAA7DgACAAEnAEMEAycARAAAJiUAAAFWHgIAAwEnAgQAAikCAAUA71JTTS0IAQYnAgcEBAAIAQcBJwMGBAEAIgYCBy0KBwgtDgUIACIIAggtDgQIACIIAggtDgMIJwIEBActCAAHLQoGCC0IQwkACAAEACUAAAF8LQIAAC0KCAMKIgNEBCcCBgEACioEBgckAgAHAAAA3iUAAAT1LQgBBCcCBwQEAAgBBwEnAwQEAQAiBAIHLQoHCC0OBQgAIggCCC0OAwgAIggCCC0OAQgnAgMEBy0IAActCgQILQhDCQAIAAMAJQAAAXwtAgAALQoIAQoiAUQDCioDBgQkAgAEAAABSiUAAAT1HAoCAwAwCgADAAEmKAAABAR4RwwAAAQDJAAAAwAAAXsqAQABBdrF9da0SjJtPAQCASYlAAABVhwKAgQAKwIABQAAAAAAAAAAAQAAAAAAAAAABCoEBQYtCAEEAAABAgEtCAEFJwIHBAUACAEHAScDBQQBACIFAgctCgcILQxECAAiCAIILQxECAAiCAIILQxECAAiCAIILQ4GCC0OBQQGIgJDBScCBgQAJwIHAQEnAggEAScCCQQCLQoGAyMAAAIKDCoDBQokAgAKAAADiiMAAAIcBiICQwUEIgVDCgIqAgoDCioDBgUWCgUKJAIABQAAAyQjAAACQQIqAgMFDioDAgskAgALAAACWCUAAAUHLQsECwAqCwgNLQsNDAwiBUMNJAIADQAAAnclAAAFGQAiAQIOACoOBQ8tCw8NACoMDQ4tAgsDJwAEBAUlAAAFKy0IBQwAKgwIDS0ODg0tDgwEDCoIAwskAgALAAACuyMAAAMkACoMCQstCwsDACoFCAsOKgULDSQCAA0AAALbJQAABYoMIgtDBSQCAAUAAALtJQAABRkAIgECBwAqBwsNLQsNBQAqAwUBLQIMAycABAQFJQAABSstCAUDACoDCQUtDgEFLQ4DBCMAAAMkCioCBgESKgEKAiQCAAIAAAM7IwAAA3gtCwQBLQsBAgAiAgICLQ4CAS0IAQInAgMEBQAIAQMBJwMCBAEAIgECAwAiAgIFPw8AAwAFLQ4CBCMAAAN4LQsEAQAqAQgDLQsDAi0KAgEmLQsECgAqCggMLQsMCwQiA0MMBiIMQw4KKg4DDSQCAA0AAAOzJQAABZwMIgxDDSQCAA0AAAPFJQAABRkAIgECDgAqDgwPLQsPDQAqCw0OLQIKAycABAQFJQAABSstCAULACoLCA0tDg4NACoLCQ0tCw0KACoMCA0OKgwNDiQCAA4AAAQTJQAABYoMIg1DDiQCAA4AAAQlJQAABRkAIgECDwAqDw0QLQsQDgAqCg4NLQILAycABAQFJQAABSstCAUKACoKCQ4tDg0OACIKQw0tCw0LACoMCQ0OKgwNDiQCAA4AAARzJQAABYoMIg1DDCQCAAwAAASFJQAABRkAIgECDgAqDg0PLQsPDAAqCwwNLQIKAycABAQFJQAABSstCAULACILQwwtDg0MLQsLCgAiCgIKLQ4KCy0IAQonAgwEBQAIAQwBJwMKBAEAIgsCDAAiCgINPw8ADAANLQ4KBAAqAwgKLQoKAyMAAAIKKgEAAQW6uyHXgjMYZDwEAgEmKgEAAQUbvGXQP9zq3DwEAgEmKgEAAQXkCFBFArWMHzwEAgEmLQEDBgoABgIHJAAABwAABUEjAAAFSi0AAwUjAAAFiS0AAQUAAAEEAQAAAwQJLQADCi0ABQsKAAoJDCQAAAwAAAWELQEKCC0ECAsAAAoCCgAACwILIwAABWAnAQUEASYqAQABBdAH6/TLxmeQPAQCASYqAQABBQUEG5kgr2BMPAQCASY=",
|
|
408
|
-
"debug_symbols": "
|
|
408
|
+
"debug_symbols": "rZnRbhs5DEX/xc9+ECmRkvorRVG4qVsYMJzATRZYFPn35dWImmSBMVK5L54z19YVRXGGY/v37vvx28vPr6fLj8dfu0+ff+++XU/n8+nn1/Pjw+H59Hgx9fcu4KXaK+93VXaf8n5HIfRjXY4U+7EsR+7n3M9jP495OSbqR12O0v2k+4v5UjDQ5FA6ZHbQDoUcXEG0C2A4A+oCHJKDK5Q7MJwzQDtEcnAluZJcQegLJIfaQaND6YDgOQByBwS/gDjUDgh+ga7EEB0w3GKOxA6usHSI2DIFQKkGmCJiOPITab9LRA62nGijEgcHfDgCaoeYHFxJriRXJDrkDsoO2iGTg09RgoMbFstYTPudYFMaJHxGANJBXEHVRFupaOiA9EZLuBR2cAUlDFDUcCwATFoBtQPKeYHSASXRACWRAkA7JFcQWLJkagsMHxZ3FndWV9Sds8/VYgagJJJtgWLfk2UjI8IFbFSybGREuIAriLBBi7CBK9imBWBoGcsIbAFXUKtJAaXPhVpdIHcoruBCa1DJQRYoLdQMgLOlt3Du0AJrIB2wpwvYKAmA0gGFtIAr6oq6kl3JmMtSV1A2YltQqoUqDMgL1GAxi0VYySaVBBAHGy6WhMrJwZXoSmKH3EFcQdUtAEPLYc3BYSgwtLRUVHibtIUKqNGhK3Z35UHZCZeqlEbqhItVaiNxikOLxSnFQUMTdVJz1tBInfLQsAQlEK7SZd62iIWqUx1aWweIcL/qZOtQ3IgJd6xOmC2CmAYNDZnvVJ3S0JD8TnBGhgh3mk5Da+uQRurzYh2dxKkODevoVDsx1tHJ18FjHdzW0bod9qOTOMWhxaGloaWhCSLVRtD09XW/8z789fl6PKINv2nM1q6fDtfj5Xn36fJyPu93/xzOL+1Dv54Ol3Z8PlztXdvF4+W7Hc3wx+l8BL3u19Fhe2iM6FptdLR+MgyE3jnQDQdclouBpjE+84cjsHY4IiDdiiBuOyDH3YG4ynAo6Z1D2nbg4imMtYzx1jLfGci2QSW0heZQKa9pjCW/s9BtCw1oi83C+tWah/jxGEryGJhpM4aybWE3Ve4WpWrdtKg3tlN4pDIPA7a0fnQ37ar03YxBt3aTbpSkjkTkQFsGHy3JmDYvivtrku4uSvoLVUl3lyX9hbqkv1CYdHdl0v2lyTdKU8qazXVDik6VpmyWJt9cRRilSZG2guAbpWlPBdH3FM8Kb+Ko701u1IWQhyH8pr5j/IMwcs1rGFQ3w8i3TER5mNj3gU2TG/UZNXs+YiaZaIP2fOKXO9U3Dv+vz1sWZS1Pe76dsqh4lu0WkucsMg2LwjMWHNQt7HEsTVmk4LngxHNRpLhaaJiykDAWIqxzFhKGhdCcRUqrBU9GocMil7ujmLUYBc5KUwXOmnhYyNymqo4d0TwZhYxcaAl3L2TOwpqnN6NYSpq0WJtqmNrUWCMNC91OZ7rR2pP9OtE9UolrhVP9eBRVRxQ1zy2krg9sda7AaTQBw7mL3b6mrxZzFzvRKC37Pjy5EF0t7l/IpAWtd3BKec5C8rDQOmkxmsDbp/DZhcxalDIs6lwr4nVTmcqkRVgt6r0LmbVYv5wxl7hpoTp3y/liZ4eH0/Xdvyyv8LqeDt/Ox3764+Xy8Obd53+f/B3/l+bp+vhw/P5yPcJp/avGXj7bXw97LvwFP8fZqT1zZcUJ4T2rWeuVX14Ryn8="
|
|
409
409
|
},
|
|
410
410
|
{
|
|
411
411
|
"name": "set_authorized_private",
|
|
@@ -1376,7 +1376,7 @@
|
|
|
1376
1376
|
}
|
|
1377
1377
|
},
|
|
1378
1378
|
{
|
|
1379
|
-
"name": "
|
|
1379
|
+
"name": "expiration_timestamp",
|
|
1380
1380
|
"type": {
|
|
1381
1381
|
"kind": "integer",
|
|
1382
1382
|
"sign": "unsigned",
|
|
@@ -1552,7 +1552,7 @@
|
|
|
1552
1552
|
}
|
|
1553
1553
|
},
|
|
1554
1554
|
{
|
|
1555
|
-
"name": "
|
|
1555
|
+
"name": "key_validation_requests_and_separators",
|
|
1556
1556
|
"type": {
|
|
1557
1557
|
"kind": "struct",
|
|
1558
1558
|
"path": "aztec::protocol_types::utils::arrays::claimed_length_array::ClaimedLengthArray",
|
|
@@ -1564,7 +1564,7 @@
|
|
|
1564
1564
|
"length": 16,
|
|
1565
1565
|
"type": {
|
|
1566
1566
|
"kind": "struct",
|
|
1567
|
-
"path": "aztec::protocol_types::abis::validation_requests::
|
|
1567
|
+
"path": "aztec::protocol_types::abis::validation_requests::key_validation_request_and_separator::KeyValidationRequestAndSeparator",
|
|
1568
1568
|
"fields": [
|
|
1569
1569
|
{
|
|
1570
1570
|
"name": "request",
|
|
@@ -1609,7 +1609,7 @@
|
|
|
1609
1609
|
}
|
|
1610
1610
|
},
|
|
1611
1611
|
{
|
|
1612
|
-
"name": "
|
|
1612
|
+
"name": "key_type_domain_separator",
|
|
1613
1613
|
"type": {
|
|
1614
1614
|
"kind": "field"
|
|
1615
1615
|
}
|
|
@@ -2091,7 +2091,7 @@
|
|
|
2091
2091
|
"name": "fields",
|
|
2092
2092
|
"type": {
|
|
2093
2093
|
"kind": "array",
|
|
2094
|
-
"length":
|
|
2094
|
+
"length": 16,
|
|
2095
2095
|
"type": {
|
|
2096
2096
|
"kind": "field"
|
|
2097
2097
|
}
|
|
@@ -2226,9 +2226,9 @@
|
|
|
2226
2226
|
}
|
|
2227
2227
|
}
|
|
2228
2228
|
},
|
|
2229
|
-
"bytecode": "H4sIAAAAAAAA/+
|
|
2230
|
-
"debug_symbols": "
|
|
2231
|
-
"verification_key": "
|
|
2229
|
+
"bytecode": "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",
|
|
2230
|
+
"debug_symbols": "tVpbbhs7DN2Lv/0hiqREZStFUbipWxgwnMBNClwU3fulPCPNOKlY1XJ/cuSZ8AxF8aHXz82X/efXb58Op69P3zcPH35uPp8Px+Ph26fj0+Pu5fB00qc/Ny7/Ado8gP+13UD+hXHz4LcbFAV95vMzj5sH0jZNwBOECeIEMkHaPESVdhPABEoiCjgBTaAs4BTDjDGjfhEvX1RJAOXzM+KMNCPPmKVBpaj0BPUH/6Yj4fIPqh780l/FCp9ezvt9frMyixrreXfen142D6fX43G7+bE7vl7+6fvz7nTBl91Z36rW+9MXRSX8ejjuc+vXdpF2bVGKPAsHH6t45F55jr7Iw0o+9soPqB6ofFqcLJ/GXnmROMsn51vy3JbHUEyHkao8UbgiCG0CT4XAh9gk6NNAsElgmCD5VExArmWCNNoDawwTzgQR4Qb3AQfFCcCtVPDY7UYxpVT9CBczMlwxABqeVHuRkG/RQcBL0QHUei0dDF8gcjBTEMHKH9H3ayE1ojy4phbRcAgIpSPerxJKuFYCxPBJECrW9H5xCpRrr4BkDYivPUkhNTm8YQ3kQoFp5VhJrhnAYHBYhkSb6TYOgGINBPZtDrRyfCphSoILB6R+NUIoLo4hwm1dWXMI38aRFpOuB/YdR/y35kjJVTWSNNWwgs0z1WBLvhVsaHkoUihaoKwopJ+CeRkTDC0Kqx+aeEo/2LX7YfhnwpIzUlgRXKcMJGNE2dURZY5NQ1iltFYyAl6lvls6sYqPt50w3DLW6IhxGQjy/RokqqXQt1Uw0iaFMpQaI0vSBOnXoRYhcGszXutAZpZwi0e23SHP/UYrCOF4BSEarSDE4xXE5OisIDSeMk01OitIN4dRQUyOzgrC8G/N0VlBrGDTECsrGACPrVBhw0UhujL5hSjxJorga94JK4O+pTAWQoAQak803TRLGY9PPfkOU0++w9QzDE89wx3ma+EOc60wPvUMd5hr/cHBUl0nol8tNd84WAimPeoCK7TWqrYWnmDRou3mwfBR0HVeJaG1o/8VSaxTR21HbAZcZ+DLetF6HXARTItgNQgvCT24v6AQqT1xsUmBw5kjkpU56sgmzanNqI9GSQiOSi4OjhdHx7/Qoi9/xTiev6KM5q+YxvOXydGZv2S80ttq9OUv28lj7HByM1ol1LQhIrdUeu/q1Nw7phaFmDlU6i4VuOYCQeK4k4uMO7mkUSdPbnx2b3J0zu6TH3ZyU43OeLU56iYohtV29LtCb7poXcJ6J83VYzJcVP2hbopHpFZlTIaLci1J6z0VgX4dBEp5ToLN6pwM9wSWmneAE6Rb9nYk1r0dWaWutxvCDqyqhlir2mqW0H9Mk5hrrAq1lbAqPC4Vnlb2fLst7e5QXMHxeOLRw4zRzAMujqcem6Qz94BLw8nHVqQz+/STGJsLNknnnAMA/7FJ7rBDrXL1gJS4GXgwumayDigd12SsMdHWwVrsMCz7JAyxmdIB7pFP/6CLj3XDhQmbS0Cwjh9SPfdVP5IbTu2TX86+0cGVWT/qr93j4Xx9QQPy/QaNdsiXGTLKjGlC7xS14/m+xAV9TgrTfQmc70ugn+5LXDDkMJtubVxQZkw5GU4XNy4IOQimqxs0392g+fJGToP59sYFQ74QMN3euKDMqHx5b4lcPmxWhBmVLxc3whmVL19lIM7nMYohH20oxnyuoSjZVIppQnYzQi7Rivl+iFMixtKgPDy5waURSiOWhuSGfobT3AiuNC4XT1TzkJnzQWXA0sjMPrvOj935sPt83OchyoP4enosI6Y/X/57Lm/KpZvn89Pj/svreZ9Hd3XzRv9+0Dj2kEd/un6jTzxvkT9up9d6zEOcX/sqoWteCvkRVom0xfROgt5/g+1vhCqhceD1G9kv/wc=",
|
|
2231
|
+
"verification_key": "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"
|
|
2232
2232
|
},
|
|
2233
2233
|
{
|
|
2234
2234
|
"name": "set_reject_all",
|
|
@@ -2259,7 +2259,7 @@
|
|
|
2259
2259
|
}
|
|
2260
2260
|
},
|
|
2261
2261
|
"bytecode": "JwACBAEoAAABBIBFJwAABEUlAAAARicCAgQBJwIDBAAfCgACAAMARBwAREQBLQhEASUAAABHJwIBBEUnAgIEADsOAAIAASYlAAABGh4CAAIBKQIAAwDvUlNNJwIEAAErAgAFAAAAAAAAAAADAAAAAAAAAAAtCAEGJwIHBAUACAEHAScDBgQBACIGAgctCgcILQ4DCAAiCAIILQ4ECAAiCAIILQ4CCAAiCAIILQ4FCC0LBgIAIgICAi0OAgYtCAECJwIDBAUACAEDAScDAgQBACIGAgMAIgICBD8PAAMABCcCAwQBACoCAwUtCwUEJwICAAAKKgQCAycCAgEACioDAgUkAgAFAAABDiUAAAFAHAoBAgAwCgACAAQmKAAABAR4RQwAAAQDJAAAAwAAAT8qAQABBdrF9da0SjJtPAQCASYqAQABBbq7IdeCMxhkPAQCASY=",
|
|
2262
|
-
"debug_symbols": "
|
|
2262
|
+
"debug_symbols": "nZXbjqMwDIbfJddcxM7RfZVRVdGWjpAQrZiy0qri3dcUh8NIQbNzw+8Y8uHYTvJS1+rcf57q9nb/UoePlzp3ddPUn6fmfimf9b1l70vp8RG8OmChIqgDFYr0JO4tAH5S1KLiNzI2MrYytlY0TuqMaJjUo6hwA4gKJ9CkUTiROQBsECYjTAZqTEbyQPJA8iD/HnA0ohgmecz4jWXDYjKSxyWPSx7vxAi8ToijwR6EYShUyujp2VXVmNBVijnxj7Kr2qc6tH3TFOpP2fTvj74eZfvWZ9nxW12oqr2yMvBWN9VoDcUyW+enWtAgsy2AnQEONgTIE4wlARi/zA/44wh0oDkCrXMRmDwB0DohAJKbCdFuCDZPwJhSaCjO8y34DcDlAcQ9JwRCrmxCmBg2CJ9HRJ4oiEiesoiwUwqH8zLCDEBe0hoQd/LAW0YICOR/hViKwfvGZBGw1xKBEsNGgzMD6KdRGKKloquSfo9ir6uAUl/ygeVzXQU7CBeNEPyqsaP/1dZYddX3zen2VqHnvQEGckHATmOCjiY1N9t2dUhs6wE7rekgheFwtcOM+Y8wAoUlDKBsGLQHcR5niIeYg+BOWYwPKR8mgNuceUcelZe621yVw8jq6vLcVDK89e1l9fb595HepKv20d0v1bXvqpG03LfAzw9nC0fH8YLlgdeFx+Mw/vof"
|
|
2263
2263
|
},
|
|
2264
2264
|
{
|
|
2265
2265
|
"name": "utility_is_consumable",
|
|
@@ -2326,8 +2326,8 @@
|
|
|
2326
2326
|
}
|
|
2327
2327
|
}
|
|
2328
2328
|
},
|
|
2329
|
-
"bytecode": "H4sIAAAAAAAA/+1cT2wcVxnf+f9v7TRJa7usHQepICEhVXUQ4oYSO2nW2CRyGk5IZZMdzIr1rtldR7HEgYUDF5B2nVQIcaJ2TFAJVCiVUIEDEvQCiwoSVK1yqdRTe+ilf6SeOlvvzHzz3nzvzZudkRPJOW32zft9b773/fm973trZaf/i1e2OrV6rbP9fK39/PVmo721UblWd+V+96VzrVq9XltfrNTrtws73f0rtcZ63b3V6+/8/XSB/U8qcB8piAFKfMD+EHFj01v8rV6Pj7hTkHp92RMer4EH8kL3zqL3386t7v5SreVe78jd35QbHXfdbe1ePbPAl0DOl4Tm/2iVnF8Qk7/a3RvuXX8ywLm75tYrndoNVxFDkmkEVQyh0P3dcC3VSqey2NzcDl5pGa4JgO+uNm/shF9I4fPEiOyPfGP0tlOjJ0Zfr0AQ6i0Ed3RlbE1K3b0rneZmP/
|
|
2330
|
-
"debug_symbols": "
|
|
2329
|
+
"bytecode": "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",
|
|
2330
|
+
"debug_symbols": "rZvdbhQ5EIXfZa658F+5bF5lhVCAsIoUBZSFlVaId18ft091T6S2hp6+ob6Q6c9u29Uu9yi/Ll8eP/38++PTy9dv/1ze//Xr8un16fn56e+Pz98+P/x4+vbS/vfXxeGfEC/v47tLSJf3uQW5vPe+xTyijlhGrEuMbkQ/YhgxjphGHL44fHH4InypxbrE5Eb0I4YR44hpRBkRvtbfpCOWEesSxY3YfKG1J2HEOGIaUUbMI+qIZcS6xOxGHL4MX+tHjiOmEWXEPKKOWEasS1T4Wv/UjxhGjCM2X0RsvqgtNl+sLeqIzZdaP7QusbgR/YhhxDhiGlFGzCPqiMNXhq8OXx2+Onx1+Orw1eGrw1eHrw5fHT7vHMETAiESEkEImaCEQqDZ0+xp9jR7mj3NnmZPs6fZ0+xpDjQHmgPNgeZAc6A50IzcSQlQCDBLA6TPAp4QCJGQCELIBCUUAs2J5kRzojnRnGhONCeaE82J5kSz0Cw0C81Cs9AsNAvNQrPQLDRnmjPNmeZMc6Y505xpzjRnmjPNSrPSrDQrzUqz0qw0K81Ks9JcaC4095TKAHym5axHEglWArJogda6BEAkJIIQMkEJhVAXCMimBTwhECIhEYQwzAEpI3joI0EkAfBhAQgBH8aOgARZAN1QQB2fQYIs4AmBEAk0I0GkADIB5goohGbOrgESpH8GCbJAIERCItCMBMnYpZAgCxQCzH2fcwRPCIRISAQhwIyhQ4JkjBgSZAGY+9bpCJ4QCJGQCM2s6BgSZIFmVrSFBFmgDkBeKNpCXigGE3mxQBMqhMiLBTJBCRBi4pAXHZAXC8CMoVOalWbkxQJCyAQlwIyJQ150QF4UzCDyYoFAiIREEEImNHPp9UYh1AHIpoIpQDb1tpBNC0RCIgghE2DGYCKbFoAZNQiyaQFPCIRISAQhoM8CUEIhwJxRHbmlrYi9aYFAiIREEEImKKEQYC6otxzBEwIhEhJBCDArQAcg0UoFNE91gECIhEQQQiYooSwPvRjH0y/2naiDJwRCJCSCDEBe1F44ookAUEJromIQkBcdsHFUzAUSZIFAiIREEEImKKEQ6gClWWlWmpVmJEjFdCMdOmDxV8w7Fv8CgYCrcINY/AvgKkwKlvoCdQCW+gLwYHaw1FsNBYpGyUiMshEqY4eRxIIfVAclLPlWgYH8uCK5YBSNkpEYZSM16m1EFPDd10v5YNR9AkpGYpSN1KgYVVLofUaRH7xRMOptKCix3X6aWSgbqVExqqR+rlmomwuomysoG6lRMaqkfprBMSf188xCwSgaJSMxykb9rITR7acaj9nq5xqPcRZv1C39cNQtGCvJRt2CEZJiVEnZGXmjYBSNklFvA+Ocs5Ea9TYwarmyB+qMvFEwikbJqLeBkdRshDYCRgObzqBKQuYN8kbBKBqhDRzgEvaeQdmot4FxLoXtlkqqzsgbBaNo1NvAzPS8XKi3gTnqeblQMaqDpOflQt4oGPX7EFAyEqPeRj/86mhXel4uVEneGXmjYBSNkpEY9TYKSI2KUSX1XF3IGwWj3oaCehv6+/e7C19NfPzx+viINxObdxXtDcb3h9fHlx+X9y8/n5/fXf59eP7ZP/TP94eXHn88vLbftjl+fPnSYhN+fXp+BP1+t17t9i9tXcMC75c3llUh/srh9x0F21I31Ch2fatmrwRh0gmHNF/64LLuKub3gQ103Ef1Ye8+0r4jBY5EewrZ9fn6etm/PmIv79dHXcdB88330CowTmXjTR/e3IPOxgHHMg7D2ouSrgxl3xAK+9D2ULu+7VdXgrovqD5xJmo7i5qi7f3XK2oyFNlFrqnsUl4dt3cC5erSiXZQ2+9EmK3rwGVZaq77jjhZExJsNDcLu43srRPqUQpxTeS9CfWTdZltKNT5PcHt6zKn3WfE/QvT370y/QlLM9y9NP0JazOcsDbD3WvT3784w2RxSllHc52QcvShWeLe4gyz+4gpmWMzmm+6ESaLs71+s6HQ4Pa2jzBZF+2tIzeQ9gYx7iniZDRUmGSqm9sI1wI/u41kW3GWzep29doRZvuoZUg7WqzrG7vqlWO2NjXT0U6RYd+RTnBMlmc77RXei6vbe6m3O4pwXlux7Q45br6XyRJta4r3Ilkm9zIZ05w8n6BtpcRdR5os0hCZsO1d4WoQ9werdC0Yc9HdVZrC/XtBmqxSqY63InWT9PEPDDmbYVM13m7Izqs9QX05ZLhlR5uP5W07Wir372ip3rujyWw7qWLHoSpHHWpHkVrCIUf72oKO4DQdc4isibbJ9z9z2M7YHOFoP7I5tNzfj6OOdW9rXxy4gw6xfuTi7u/HQUfLinWpu2Pj0d6qenNsMu6tI8/2eq1ie9tmX/L1D7pR17q+7t/KrO4pjitsu8G+qXvybI9Wewxvsv5t4TSrvIpaD3YFWWczWrMNw2YvaW9irx2zItSvdWz7gnmzO18XsrnOnsOcjepk16CzE1Lxdt7UXcO8mC5rMb15p/SmEtbJwszrrrgtl94M5jRNvW3uDQ8+Pl1Nq+Pg49NbsRN8OPjI8ZYgzXHCvRx1+FjNkfSgw8rp9n19Peqw7XVb/B2+l8OOUsxR8zFHWOc2+HLU4VZHvfteDjvWt0QhbM7ybx1F796S5hVxcmtFfKwqT9UMsleVT4tImxFfveyOxExR1lcSNdRDihvL4ROq4ROK4ZkiOUvW9v3pMcWa7ym7Qwpxfj365mOK24r6E2r6E0r6Eyr6qcIWeMj+0AK/9UwwVWSbkawHe3HbqeKEQ8X8TLG+YyrpoOKmY8kJpxI/+/7oxj1gfipZy/Gqx+7ktoPNCTXoCSXoCRXoCQXoCfXnCeXnCdXnCcXnCbXnCaXnCZXnCYXnCXXnCWWnDwfrzg/tp4fPT69Xf4ryG67Xp4dPz4/jx68/Xz5vfvvjv+/8Df+U5fvrt8+PX36+PsK0/j1L++cvaa8nJNUP+DOB9mNsL1ujRPzo8du2YYuUD7/Rmf8B"
|
|
2331
2331
|
}
|
|
2332
2332
|
],
|
|
2333
2333
|
"outputs": {
|
|
@@ -2642,7 +2642,7 @@
|
|
|
2642
2642
|
},
|
|
2643
2643
|
"230": {
|
|
2644
2644
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/aztec-nr/aztec/src/oracle/version.nr",
|
|
2645
|
-
"source": "/// The ORACLE_VERSION constant is used to check that the oracle interface is in sync between PXE and Aztec.nr. We need\n/// to version the oracle interface to ensure that developers get a reasonable error message if they use incompatible\n/// versions of Aztec.nr and PXE. The TypeScript counterpart is in `oracle_version.ts`.\n///\n/// @dev Whenever a contract function or Noir test is run, the `utilityAssertCompatibleOracleVersion` oracle is called\n/// and if the oracle version is incompatible an error is thrown.\npub global ORACLE_VERSION: Field =
|
|
2645
|
+
"source": "/// The ORACLE_VERSION constant is used to check that the oracle interface is in sync between PXE and Aztec.nr. We need\n/// to version the oracle interface to ensure that developers get a reasonable error message if they use incompatible\n/// versions of Aztec.nr and PXE. The TypeScript counterpart is in `oracle_version.ts`.\n///\n/// @dev Whenever a contract function or Noir test is run, the `utilityAssertCompatibleOracleVersion` oracle is called\n/// and if the oracle version is incompatible an error is thrown.\npub global ORACLE_VERSION: Field = 12;\n\n/// Asserts that the version of the oracle is compatible with the version expected by the contract.\npub fn assert_compatible_oracle_version() {\n // Safety: This oracle call returns nothing: we only call it to check Aztec.nr and Oracle interface versions are\n // compatible. It is therefore always safe to call.\n unsafe {\n assert_compatible_oracle_version_wrapper();\n }\n}\n\nunconstrained fn assert_compatible_oracle_version_wrapper() {\n assert_compatible_oracle_version_oracle(ORACLE_VERSION);\n}\n\n#[oracle(utilityAssertCompatibleOracleVersion)]\nunconstrained fn assert_compatible_oracle_version_oracle(version: Field) {}\n\nmod test {\n use super::{assert_compatible_oracle_version_oracle, ORACLE_VERSION};\n\n #[test]\n unconstrained fn compatible_oracle_version() {\n assert_compatible_oracle_version_oracle(ORACLE_VERSION);\n }\n\n #[test(should_fail_with = \"Incompatible oracle version. TXE is using version\")]\n unconstrained fn incompatible_oracle_version() {\n let arbitrary_incorrect_version = 318183437;\n assert_compatible_oracle_version_oracle(arbitrary_incorrect_version);\n }\n}\n"
|
|
2646
2646
|
},
|
|
2647
2647
|
"298": {
|
|
2648
2648
|
"path": "/home/aztec-dev/nargo/github.com/noir-lang/poseidon/v0.2.3/src/poseidon2.nr",
|
|
@@ -2656,9 +2656,9 @@
|
|
|
2656
2656
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/types/src/abis/block_header.nr",
|
|
2657
2657
|
"source": "use crate::{\n abis::{\n append_only_tree_snapshot::AppendOnlyTreeSnapshot, global_variables::GlobalVariables,\n state_reference::StateReference,\n },\n constants::{BLOCK_HEADER_LENGTH, DOM_SEP__BLOCK_HEADER_HASH, GENESIS_BLOCK_HEADER_HASH},\n hash::poseidon2_hash_with_separator,\n traits::{Deserialize, Empty, Hash, Serialize},\n};\nuse std::meta::derive;\n\n// docs:start:block-header\n#[derive(Deserialize, Eq, Serialize)]\npub struct BlockHeader {\n pub last_archive: AppendOnlyTreeSnapshot,\n pub state: StateReference,\n\n // The hash of the sponge blob for this block, which commits to the tx effects added in this block.\n // Note: it may also include tx effects from previous blocks within the same checkpoint.\n // When proving tx effects from this block only, we must refer to the `sponge_blob_hash` in the previous block\n // header to show that the effect was added after the previous block.\n // The previous block header can be validated using a membership proof of the last leaf in `last_archive`.\n pub sponge_blob_hash: Field,\n\n pub global_variables: GlobalVariables,\n pub total_fees: Field,\n pub total_mana_used: Field,\n}\n// docs:end:block-header\n\nimpl Empty for BlockHeader {\n fn empty() -> Self {\n Self {\n last_archive: AppendOnlyTreeSnapshot::empty(),\n state: StateReference::empty(),\n sponge_blob_hash: 0,\n global_variables: GlobalVariables::empty(),\n total_fees: 0,\n total_mana_used: 0,\n }\n }\n}\n\nimpl Hash for BlockHeader {\n fn hash(self) -> Field {\n poseidon2_hash_with_separator(self.serialize(), DOM_SEP__BLOCK_HEADER_HASH)\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let header = BlockHeader::empty();\n // We use the BLOCK_HEADER_LENGTH constant to ensure that there is a match\n // between the derived trait implementation and the constant.\n let serialized: [Field; BLOCK_HEADER_LENGTH] = header.serialize();\n let deserialized = BlockHeader::deserialize(serialized);\n assert(header.eq(deserialized));\n}\n\n#[test]\nfn hash_of_genesis_block_header() {\n let mut header = BlockHeader::empty();\n // The following values are taken from world_state.test.cpp > WorldStateTest.GetInitialTreeInfoForAllTrees.\n header.state.l1_to_l2_message_tree.root =\n 0x0d582c10ff8115413aa5b70564fdd2f3cefe1f33a1e43a47bc495081e91e73e5;\n header.state.partial.note_hash_tree.root =\n 0x2ac5dda169f6bb3b9ca09bbac34e14c94d1654597db740153a1288d859a8a30a;\n header.state.partial.nullifier_tree.root =\n 0x1ec3788cd1c32e54d889d67fe29e481114f9d4afe9b44b229aa29d8ad528dd31;\n header.state.partial.nullifier_tree.next_available_leaf_index = 128;\n header.state.partial.public_data_tree.root =\n 0x23c08a6b1297210c5e24c76b9a936250a1ce2721576c26ea797c7ec35f9e46a9;\n header.state.partial.public_data_tree.next_available_leaf_index = 128;\n\n let hash = header.hash();\n assert_eq(hash, GENESIS_BLOCK_HEADER_HASH);\n}\n\n#[test]\nfn hash_of_empty_block_header_match_typescript() {\n let header = BlockHeader::empty();\n let hash = header.hash();\n\n // Value from block_header.test.ts \"computes empty hash\" test\n let test_data_empty_hash = 0x0bdc537052dea0f80db9698585dff9f32063b86b6d4934ac17c30c81e8e416d3;\n assert_eq(hash, test_data_empty_hash);\n}\n"
|
|
2658
2658
|
},
|
|
2659
|
-
"
|
|
2659
|
+
"387": {
|
|
2660
2660
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/types/src/hash.nr",
|
|
2661
|
-
"source": "mod poseidon2_chunks;\n\nuse crate::{\n abis::{\n contract_class_function_leaf_preimage::ContractClassFunctionLeafPreimage,\n function_selector::FunctionSelector,\n note_hash::NoteHash,\n nullifier::Nullifier,\n private_log::{PrivateLog, PrivateLogData},\n transaction::tx_request::TxRequest,\n },\n address::{AztecAddress, EthAddress},\n constants::{\n CONTRACT_CLASS_LOG_SIZE_IN_FIELDS, DOM_SEP__NOTE_HASH_NONCE,\n DOM_SEP__PRIVATE_LOG_FIRST_FIELD, DOM_SEP__SILOED_NOTE_HASH, DOM_SEP__SILOED_NULLIFIER,\n DOM_SEP__UNIQUE_NOTE_HASH, FUNCTION_TREE_HEIGHT, NULL_MSG_SENDER_CONTRACT_ADDRESS,\n TWO_POW_64,\n },\n merkle_tree::root_from_sibling_path,\n messaging::l2_to_l1_message::L2ToL1Message,\n poseidon2::Poseidon2Sponge,\n side_effect::{Counted, Scoped},\n traits::{FromField, Hash, ToField},\n utils::field::{field_from_bytes, field_from_bytes_32_trunc},\n};\n\npub use poseidon2_chunks::poseidon2_absorb_in_chunks_existing_sponge;\nuse poseidon2_chunks::poseidon2_absorb_in_chunks;\nuse std::embedded_curve_ops::EmbeddedCurveScalar;\n\n// TODO: refactor these into their own files: sha256, poseidon2, some protocol-specific hash computations, some merkle computations.\n\npub fn sha256_to_field<let N: u32>(bytes_to_hash: [u8; N]) -> Field {\n let sha256_hashed = sha256::digest(bytes_to_hash);\n let hash_in_a_field = field_from_bytes_32_trunc(sha256_hashed);\n\n hash_in_a_field\n}\n\npub fn private_functions_root_from_siblings(\n selector: FunctionSelector,\n vk_hash: Field,\n function_leaf_index: Field,\n function_leaf_sibling_path: [Field; FUNCTION_TREE_HEIGHT],\n) -> Field {\n let function_leaf_preimage = ContractClassFunctionLeafPreimage { selector, vk_hash };\n let function_leaf = function_leaf_preimage.hash();\n root_from_sibling_path(\n function_leaf,\n function_leaf_index,\n function_leaf_sibling_path,\n )\n}\n\npub fn compute_note_hash_nonce(first_nullifier_in_tx: Field, note_index_in_tx: u32) -> Field {\n // Hashing the first nullifier with note index in tx is guaranteed to be unique (because all nullifiers are also\n // unique).\n poseidon2_hash_with_separator(\n [first_nullifier_in_tx, note_index_in_tx as Field],\n DOM_SEP__NOTE_HASH_NONCE,\n )\n}\n\npub fn compute_unique_note_hash(note_nonce: Field, siloed_note_hash: Field) -> Field {\n let inputs = [note_nonce, siloed_note_hash];\n poseidon2_hash_with_separator(inputs, DOM_SEP__UNIQUE_NOTE_HASH)\n}\n\npub fn compute_note_nonce_and_unique_note_hash(\n siloed_note_hash: Field,\n first_nullifier: Field,\n note_index_in_tx: u32,\n) -> Field {\n let note_nonce = compute_note_hash_nonce(first_nullifier, note_index_in_tx);\n compute_unique_note_hash(note_nonce, siloed_note_hash)\n}\n\npub fn compute_siloed_note_hash(contract_address: AztecAddress, note_hash: Field) -> Field {\n poseidon2_hash_with_separator(\n [contract_address.to_field(), note_hash],\n DOM_SEP__SILOED_NOTE_HASH,\n )\n}\n\n/// Computes unique, siloed note hashes from siloed note hashes.\n///\n/// The protocol injects uniqueness into every note_hash, so that every single note_hash in the\n/// tree is unique. This prevents faerie gold attacks, where a malicious sender could create\n/// two identical note_hashes for a recipient (meaning only one would be nullifiable in future).\n///\n/// Most privacy protocols will inject the note's leaf_index (its position in the Note Hashes Tree)\n/// into the note, but this requires the creator of a note to wait until their tx is included in\n/// a block to know the note's final note hash (the unique, siloed note hash), because inserting\n/// leaves into trees is the job of a block producer.\n///\n/// We took a different approach so that the creator of a note will know each note's unique, siloed\n/// note hash before broadcasting their tx to the network.\n/// (There was also a historical requirement relating to \"chained transactions\" -- a feature that\n/// Aztec Connect had to enable notes to be spent from distinct txs earlier in the same block,\n/// and hence before an archive block root had been established for that block -- but that feature\n/// was abandoned for the Aztec Network for having too many bad tradeoffs).\n///\n/// (\n/// Edit: it is no longer true that all final note_hashes will be known by the creator of a tx\n/// before they send it to the network. If a tx makes public function calls, then _revertible_\n/// note_hashes that are created in private will not be made unique in private by the Reset circuit,\n/// but will instead be made unique by the AVM, because the `note_index_in_tx` will not be known\n/// until the AVM has executed the public functions of the tx. (See an explanation in\n/// reset_output_composer.nr for why).\n/// For some such txs, the `note_index_in_tx` might still be predictable through simulation, but\n/// for txs whose public functions create a varying number of non-revertible notes (determined at\n/// runtime), the `note_index_in_tx` will not be deterministically derivable before submitting the\n/// tx to the network.\n/// )\n///\n/// We use the `first_nullifier` of a tx as a seed of uniqueness. We have a guarantee that there will\n/// always be at least one nullifier per tx, because the init circuit will create one if one isn't\n/// created naturally by any functions of the tx. (Search \"protocol_nullifier\").\n/// We combine the `first_nullifier` with the note's index (its position within this tx's new\n/// note_hashes array) (`note_index_in_tx`) to get a truly unique value to inject into a note, which\n/// we call a `note_nonce`.\npub fn compute_unique_siloed_note_hash(\n siloed_note_hash: Field,\n first_nullifier: Field,\n note_index_in_tx: u32,\n) -> Field {\n if siloed_note_hash == 0 {\n 0\n } else {\n compute_note_nonce_and_unique_note_hash(siloed_note_hash, first_nullifier, note_index_in_tx)\n }\n}\n\n/// Siloing in the context of Aztec refers to the process of hashing a note hash with a contract address (this way\n/// the note hash is scoped to a specific contract). This is used to prevent intermingling of notes between contracts.\npub fn silo_note_hash(note_hash: Scoped<Counted<NoteHash>>) -> Field {\n if note_hash.contract_address.is_zero() {\n 0\n } else {\n compute_siloed_note_hash(note_hash.contract_address, note_hash.innermost())\n }\n}\n\npub fn compute_siloed_nullifier(contract_address: AztecAddress, nullifier: Field) -> Field {\n poseidon2_hash_with_separator(\n [contract_address.to_field(), nullifier],\n DOM_SEP__SILOED_NULLIFIER,\n )\n}\n\npub fn silo_nullifier(nullifier: Scoped<Counted<Nullifier>>) -> Field {\n let value = nullifier.innermost().value;\n // Q: shouldn't we be checking whether the _whole_ scoped, counted, nullifier struct is empty?\n // A: We don't have to. The init and inner circuits add a contract address only to non-empty nullifiers.\n // So we know we should silo it if the contract address is not empty.\n if nullifier.contract_address.is_zero() {\n // Return `.value` instead of 0, because already-siloed nullifiers also have a zero\n // contract_address field, and we of course want to return that already-siloed nullifier\n // (we just don't want to silo it a second time).\n value\n } else {\n compute_siloed_nullifier(nullifier.contract_address, value)\n }\n}\n\npub fn create_protocol_nullifier(tx_request: TxRequest) -> Scoped<Counted<Nullifier>> {\n // The protocol nullifier is ascribed a special side-effect counter of 1. No other side-effect\n // can have counter 1 (see `validate_as_first_call` for that assertion).\n Nullifier { value: tx_request.hash(), note_hash: 0 }.count(1).scope(\n NULL_MSG_SENDER_CONTRACT_ADDRESS,\n )\n}\n\npub fn compute_siloed_private_log_first_field(\n contract_address: AztecAddress,\n field: Field,\n) -> Field {\n poseidon2_hash_with_separator(\n [contract_address.to_field(), field],\n DOM_SEP__PRIVATE_LOG_FIRST_FIELD,\n )\n}\n\npub fn silo_private_log(private_log: Scoped<Counted<PrivateLogData>>) -> PrivateLog {\n let log = private_log.innermost().log;\n if private_log.contract_address.is_zero() {\n log\n } else {\n let mut fields = log.fields;\n fields[0] = compute_siloed_private_log_first_field(private_log.contract_address, fields[0]);\n PrivateLog::new(fields, log.length)\n }\n}\n\npub fn compute_contract_class_log_hash(log: [Field; CONTRACT_CLASS_LOG_SIZE_IN_FIELDS]) -> Field {\n poseidon2_hash(log)\n}\n\npub fn compute_app_siloed_secret_key(\n master_secret_key: EmbeddedCurveScalar,\n app_address: AztecAddress,\n app_secret_key_domain_separator: Field,\n) -> Field {\n poseidon2_hash_with_separator(\n [master_secret_key.hi, master_secret_key.lo, app_address.to_field()],\n app_secret_key_domain_separator,\n )\n}\n\npub fn compute_l2_to_l1_hash(\n contract_address: AztecAddress,\n recipient: EthAddress,\n content: Field,\n rollup_version_id: Field,\n chain_id: Field,\n) -> Field {\n let contract_address_bytes: [u8; 32] = contract_address.to_field().to_be_bytes();\n let recipient_bytes: [u8; 20] = recipient.to_be_bytes();\n let content_bytes: [u8; 32] = content.to_be_bytes();\n let rollup_version_id_bytes: [u8; 32] = rollup_version_id.to_be_bytes();\n let chain_id_bytes: [u8; 32] = chain_id.to_be_bytes();\n\n let mut bytes: [u8; 148] = std::mem::zeroed();\n for i in 0..32 {\n bytes[i] = contract_address_bytes[i];\n bytes[i + 32] = rollup_version_id_bytes[i];\n // 64 - 84 are for recipient.\n bytes[i + 84] = chain_id_bytes[i];\n bytes[i + 116] = content_bytes[i];\n }\n\n for i in 0..20 {\n bytes[64 + i] = recipient_bytes[i];\n }\n\n sha256_to_field(bytes)\n}\n\npub fn silo_l2_to_l1_message(\n msg: Scoped<L2ToL1Message>,\n rollup_version_id: Field,\n chain_id: Field,\n) -> Field {\n if msg.contract_address.is_zero() {\n 0\n } else {\n compute_l2_to_l1_hash(\n msg.contract_address,\n msg.inner.recipient,\n msg.inner.content,\n rollup_version_id,\n chain_id,\n )\n }\n}\n\n// TODO: consider a variant that enables domain separation with a u32 (we seem to have standardised u32s for domain separators)\n/// Computes sha256 hash of 2 input fields.\n///\n/// @returns A truncated field (i.e., the first byte is always 0).\npub fn accumulate_sha256(v0: Field, v1: Field) -> Field {\n // Concatenate two fields into 32 x 2 = 64 bytes\n let v0_as_bytes: [u8; 32] = v0.to_be_bytes();\n let v1_as_bytes: [u8; 32] = v1.to_be_bytes();\n let hash_input_flattened = v0_as_bytes.concat(v1_as_bytes);\n\n sha256_to_field(hash_input_flattened)\n}\n\npub fn poseidon2_hash<let N: u32>(inputs: [Field; N]) -> Field {\n poseidon::poseidon2::Poseidon2::hash(inputs, N)\n}\n\n#[no_predicates]\npub fn poseidon2_hash_with_separator<let N: u32, T>(inputs: [Field; N], separator: T) -> Field\nwhere\n T: ToField,\n{\n let inputs_with_separator = [separator.to_field()].concat(inputs);\n poseidon2_hash(inputs_with_separator)\n}\n\n/// Computes a Poseidon2 hash over a dynamic-length subarray of the given input.\n/// Only the first `in_len` fields of `input` are absorbed; any remaining fields are ignored.\n/// The caller is responsible for ensuring that the input is padded with zeros if required.\n#[no_predicates]\npub fn poseidon2_hash_subarray<let N: u32>(input: [Field; N], in_len: u32) -> Field {\n let mut sponge = poseidon2_absorb_in_chunks(input, in_len);\n sponge.squeeze()\n}\n\n// NB the below is the same as poseidon::poseidon2::Poseidon2::hash(), but replacing a range check with a bit check,\n// and absorbing in chunks of 3 below.\n#[no_predicates]\npub fn poseidon2_cheaper_variable_hash<let N: u32>(input: [Field; N], in_len: u32) -> Field {\n let mut sponge = poseidon2_absorb_in_chunks(input, in_len);\n sponge.squeeze()\n}\n\n// This function is unconstrained because it is intended to be used in unconstrained context only as\n// in constrained contexts it would be too inefficient.\npub unconstrained fn poseidon2_hash_with_separator_bounded_vec<let N: u32, T>(\n inputs: BoundedVec<Field, N>,\n separator: T,\n) -> Field\nwhere\n T: ToField,\n{\n let in_len = inputs.len() + 1;\n let iv: Field = (in_len as Field) * TWO_POW_64;\n let mut sponge = Poseidon2Sponge::new(iv);\n sponge.absorb(separator.to_field());\n\n for i in 0..inputs.len() {\n sponge.absorb(inputs.get(i));\n }\n\n sponge.squeeze()\n}\n\n#[no_predicates]\npub fn poseidon2_hash_bytes<let N: u32>(inputs: [u8; N]) -> Field {\n let mut fields = [0; (N + 30) / 31];\n let mut field_index = 0;\n let mut current_field = [0; 31];\n for i in 0..inputs.len() {\n let index = i % 31;\n current_field[index] = inputs[i];\n if index == 30 {\n fields[field_index] = field_from_bytes(current_field, false);\n current_field = [0; 31];\n field_index += 1;\n }\n }\n if field_index != fields.len() {\n fields[field_index] = field_from_bytes(current_field, false);\n }\n poseidon2_hash(fields)\n}\n\n#[test]\nfn poseidon_chunks_matches_fixed() {\n let in_len = 501;\n let mut input: [Field; 4096] = [0; 4096];\n let mut fixed_input = [3; 501];\n assert(in_len == fixed_input.len()); // sanity check\n for i in 0..in_len {\n input[i] = 3;\n }\n let sub_chunk_hash = poseidon2_hash_subarray(input, in_len);\n let fixed_len_hash = poseidon::poseidon2::Poseidon2::hash(fixed_input, fixed_input.len());\n assert(sub_chunk_hash == fixed_len_hash);\n}\n\n#[test]\nfn poseidon_chunks_matches_variable() {\n let in_len = 501;\n let mut input: [Field; 4096] = [0; 4096];\n for i in 0..in_len {\n input[i] = 3;\n }\n let variable_chunk_hash = poseidon2_cheaper_variable_hash(input, in_len);\n let variable_len_hash = poseidon::poseidon2::Poseidon2::hash(input, in_len);\n assert(variable_chunk_hash == variable_len_hash);\n}\n\n#[test]\nfn smoke_sha256_to_field() {\n let full_buffer = [\n 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,\n 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,\n 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,\n 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93,\n 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,\n 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130,\n 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148,\n 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,\n ];\n let result = sha256_to_field(full_buffer);\n\n assert(result == 0x448ebbc9e1a31220a2f3830c18eef61b9bd070e5084b7fa2a359fe729184c7);\n\n // to show correctness of the current ver (truncate one byte) vs old ver (mod full bytes):\n let result_bytes = sha256::digest(full_buffer);\n let truncated_field = crate::utils::field::field_from_bytes_32_trunc(result_bytes);\n assert(truncated_field == result);\n let mod_res = result + (result_bytes[31] as Field);\n assert(mod_res == 0x448ebbc9e1a31220a2f3830c18eef61b9bd070e5084b7fa2a359fe729184e0);\n}\n\n#[test]\nfn compute_l2_l1_hash() {\n // All zeroes\n let hash_result =\n compute_l2_to_l1_hash(AztecAddress::from_field(0), EthAddress::zero(), 0, 0, 0);\n assert(hash_result == 0x3b18c58c739716e76429634a61375c45b3b5cd470c22ab6d3e14cee23dd992);\n\n // Non-zero case\n let hash_result = compute_l2_to_l1_hash(\n AztecAddress::from_field(1),\n EthAddress::from_field(3),\n 5,\n 2,\n 4,\n );\n assert(hash_result == 0xaab2a5828156782b12a1dc6f336e2bc627eb1b9514b02d511f66296990c050);\n}\n\n#[test]\nfn silo_l2_to_l1_message_matches_typescript() {\n let version = 4;\n let chainId = 5;\n\n let hash = silo_l2_to_l1_message(\n L2ToL1Message { recipient: EthAddress::from_field(1), content: 2 }.scope(\n AztecAddress::from_field(3),\n ),\n version,\n chainId,\n );\n\n // The following value was generated by `yarn-project/stdlib/src/hash/hash.test.ts`\n let l2_to_l1_message_hash_from_ts =\n 0x0081edf209e087ad31b3fd24263698723d57190bd1d6e9fe056fc0c0a68ee661;\n\n assert_eq(hash, l2_to_l1_message_hash_from_ts);\n}\n\n#[test]\nunconstrained fn poseidon2_hash_with_separator_bounded_vec_matches_non_bounded_vec_version() {\n let inputs = BoundedVec::<Field, 4>::from_array([1, 2, 3]);\n let separator = 42;\n\n // Hash using bounded vec version\n let bounded_result = poseidon2_hash_with_separator_bounded_vec(inputs, separator);\n\n // Hash using regular version\n let regular_result = poseidon2_hash_with_separator([1, 2, 3], separator);\n\n // Results should match\n assert_eq(bounded_result, regular_result);\n}\n"
|
|
2661
|
+
"source": "mod poseidon2_chunks;\n\nuse crate::{\n abis::{\n contract_class_function_leaf_preimage::ContractClassFunctionLeafPreimage,\n function_selector::FunctionSelector, nullifier::Nullifier, private_log::PrivateLog,\n transaction::tx_request::TxRequest,\n },\n address::{AztecAddress, EthAddress},\n constants::{\n CONTRACT_CLASS_LOG_SIZE_IN_FIELDS, DOM_SEP__NOTE_HASH_NONCE,\n DOM_SEP__PRIVATE_LOG_FIRST_FIELD, DOM_SEP__SILOED_NOTE_HASH, DOM_SEP__SILOED_NULLIFIER,\n DOM_SEP__UNIQUE_NOTE_HASH, FUNCTION_TREE_HEIGHT, NULL_MSG_SENDER_CONTRACT_ADDRESS,\n TWO_POW_64,\n },\n merkle_tree::root_from_sibling_path,\n messaging::l2_to_l1_message::L2ToL1Message,\n poseidon2::Poseidon2Sponge,\n side_effect::{Counted, Scoped},\n traits::{FromField, Hash, ToField},\n utils::field::{field_from_bytes, field_from_bytes_32_trunc},\n};\n\npub use poseidon2_chunks::poseidon2_absorb_in_chunks_existing_sponge;\nuse poseidon2_chunks::poseidon2_absorb_in_chunks;\nuse std::embedded_curve_ops::EmbeddedCurveScalar;\n\n// TODO: refactor these into their own files: sha256, poseidon2, some protocol-specific hash computations, some merkle computations.\n\npub fn sha256_to_field<let N: u32>(bytes_to_hash: [u8; N]) -> Field {\n let sha256_hashed = sha256::digest(bytes_to_hash);\n let hash_in_a_field = field_from_bytes_32_trunc(sha256_hashed);\n\n hash_in_a_field\n}\n\npub fn private_functions_root_from_siblings(\n selector: FunctionSelector,\n vk_hash: Field,\n function_leaf_index: Field,\n function_leaf_sibling_path: [Field; FUNCTION_TREE_HEIGHT],\n) -> Field {\n let function_leaf_preimage = ContractClassFunctionLeafPreimage { selector, vk_hash };\n let function_leaf = function_leaf_preimage.hash();\n root_from_sibling_path(\n function_leaf,\n function_leaf_index,\n function_leaf_sibling_path,\n )\n}\n\n/// Siloing in the context of Aztec refers to the process of hashing a note hash with a contract address (this way\n/// the note hash is scoped to a specific contract). This is used to prevent intermingling of notes between contracts.\npub fn compute_siloed_note_hash(contract_address: AztecAddress, note_hash: Field) -> Field {\n poseidon2_hash_with_separator(\n [contract_address.to_field(), note_hash],\n DOM_SEP__SILOED_NOTE_HASH,\n )\n}\n\n/// Computes unique, siloed note hashes from siloed note hashes.\n///\n/// The protocol injects uniqueness into every note_hash, so that every single note_hash in the\n/// tree is unique. This prevents faerie gold attacks, where a malicious sender could create\n/// two identical note_hashes for a recipient (meaning only one would be nullifiable in future).\n///\n/// Most privacy protocols will inject the note's leaf_index (its position in the Note Hashes Tree)\n/// into the note, but this requires the creator of a note to wait until their tx is included in\n/// a block to know the note's final note hash (the unique, siloed note hash), because inserting\n/// leaves into trees is the job of a block producer.\n///\n/// We took a different approach so that the creator of a note will know each note's unique, siloed\n/// note hash before broadcasting their tx to the network.\n/// (There was also a historical requirement relating to \"chained transactions\" -- a feature that\n/// Aztec Connect had to enable notes to be spent from distinct txs earlier in the same block,\n/// and hence before an archive block root had been established for that block -- but that feature\n/// was abandoned for the Aztec Network for having too many bad tradeoffs).\n///\n/// (\n/// Edit: it is no longer true that all final note_hashes will be known by the creator of a tx\n/// before they send it to the network. If a tx makes public function calls, then _revertible_\n/// note_hashes that are created in private will not be made unique in private by the Reset circuit,\n/// but will instead be made unique by the AVM, because the `note_index_in_tx` will not be known\n/// until the AVM has executed the public functions of the tx. (See an explanation in\n/// reset_output_composer.nr for why).\n/// For some such txs, the `note_index_in_tx` might still be predictable through simulation, but\n/// for txs whose public functions create a varying number of non-revertible notes (determined at\n/// runtime), the `note_index_in_tx` will not be deterministically derivable before submitting the\n/// tx to the network.\n/// )\n///\n/// We use the `first_nullifier` of a tx as a seed of uniqueness. We have a guarantee that there will\n/// always be at least one nullifier per tx, because the init circuit will create one if one isn't\n/// created naturally by any functions of the tx. (Search \"protocol_nullifier\").\n/// We combine the `first_nullifier` with the note's index (its position within this tx's new\n/// note_hashes array) (`note_index_in_tx`) to get a truly unique value to inject into a note, which\n/// we call a `note_nonce`.\npub fn compute_unique_note_hash(note_nonce: Field, siloed_note_hash: Field) -> Field {\n let inputs = [note_nonce, siloed_note_hash];\n poseidon2_hash_with_separator(inputs, DOM_SEP__UNIQUE_NOTE_HASH)\n}\n\npub fn compute_note_hash_nonce(first_nullifier_in_tx: Field, note_index_in_tx: u32) -> Field {\n // Hashing the first nullifier with note index in tx is guaranteed to be unique (because all nullifiers are also\n // unique).\n poseidon2_hash_with_separator(\n [first_nullifier_in_tx, note_index_in_tx as Field],\n DOM_SEP__NOTE_HASH_NONCE,\n )\n}\n\npub fn compute_note_nonce_and_unique_note_hash(\n siloed_note_hash: Field,\n first_nullifier: Field,\n note_index_in_tx: u32,\n) -> Field {\n let note_nonce = compute_note_hash_nonce(first_nullifier, note_index_in_tx);\n compute_unique_note_hash(note_nonce, siloed_note_hash)\n}\n\npub fn compute_siloed_nullifier(contract_address: AztecAddress, nullifier: Field) -> Field {\n poseidon2_hash_with_separator(\n [contract_address.to_field(), nullifier],\n DOM_SEP__SILOED_NULLIFIER,\n )\n}\n\npub fn create_protocol_nullifier(tx_request: TxRequest) -> Scoped<Counted<Nullifier>> {\n // The protocol nullifier is ascribed a special side-effect counter of 1. No other side-effect\n // can have counter 1 (see `validate_as_first_call` for that assertion).\n Nullifier { value: tx_request.hash(), note_hash: 0 }.count(1).scope(\n NULL_MSG_SENDER_CONTRACT_ADDRESS,\n )\n}\n\npub fn compute_siloed_private_log_first_field(\n contract_address: AztecAddress,\n field: Field,\n) -> Field {\n poseidon2_hash_with_separator(\n [contract_address.to_field(), field],\n DOM_SEP__PRIVATE_LOG_FIRST_FIELD,\n )\n}\n\npub fn compute_siloed_private_log(contract_address: AztecAddress, log: PrivateLog) -> PrivateLog {\n let mut fields = log.fields;\n fields[0] = compute_siloed_private_log_first_field(contract_address, fields[0]);\n PrivateLog::new(fields, log.length)\n}\n\npub fn compute_contract_class_log_hash(log: [Field; CONTRACT_CLASS_LOG_SIZE_IN_FIELDS]) -> Field {\n poseidon2_hash(log)\n}\n\npub fn compute_app_siloed_secret_key(\n master_secret_key: EmbeddedCurveScalar,\n app_address: AztecAddress,\n key_type_domain_separator: Field,\n) -> Field {\n poseidon2_hash_with_separator(\n [master_secret_key.hi, master_secret_key.lo, app_address.to_field()],\n key_type_domain_separator,\n )\n}\n\npub fn compute_l2_to_l1_message_hash(\n message: Scoped<L2ToL1Message>,\n rollup_version_id: Field,\n chain_id: Field,\n) -> Field {\n let contract_address_bytes: [u8; 32] = message.contract_address.to_field().to_be_bytes();\n let recipient_bytes: [u8; 20] = message.inner.recipient.to_be_bytes();\n let content_bytes: [u8; 32] = message.inner.content.to_be_bytes();\n let rollup_version_id_bytes: [u8; 32] = rollup_version_id.to_be_bytes();\n let chain_id_bytes: [u8; 32] = chain_id.to_be_bytes();\n\n let mut bytes: [u8; 148] = std::mem::zeroed();\n for i in 0..32 {\n bytes[i] = contract_address_bytes[i];\n bytes[i + 32] = rollup_version_id_bytes[i];\n // 64 - 84 are for recipient.\n bytes[i + 84] = chain_id_bytes[i];\n bytes[i + 116] = content_bytes[i];\n }\n\n for i in 0..20 {\n bytes[64 + i] = recipient_bytes[i];\n }\n\n sha256_to_field(bytes)\n}\n\n// TODO: consider a variant that enables domain separation with a u32 (we seem to have standardised u32s for domain separators)\n/// Computes sha256 hash of 2 input fields.\n///\n/// @returns A truncated field (i.e., the first byte is always 0).\npub fn accumulate_sha256(v0: Field, v1: Field) -> Field {\n // Concatenate two fields into 32 x 2 = 64 bytes\n let v0_as_bytes: [u8; 32] = v0.to_be_bytes();\n let v1_as_bytes: [u8; 32] = v1.to_be_bytes();\n let hash_input_flattened = v0_as_bytes.concat(v1_as_bytes);\n\n sha256_to_field(hash_input_flattened)\n}\n\npub fn poseidon2_hash<let N: u32>(inputs: [Field; N]) -> Field {\n poseidon::poseidon2::Poseidon2::hash(inputs, N)\n}\n\n#[no_predicates]\npub fn poseidon2_hash_with_separator<let N: u32, T>(inputs: [Field; N], separator: T) -> Field\nwhere\n T: ToField,\n{\n let inputs_with_separator = [separator.to_field()].concat(inputs);\n poseidon2_hash(inputs_with_separator)\n}\n\n/// Computes a Poseidon2 hash over a dynamic-length subarray of the given input.\n/// Only the first `in_len` fields of `input` are absorbed; any remaining fields are ignored.\n/// The caller is responsible for ensuring that the input is padded with zeros if required.\n#[no_predicates]\npub fn poseidon2_hash_subarray<let N: u32>(input: [Field; N], in_len: u32) -> Field {\n let mut sponge = poseidon2_absorb_in_chunks(input, in_len);\n sponge.squeeze()\n}\n\n// This function is unconstrained because it is intended to be used in unconstrained context only as\n// in constrained contexts it would be too inefficient.\npub unconstrained fn poseidon2_hash_with_separator_bounded_vec<let N: u32, T>(\n inputs: BoundedVec<Field, N>,\n separator: T,\n) -> Field\nwhere\n T: ToField,\n{\n let in_len = inputs.len() + 1;\n let iv: Field = (in_len as Field) * TWO_POW_64;\n let mut sponge = Poseidon2Sponge::new(iv);\n sponge.absorb(separator.to_field());\n\n for i in 0..inputs.len() {\n sponge.absorb(inputs.get(i));\n }\n\n sponge.squeeze()\n}\n\n#[no_predicates]\npub fn poseidon2_hash_bytes<let N: u32>(inputs: [u8; N]) -> Field {\n let mut fields = [0; (N + 30) / 31];\n let mut field_index = 0;\n let mut current_field = [0; 31];\n for i in 0..inputs.len() {\n let index = i % 31;\n current_field[index] = inputs[i];\n if index == 30 {\n fields[field_index] = field_from_bytes(current_field, false);\n current_field = [0; 31];\n field_index += 1;\n }\n }\n if field_index != fields.len() {\n fields[field_index] = field_from_bytes(current_field, false);\n }\n poseidon2_hash(fields)\n}\n\n#[test]\nfn subarray_hash_matches_fixed() {\n let mut values_to_hash = [3; 17];\n let mut padded = values_to_hash.concat([0; 11]);\n let subarray_hash = poseidon2_hash_subarray(padded, values_to_hash.len());\n\n // Hash the entire values_to_hash.\n let fixed_len_hash = poseidon::poseidon2::Poseidon2::hash(values_to_hash, values_to_hash.len());\n\n assert_eq(subarray_hash, fixed_len_hash);\n}\n\n#[test]\nfn subarray_hash_matches_variable() {\n let mut values_to_hash = [3; 17];\n let mut padded = values_to_hash.concat([0; 11]);\n let subarray_hash = poseidon2_hash_subarray(padded, values_to_hash.len());\n\n // Hash up to values_to_hash.len() fields of the padded array.\n let variable_len_hash = poseidon::poseidon2::Poseidon2::hash(padded, values_to_hash.len());\n\n assert_eq(subarray_hash, variable_len_hash);\n}\n\n#[test]\nfn smoke_sha256_to_field() {\n let full_buffer = [\n 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,\n 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,\n 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,\n 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93,\n 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,\n 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130,\n 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148,\n 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,\n ];\n let result = sha256_to_field(full_buffer);\n\n assert(result == 0x448ebbc9e1a31220a2f3830c18eef61b9bd070e5084b7fa2a359fe729184c7);\n\n // to show correctness of the current ver (truncate one byte) vs old ver (mod full bytes):\n let result_bytes = sha256::digest(full_buffer);\n let truncated_field = crate::utils::field::field_from_bytes_32_trunc(result_bytes);\n assert(truncated_field == result);\n let mod_res = result + (result_bytes[31] as Field);\n assert(mod_res == 0x448ebbc9e1a31220a2f3830c18eef61b9bd070e5084b7fa2a359fe729184e0);\n}\n\n#[test]\nfn unique_siloed_note_hash_matches_typescript() {\n let inner_note_hash = 1;\n let contract_address = AztecAddress::from_field(2);\n let first_nullifier = 3;\n let note_index_in_tx = 4;\n\n let siloed_note_hash = compute_siloed_note_hash(contract_address, inner_note_hash);\n let siloed_note_hash_from_ts =\n 0x1986a4bea3eddb1fff917d629a13e10f63f514f401bdd61838c6b475db949169;\n assert_eq(siloed_note_hash, siloed_note_hash_from_ts);\n\n let nonce: Field = compute_note_hash_nonce(first_nullifier, note_index_in_tx);\n let note_hash_nonce_from_ts =\n 0x28e7799791bf066a57bb51fdd0fbcaf3f0926414314c7db515ea343f44f5d58b;\n assert_eq(nonce, note_hash_nonce_from_ts);\n\n let unique_siloed_note_hash_from_nonce = compute_unique_note_hash(nonce, siloed_note_hash);\n let unique_siloed_note_hash = compute_note_nonce_and_unique_note_hash(\n siloed_note_hash,\n first_nullifier,\n note_index_in_tx,\n );\n assert_eq(unique_siloed_note_hash_from_nonce, unique_siloed_note_hash);\n\n let unique_siloed_note_hash_from_ts =\n 0x29949aef207b715303b24639737c17fbfeb375c1d965ecfa85c7e4f0febb7d16;\n assert_eq(unique_siloed_note_hash, unique_siloed_note_hash_from_ts);\n}\n\n#[test]\nfn siloed_nullifier_matches_typescript() {\n let contract_address = AztecAddress::from_field(123);\n let nullifier = 456;\n\n let res = compute_siloed_nullifier(contract_address, nullifier);\n\n let siloed_nullifier_from_ts =\n 0x169b50336c1f29afdb8a03d955a81e485f5ac7d5f0b8065673d1e407e5877813;\n\n assert_eq(res, siloed_nullifier_from_ts);\n}\n\n#[test]\nfn siloed_private_log_first_field_matches_typescript() {\n let contract_address = AztecAddress::from_field(123);\n let field = 456;\n let res = compute_siloed_private_log_first_field(contract_address, field);\n\n let siloed_private_log_first_field_from_ts =\n 0x29480984f7b9257fded523d50addbcfc8d1d33adcf2db73ef3390a8fd5cdffaa;\n\n assert_eq(res, siloed_private_log_first_field_from_ts);\n}\n\n#[test]\nfn empty_l2_to_l1_message_hash_matches_typescript() {\n // All zeroes\n let res = compute_l2_to_l1_message_hash(\n L2ToL1Message { recipient: EthAddress::zero(), content: 0 }.scope(AztecAddress::from_field(\n 0,\n )),\n 0,\n 0,\n );\n\n let empty_l2_to_l1_msg_hash_from_ts =\n 0x003b18c58c739716e76429634a61375c45b3b5cd470c22ab6d3e14cee23dd992;\n\n assert_eq(res, empty_l2_to_l1_msg_hash_from_ts);\n}\n\n#[test]\nfn l2_to_l1_message_hash_matches_typescript() {\n let message = L2ToL1Message { recipient: EthAddress::from_field(1), content: 2 }.scope(\n AztecAddress::from_field(3),\n );\n let version = 4;\n let chainId = 5;\n\n let hash = compute_l2_to_l1_message_hash(message, version, chainId);\n\n // The following value was generated by `yarn-project/stdlib/src/hash/hash.test.ts`\n let l2_to_l1_message_hash_from_ts =\n 0x0081edf209e087ad31b3fd24263698723d57190bd1d6e9fe056fc0c0a68ee661;\n\n assert_eq(hash, l2_to_l1_message_hash_from_ts);\n}\n\n#[test]\nunconstrained fn poseidon2_hash_with_separator_bounded_vec_matches_non_bounded_vec_version() {\n let inputs = BoundedVec::<Field, 4>::from_array([1, 2, 3]);\n let separator = 42;\n\n // Hash using bounded vec version\n let bounded_result = poseidon2_hash_with_separator_bounded_vec(inputs, separator);\n\n // Hash using regular version\n let regular_result = poseidon2_hash_with_separator([1, 2, 3], separator);\n\n // Results should match\n assert_eq(bounded_result, regular_result);\n}\n"
|
|
2662
2662
|
},
|
|
2663
2663
|
"416": {
|
|
2664
2664
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/types/src/storage/map.nr",
|
|
@@ -2698,15 +2698,15 @@
|
|
|
2698
2698
|
},
|
|
2699
2699
|
"51": {
|
|
2700
2700
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/noir-contracts/contracts/protocol/auth_registry_contract/src/main.nr",
|
|
2701
|
-
"source": "/**\n * @title AuthRegistry Contract\n * @notice Manages authorization of public actions through authentication witnesses (authwits)\n * @dev This contract allows users to approve/reject public actions that can be performed on their behalf by other\n * addresses\n */\npub contract AuthRegistry {\n use aztec::{\n authwit::auth::{\n assert_current_call_valid_authwit, compute_authwit_message_hash, IS_VALID_SELECTOR,\n },\n context::{PrivateContext, PublicContext, UtilityContext},\n hash::{hash_args, hash_calldata_array},\n oracle::{avm, execution_cache, version::assert_compatible_oracle_version},\n protocol::{\n abis::function_selector::FunctionSelector,\n address::AztecAddress,\n traits::{Deserialize, FromField, Serialize, ToField},\n utils::reader::Reader,\n },\n state_vars::{Map, PublicMutable, StateVariable},\n };\n\n struct Storage<Context> {\n /// Map of addresses that have rejected all actions\n reject_all: Map<AztecAddress, PublicMutable<bool, Context>, Context>,\n /// Nested map of approvers to their authorized message hashes\n /// First key is the approver address, second key is the message hash, value is authorization status\n approved_actions: Map<AztecAddress, Map<Field, PublicMutable<bool, Context>, Context>, Context>,\n }\n\n /**\n * Updates the `authorized` value for `msg_sender` for `message_hash`.\n *\n * @param message_hash The message hash being authorized\n * @param authorize True if the caller is authorized to perform the message hash, false otherwise\n */\n #[aztec::macros::internals_functions_generation::abi_attributes::abi_public]\n unconstrained fn set_authorized(message_hash: Field, authorize: bool) {\n // MACRO CODE START\n let context: PublicContext = PublicContext::new(\n || -> Field {\n let serialized_args: [Field; 2] =\n avm::calldata_copy(1, <Field as Serialize>::N + <bool as Serialize>::N);\n hash_args(serialized_args)\n },\n );\n let storage: Storage<PublicContext> = Storage::init(context);\n // MACRO CODE END\n\n storage.approved_actions.at(avm::sender()).at(message_hash).write(authorize);\n }\n\n /**\n * Updates the `reject_all` value for `msg_sender`.\n *\n * When `reject_all` is `true` any `consume` on `msg_sender` will revert.\n *\n * @param reject True if all actions should be rejected, false otherwise\n */\n #[aztec::macros::internals_functions_generation::abi_attributes::abi_public]\n unconstrained fn set_reject_all(reject: bool) {\n // MACRO CODE START\n let context: PublicContext = PublicContext::new(\n || -> Field {\n let serialized_args: [Field; 1] = avm::calldata_copy(1, <bool as Serialize>::N);\n hash_args(serialized_args)\n },\n );\n let storage: Storage<PublicContext> = Storage::init(context);\n // MACRO CODE END\n\n storage.reject_all.at(avm::sender()).write(reject);\n }\n\n /**\n * Consumes an `inner_hash` on behalf of `on_behalf_of` if the caller is authorized to do so.\n *\n * Will revert even if the caller is authorized if `reject_all` is set to true for `on_behalf_of`.\n * This is to support \"mass-revoke\".\n *\n * @param on_behalf_of The address on whose behalf the action is being consumed\n * @param inner_hash The inner_hash of the authwit\n * @return `IS_VALID_SELECTOR` if the action was consumed, revert otherwise\n */\n #[aztec::macros::internals_functions_generation::abi_attributes::abi_public]\n unconstrained fn consume(on_behalf_of: AztecAddress, inner_hash: Field) -> pub Field {\n // MACRO CODE START\n let context: PublicContext = PublicContext::new(\n || -> Field {\n let serialized_args: [Field; 2] =\n avm::calldata_copy(1, <AztecAddress as Serialize>::N + <Field as Serialize>::N);\n hash_args(serialized_args)\n },\n );\n let storage: Storage<PublicContext> = Storage::init(context);\n // MACRO CODE END\n\n assert_eq(false, storage.reject_all.at(on_behalf_of).read(), \"rejecting all\");\n\n let message_hash = compute_authwit_message_hash(\n context.maybe_msg_sender().unwrap(),\n context.chain_id(),\n context.version(),\n inner_hash,\n );\n\n let authorized = storage.approved_actions.at(on_behalf_of).at(message_hash).read();\n\n assert_eq(true, authorized, \"unauthorized\");\n storage.approved_actions.at(on_behalf_of).at(message_hash).write(false);\n\n IS_VALID_SELECTOR\n }\n\n /**\n * Updates a public authwit using a private authwit\n *\n * Useful for the case where you want someone else to insert a public authwit for you.\n * For example, if Alice wants Bob to insert an authwit in public, such that they can execute\n * a trade, Alice can create a private authwit, and Bob can call this function with it.\n *\n * @param approver The address of the approver (Alice in the example)\n * @param message_hash The message hash to authorize\n * @param authorize True if the message hash should be authorized, false otherwise\n */\n #[aztec::macros::internals_functions_generation::abi_attributes::abi_private]\n fn set_authorized_private(\n inputs: aztec::context::inputs::PrivateContextInputs,\n approver: AztecAddress,\n message_hash: Field,\n authorize: bool,\n ) -> return_data aztec::protocol::abis::private_circuit_public_inputs::PrivateCircuitPublicInputs {\n // MACRO CODE START\n // Note: The macros initially inserted a phase check here, but since there is no phase change in this function\n // body or in the subsequent enqueued public function call, I have removed that check.\n assert_compatible_oracle_version();\n\n let serialized_params: [Field; 3] =\n [approver.to_field(), message_hash, authorize.to_field()];\n let args_hash: Field = hash_args(serialized_params);\n let mut context: PrivateContext = PrivateContext::new(inputs, args_hash);\n\n // MACRO CODE END\n\n // 3 corresponds to the number of arguments of the function\n assert_current_call_valid_authwit::<3>(&mut context, approver);\n\n // Enqueue call to _set_authorized\n // Note: This was originally just `self.enqueue_self._set_authorized(approver, message_hash, authorize);`\n // before de-macroification.\n {\n let enqueue_params: [Field; 3] =\n [approver.to_field(), message_hash, authorize.to_field()];\n let selector: FunctionSelector = FunctionSelector::from_field(_SET_AUTHORIZED_SELECTOR);\n let calldata: [Field; 4] = [selector.to_field()].concat(enqueue_params);\n let calldata_hash: Field = hash_calldata_array(calldata);\n execution_cache::store(calldata, calldata_hash);\n context.call_public_function_with_calldata_hash(\n context.this_address(),\n calldata_hash,\n false,\n false,\n );\n }\n\n // MACRO CODE START\n context.finish()\n // MACRO CODE END\n }\n\n /**\n * Internal function to update the `authorized` value for `approver` for `messageHash`.\n * Used along with `set_authorized_private` to update the public authwit.\n *\n * @param approver The address of the approver\n * @param message_hash The message hash being authorized\n * @param authorize True if the caller is authorized to perform the message hash, false otherwise\n */\n #[aztec::macros::internals_functions_generation::abi_attributes::abi_public]\n #[aztec::macros::internals_functions_generation::abi_attributes::abi_only_self]\n unconstrained fn _set_authorized(approver: AztecAddress, message_hash: Field, authorize: bool) {\n // MACRO CODE START\n let context: PublicContext = PublicContext::new(\n || -> Field {\n let serialized_args: [Field; 3] = avm::calldata_copy(\n 1,\n (<AztecAddress as Serialize>::N + <Field as Serialize>::N)\n + <bool as Serialize>::N,\n );\n hash_args(serialized_args)\n },\n );\n let storage: Storage<PublicContext> = Storage::init(context);\n\n // Originally injected by the #[only_self] macro\n assert(\n avm::sender() == context.this_address(),\n \"Function _set_authorized can only be called by the same contract\",\n );\n // MACRO CODE END\n\n storage.approved_actions.at(approver).at(message_hash).write(authorize);\n }\n\n /**\n * Fetches the `reject_all` value for `on_behalf_of`.\n *\n * @param on_behalf_of The address to check\n * @return True if all actions are rejected, false otherwise\n */\n #[aztec::macros::internals_functions_generation::abi_attributes::abi_public]\n #[aztec::macros::internals_functions_generation::abi_attributes::abi_view]\n unconstrained fn is_reject_all(on_behalf_of: AztecAddress) -> pub bool {\n // MACRO CODE START\n let context: PublicContext = PublicContext::new(\n || -> Field {\n let serialized_args: [Field; 1] =\n avm::calldata_copy(1, <AztecAddress as Serialize>::N);\n hash_args(serialized_args)\n },\n );\n let storage: Storage<PublicContext> = Storage::init(context);\n\n // Originally injected by the #[view] macro\n assert(context.is_static_call(), \"Function is_reject_all can only be called statically\");\n // MACRO CODE END\n\n storage.reject_all.at(on_behalf_of).read()\n }\n\n /**\n * Fetches the `authorized` value for `on_behalf_of` for `message_hash`.\n *\n * @param on_behalf_of The address on whose behalf the action is being consumed\n * @param message_hash The message hash to check\n * @return True if the caller is authorized to perform the action, false otherwise\n */\n #[aztec::macros::internals_functions_generation::abi_attributes::abi_public]\n #[aztec::macros::internals_functions_generation::abi_attributes::abi_view]\n unconstrained fn is_consumable(on_behalf_of: AztecAddress, message_hash: Field) -> pub bool {\n // MACRO CODE START\n let context: PublicContext = PublicContext::new(\n || -> Field {\n let serialized_args: [Field; 2] =\n avm::calldata_copy(1, <AztecAddress as Serialize>::N + <Field as Serialize>::N);\n hash_args(serialized_args)\n },\n );\n let storage: Storage<PublicContext> = Storage::init(context);\n\n // Originally injected by the #[view] macro\n assert(context.is_static_call(), \"Function is_consumable can only be called statically\");\n // MACRO CODE END\n\n storage.approved_actions.at(on_behalf_of).at(message_hash).read()\n }\n\n /**\n * Just like `is_consumable`, but a utility function and not public.\n */\n #[aztec::macros::internals_functions_generation::abi_attributes::abi_utility]\n unconstrained fn utility_is_consumable(\n on_behalf_of: AztecAddress,\n message_hash: Field,\n ) -> pub bool {\n // MACRO CODE START\n assert_compatible_oracle_version();\n\n let context: UtilityContext = UtilityContext::new();\n let storage: Storage<UtilityContext> = Storage::init(context);\n // MACRO CODE END\n\n storage.approved_actions.at(on_behalf_of).at(message_hash).read()\n }\n\n // // THE REST OF THE CODE IN THIS CONTRACT WAS ORIGINALLY INJECTED BY THE #[aztec] MACRO.\n\n // Function selectors computed at comptime from function signatures\n global SET_AUTHORIZED_SELECTOR: Field =\n comptime { FunctionSelector::from_signature(\"set_authorized(Field,bool)\").to_field() };\n global SET_REJECT_ALL_SELECTOR: Field =\n comptime { FunctionSelector::from_signature(\"set_reject_all(bool)\").to_field() };\n global CONSUME_SELECTOR: Field =\n comptime { FunctionSelector::from_signature(\"consume((Field),Field)\").to_field() };\n global _SET_AUTHORIZED_SELECTOR: Field = comptime {\n FunctionSelector::from_signature(\"_set_authorized((Field),Field,bool)\").to_field()\n };\n global IS_REJECT_ALL_SELECTOR: Field =\n comptime { FunctionSelector::from_signature(\"is_reject_all((Field))\").to_field() };\n global IS_CONSUMABLE_SELECTOR: Field =\n comptime { FunctionSelector::from_signature(\"is_consumable((Field),Field)\").to_field() };\n\n #[aztec::macros::internals_functions_generation::abi_attributes::abi_public]\n pub unconstrained fn public_dispatch(selector: Field) {\n if selector == SET_AUTHORIZED_SELECTOR {\n let input_calldata: [Field; 2] =\n avm::calldata_copy(1, <Field as Serialize>::N + <bool as Serialize>::N);\n let mut reader: Reader<2> = Reader::new(input_calldata);\n let arg0: Field = <Field as Deserialize>::stream_deserialize(&mut reader);\n let arg1: bool = <bool as Deserialize>::stream_deserialize(&mut reader);\n set_authorized(arg0, arg1);\n avm::avm_return([].as_vector());\n };\n if selector == SET_REJECT_ALL_SELECTOR {\n let input_calldata: [Field; 1] = avm::calldata_copy(1, <bool as Serialize>::N);\n let mut reader: Reader<1> = Reader::new(input_calldata);\n let arg0: bool = <bool as Deserialize>::stream_deserialize(&mut reader);\n set_reject_all(arg0);\n avm::avm_return([].as_vector());\n };\n if selector == CONSUME_SELECTOR {\n let input_calldata: [Field; 2] =\n avm::calldata_copy(1, <AztecAddress as Serialize>::N + <Field as Serialize>::N);\n let mut reader: Reader<2> = Reader::new(input_calldata);\n let arg0: AztecAddress = <AztecAddress as Deserialize>::stream_deserialize(&mut reader);\n let arg1: Field = <Field as Deserialize>::stream_deserialize(&mut reader);\n let return_value: [Field; 1] = <Field as Serialize>::serialize(consume(arg0, arg1));\n avm::avm_return(return_value.as_vector());\n };\n if selector == _SET_AUTHORIZED_SELECTOR {\n let input_calldata: [Field; 3] = avm::calldata_copy(\n 1,\n (<AztecAddress as Serialize>::N + <Field as Serialize>::N) + <bool as Serialize>::N,\n );\n let mut reader: Reader<3> = Reader::new(input_calldata);\n let arg0: AztecAddress = <AztecAddress as Deserialize>::stream_deserialize(&mut reader);\n let arg1: Field = <Field as Deserialize>::stream_deserialize(&mut reader);\n let arg2: bool = <bool as Deserialize>::stream_deserialize(&mut reader);\n _set_authorized(arg0, arg1, arg2);\n avm::avm_return([].as_vector());\n };\n if selector == IS_REJECT_ALL_SELECTOR {\n let input_calldata: [Field; 1] = avm::calldata_copy(1, <AztecAddress as Serialize>::N);\n let mut reader: Reader<1> = Reader::new(input_calldata);\n let arg0: AztecAddress = <AztecAddress as Deserialize>::stream_deserialize(&mut reader);\n let return_value: [Field; 1] = <bool as Serialize>::serialize(is_reject_all(arg0));\n avm::avm_return(return_value.as_vector());\n };\n if selector == IS_CONSUMABLE_SELECTOR {\n let input_calldata: [Field; 2] =\n avm::calldata_copy(1, <AztecAddress as Serialize>::N + <Field as Serialize>::N);\n let mut reader: Reader<2> = Reader::new(input_calldata);\n let arg0: AztecAddress = <AztecAddress as Deserialize>::stream_deserialize(&mut reader);\n let arg1: Field = <Field as Deserialize>::stream_deserialize(&mut reader);\n let return_value: [Field; 1] =\n <bool as Serialize>::serialize(is_consumable(arg0, arg1));\n avm::avm_return(return_value.as_vector());\n };\n panic(f\"Unknown selector {selector}\")\n }\n\n impl<Context> Storage<Context> {\n fn init(context: Context) -> Self {\n Self {\n reject_all: <Map<AztecAddress, PublicMutable<bool, Context>, Context> as StateVariable<1, Context>>::new(\n context,\n 1,\n ),\n approved_actions: <Map<AztecAddress, Map<Field, PublicMutable<bool, Context>, Context>, Context> as StateVariable<1, Context>>::new(\n context,\n 2,\n ),\n }\n }\n }\n\n // Parameter structs for ABI\n pub struct _set_authorized_parameters {\n pub _approver: AztecAddress,\n pub _message_hash: Field,\n pub _authorize: bool,\n }\n\n pub struct consume_parameters {\n pub _on_behalf_of: AztecAddress,\n pub _inner_hash: Field,\n }\n\n pub struct is_consumable_parameters {\n pub _on_behalf_of: AztecAddress,\n pub _message_hash: Field,\n }\n\n pub struct is_reject_all_parameters {\n pub _on_behalf_of: AztecAddress,\n }\n\n pub struct set_authorized_parameters {\n pub _message_hash: Field,\n pub _authorize: bool,\n }\n\n pub struct set_authorized_private_parameters {\n pub _approver: AztecAddress,\n pub _message_hash: Field,\n pub _authorize: bool,\n }\n\n pub struct set_reject_all_parameters {\n pub _reject: bool,\n }\n\n pub struct utility_is_consumable_parameters {\n pub _on_behalf_of: AztecAddress,\n pub _message_hash: Field,\n }\n\n // ABI structs\n #[abi(functions)]\n pub struct _set_authorized_abi {\n parameters: _set_authorized_parameters,\n }\n\n #[abi(functions)]\n pub struct consume_abi {\n parameters: consume_parameters,\n return_type: Field,\n }\n\n #[abi(functions)]\n pub struct is_consumable_abi {\n parameters: is_consumable_parameters,\n return_type: bool,\n }\n\n #[abi(functions)]\n pub struct is_reject_all_abi {\n parameters: is_reject_all_parameters,\n return_type: bool,\n }\n\n #[abi(functions)]\n pub struct set_authorized_abi {\n parameters: set_authorized_parameters,\n }\n\n #[abi(functions)]\n pub struct set_authorized_private_abi {\n parameters: set_authorized_private_parameters,\n }\n\n #[abi(functions)]\n pub struct set_reject_all_abi {\n parameters: set_reject_all_parameters,\n }\n\n #[abi(functions)]\n pub struct utility_is_consumable_abi {\n parameters: utility_is_consumable_parameters,\n return_type: bool,\n }\n}\n"
|
|
2701
|
+
"source": "/// A contract that manages public authentication witnesses (authwits) on the Aztec network.\n///\n/// In Aztec, private authwits are verified by account contracts directly (via oracles on the user's device). Public\n/// authwits, however, require this onchain registry because local oracles cannot be used for global execution. Users pre-approve\n/// actions by storing `message_hash -> true` mappings via `set_authorized`, and consumer contracts verify and\n/// atomically revoke these approvals via `consume`.\n///\n/// The `message_hash` includes the consumer address, chain ID, and protocol version, preventing cross-chain and\n/// cross-contract replay. Each approval can only be consumed once. Users can also enable `reject_all` as an emergency\n/// kill switch to invalidate all outstanding approvals at once.\n///\n/// A private-to-public bridge is provided via `set_authorized_private`: a user signs a private authwit, and any party\n/// holding it can call this function to insert the corresponding public approval.\n///\n/// Note that there is no expiration time enforced on the approved actions in this contract as this can be achieved by\n/// including an expiration timestamp in the `message` (`message_hash` preimage) and having the consumer contract\n/// constrain that value.\npub contract AuthRegistry {\n use aztec::{\n authwit::auth::{\n assert_current_call_valid_authwit, compute_authwit_message_hash, IS_VALID_SELECTOR,\n },\n context::{PrivateContext, PublicContext, UtilityContext},\n hash::{hash_args, hash_calldata_array},\n oracle::{avm, execution_cache, version::assert_compatible_oracle_version},\n protocol::{\n abis::function_selector::FunctionSelector,\n address::AztecAddress,\n traits::{Deserialize, FromField, Serialize, ToField},\n utils::reader::Reader,\n },\n state_vars::{Map, PublicMutable, StateVariable},\n };\n\n struct Storage<Context> {\n /// Per-address flag that, when true, causes all `consume` calls for that address to revert. Provides an\n /// emergency \"mass revocation\" mechanism. Does not delete existing approvals - if later set back to false,\n /// unconsumed approvals become consumable again.\n reject_all: Map<AztecAddress, PublicMutable<bool, Context>, Context>,\n /// Per-user, per-message authorization status. `approved_actions[user][message_hash]` is set to true by\n /// `set_authorized` and atomically revoked by `consume` to prevent replay.\n approved_actions: Map<AztecAddress, Map<Field, PublicMutable<bool, Context>, Context>, Context>,\n }\n\n /// Approves or revokes a `message_hash` for the caller.\n #[aztec::macros::internals_functions_generation::abi_attributes::abi_public]\n unconstrained fn set_authorized(message_hash: Field, authorize: bool) {\n // MACRO CODE START\n let context: PublicContext = PublicContext::new(\n || -> Field {\n let serialized_args: [Field; 2] =\n avm::calldata_copy(1, <Field as Serialize>::N + <bool as Serialize>::N);\n hash_args(serialized_args)\n },\n );\n let storage: Storage<PublicContext> = Storage::init(context);\n // MACRO CODE END\n\n storage.approved_actions.at(avm::sender()).at(message_hash).write(authorize);\n }\n\n /// Enables or disables mass rejection of all authwits for the caller. When enabled, all `consume` calls for the\n /// caller's address will revert regardless of individual approvals.\n #[aztec::macros::internals_functions_generation::abi_attributes::abi_public]\n unconstrained fn set_reject_all(reject: bool) {\n // MACRO CODE START\n let context: PublicContext = PublicContext::new(\n || -> Field {\n let serialized_args: [Field; 1] = avm::calldata_copy(1, <bool as Serialize>::N);\n hash_args(serialized_args)\n },\n );\n let storage: Storage<PublicContext> = Storage::init(context);\n // MACRO CODE END\n\n storage.reject_all.at(avm::sender()).write(reject);\n }\n\n /// Consumes (verifies and atomically revokes) an authorization on behalf of `on_behalf_of`.\n ///\n /// Called by consumer contracts (e.g. Token) to verify a user has authorized an action. This function:\n /// 1. Checks that `on_behalf_of` has not enabled `reject_all`.\n /// 2. Recomputes the `message_hash` from the caller (consumer), chain ID, version, and `inner_hash`, binding the\n /// approval to this specific consumer contract.\n /// 3. Verifies the message was approved and atomically revokes it to prevent replay.\n ///\n /// Returns `IS_VALID_SELECTOR` (0x47dacd73) on success instead of a boolean. This follows the EIP-1271 pattern:\n /// a failed or malformed call would return the default zero value, which is indistinguishable from `false`. By\n /// requiring a specific magic value, the caller can reliably distinguish a successful validation from a failed\n /// call. The function also reverts on failure as a first line of defense, making the magic return value a\n /// defense-in-depth measure against subtle integration bugs on the caller side.\n #[aztec::macros::internals_functions_generation::abi_attributes::abi_public]\n unconstrained fn consume(on_behalf_of: AztecAddress, inner_hash: Field) -> pub Field {\n // MACRO CODE START\n let context: PublicContext = PublicContext::new(\n || -> Field {\n let serialized_args: [Field; 2] =\n avm::calldata_copy(1, <AztecAddress as Serialize>::N + <Field as Serialize>::N);\n hash_args(serialized_args)\n },\n );\n let storage: Storage<PublicContext> = Storage::init(context);\n // MACRO CODE END\n\n // reject_all is checked first so it takes precedence over individual approvals.\n assert_eq(false, storage.reject_all.at(on_behalf_of).read(), \"rejecting all\");\n\n // The msg_sender here is the consumer contract, not the original user. This binds\n // the approval to a specific consumer, preventing cross-contract replay.\n let message_hash = compute_authwit_message_hash(\n context.maybe_msg_sender().unwrap(),\n context.chain_id(),\n context.version(),\n inner_hash,\n );\n\n let authorized = storage.approved_actions.at(on_behalf_of).at(message_hash).read();\n assert_eq(true, authorized, \"unauthorized\");\n // Revoke the approval to prevent replay.\n storage.approved_actions.at(on_behalf_of).at(message_hash).write(false);\n\n IS_VALID_SELECTOR\n }\n\n /// Bridges a private authwit into a public authorization entry.\n ///\n /// Allows any party to insert a public approval on behalf of `approver`, provided they present a valid private\n /// authwit from that approver. Useful when e.g. Alice wants Bob to insert a public authwit for her so they can\n /// execute a trade - Alice signs a private authwit and Bob calls this function.\n ///\n /// This function:\n /// 1. Verifies the approver's private authwit via `assert_current_call_valid_authwit` (static call + nullifier\n /// emission to prevent replay).\n /// 2. Enqueues a public call to `_set_authorized` to write the approval during the public phase.\n #[aztec::macros::internals_functions_generation::abi_attributes::abi_private]\n fn set_authorized_private(\n inputs: aztec::context::inputs::PrivateContextInputs,\n approver: AztecAddress,\n message_hash: Field,\n authorize: bool,\n ) -> return_data aztec::protocol::abis::private_circuit_public_inputs::PrivateCircuitPublicInputs {\n // MACRO CODE START\n // Note: The macros initially inserted a phase check here, but since there is no phase change in this function\n // body or in the subsequent enqueued public function call, I have removed that check.\n assert_compatible_oracle_version();\n\n let serialized_params: [Field; 3] =\n [approver.to_field(), message_hash, authorize.to_field()];\n let args_hash: Field = hash_args(serialized_params);\n let mut context: PrivateContext = PrivateContext::new(inputs, args_hash);\n\n // MACRO CODE END\n\n // The generic parameter `3` is the number of function arguments (approver, message_hash, authorize).\n assert_current_call_valid_authwit::<3>(&mut context, approver);\n\n // Enqueue a public call to _set_authorized to write the approval into public storage.\n {\n let enqueue_params: [Field; 3] =\n [approver.to_field(), message_hash, authorize.to_field()];\n let selector: FunctionSelector = FunctionSelector::from_field(_SET_AUTHORIZED_SELECTOR);\n let calldata: [Field; 4] = [selector.to_field()].concat(enqueue_params);\n let calldata_hash: Field = hash_calldata_array(calldata);\n execution_cache::store(calldata, calldata_hash);\n context.call_public_function_with_calldata_hash(\n context.this_address(),\n calldata_hash,\n false,\n false,\n );\n }\n\n // MACRO CODE START\n context.finish()\n // MACRO CODE END\n }\n\n /// A function that writes an authorization entry for an arbitrary `approver`. Only callable by this contract\n /// itself (`#[only_self]`), ensuring it is only reachable through the validated `set_authorized_private` flow.\n #[aztec::macros::internals_functions_generation::abi_attributes::abi_public]\n #[aztec::macros::internals_functions_generation::abi_attributes::abi_only_self]\n unconstrained fn _set_authorized(approver: AztecAddress, message_hash: Field, authorize: bool) {\n // MACRO CODE START\n let context: PublicContext = PublicContext::new(\n || -> Field {\n let serialized_args: [Field; 3] = avm::calldata_copy(\n 1,\n (<AztecAddress as Serialize>::N + <Field as Serialize>::N)\n + <bool as Serialize>::N,\n );\n hash_args(serialized_args)\n },\n );\n let storage: Storage<PublicContext> = Storage::init(context);\n\n assert(\n avm::sender() == context.this_address(),\n \"Function _set_authorized can only be called by the same contract\",\n );\n // MACRO CODE END\n\n storage.approved_actions.at(approver).at(message_hash).write(authorize);\n }\n\n /// Returns whether `on_behalf_of` has enabled the `reject_all` flag.\n #[aztec::macros::internals_functions_generation::abi_attributes::abi_public]\n #[aztec::macros::internals_functions_generation::abi_attributes::abi_view]\n unconstrained fn is_reject_all(on_behalf_of: AztecAddress) -> pub bool {\n // MACRO CODE START\n let context: PublicContext = PublicContext::new(\n || -> Field {\n let serialized_args: [Field; 1] =\n avm::calldata_copy(1, <AztecAddress as Serialize>::N);\n hash_args(serialized_args)\n },\n );\n let storage: Storage<PublicContext> = Storage::init(context);\n\n assert(context.is_static_call(), \"Function is_reject_all can only be called statically\");\n // MACRO CODE END\n\n storage.reject_all.at(on_behalf_of).read()\n }\n\n /// Returns whether a specific `message_hash` is currently approved for `on_behalf_of`.\n /// Does NOT check the `reject_all` flag - also check `is_reject_all` for a complete picture.\n #[aztec::macros::internals_functions_generation::abi_attributes::abi_public]\n #[aztec::macros::internals_functions_generation::abi_attributes::abi_view]\n unconstrained fn is_consumable(on_behalf_of: AztecAddress, message_hash: Field) -> pub bool {\n // MACRO CODE START\n let context: PublicContext = PublicContext::new(\n || -> Field {\n let serialized_args: [Field; 2] =\n avm::calldata_copy(1, <AztecAddress as Serialize>::N + <Field as Serialize>::N);\n hash_args(serialized_args)\n },\n );\n let storage: Storage<PublicContext> = Storage::init(context);\n\n assert(context.is_static_call(), \"Function is_consumable can only be called statically\");\n // MACRO CODE END\n\n storage.approved_actions.at(on_behalf_of).at(message_hash).read()\n }\n\n /// Utility version of `is_consumable`\n #[aztec::macros::internals_functions_generation::abi_attributes::abi_utility]\n unconstrained fn utility_is_consumable(\n on_behalf_of: AztecAddress,\n message_hash: Field,\n ) -> pub bool {\n // MACRO CODE START\n assert_compatible_oracle_version();\n\n let context: UtilityContext = UtilityContext::new();\n let storage: Storage<UtilityContext> = Storage::init(context);\n // MACRO CODE END\n\n storage.approved_actions.at(on_behalf_of).at(message_hash).read()\n }\n\n // THE REST OF THE CODE IN THIS CONTRACT WAS ORIGINALLY INJECTED BY THE #[aztec] MACRO.\n\n global SET_AUTHORIZED_SELECTOR: Field =\n comptime { FunctionSelector::from_signature(\"set_authorized(Field,bool)\").to_field() };\n\n global SET_REJECT_ALL_SELECTOR: Field =\n comptime { FunctionSelector::from_signature(\"set_reject_all(bool)\").to_field() };\n\n global CONSUME_SELECTOR: Field =\n comptime { FunctionSelector::from_signature(\"consume((Field),Field)\").to_field() };\n\n global _SET_AUTHORIZED_SELECTOR: Field = comptime {\n FunctionSelector::from_signature(\"_set_authorized((Field),Field,bool)\").to_field()\n };\n\n global IS_REJECT_ALL_SELECTOR: Field =\n comptime { FunctionSelector::from_signature(\"is_reject_all((Field))\").to_field() };\n\n global IS_CONSUMABLE_SELECTOR: Field =\n comptime { FunctionSelector::from_signature(\"is_consumable((Field),Field)\").to_field() };\n\n #[aztec::macros::internals_functions_generation::abi_attributes::abi_public]\n pub unconstrained fn public_dispatch(selector: Field) {\n if selector == SET_AUTHORIZED_SELECTOR {\n let input_calldata: [Field; 2] =\n avm::calldata_copy(1, <Field as Serialize>::N + <bool as Serialize>::N);\n let mut reader: Reader<2> = Reader::new(input_calldata);\n let arg0: Field = <Field as Deserialize>::stream_deserialize(&mut reader);\n let arg1: bool = <bool as Deserialize>::stream_deserialize(&mut reader);\n set_authorized(arg0, arg1);\n avm::avm_return([].as_vector());\n };\n if selector == SET_REJECT_ALL_SELECTOR {\n let input_calldata: [Field; 1] = avm::calldata_copy(1, <bool as Serialize>::N);\n let mut reader: Reader<1> = Reader::new(input_calldata);\n let arg0: bool = <bool as Deserialize>::stream_deserialize(&mut reader);\n set_reject_all(arg0);\n avm::avm_return([].as_vector());\n };\n if selector == CONSUME_SELECTOR {\n let input_calldata: [Field; 2] =\n avm::calldata_copy(1, <AztecAddress as Serialize>::N + <Field as Serialize>::N);\n let mut reader: Reader<2> = Reader::new(input_calldata);\n let arg0: AztecAddress = <AztecAddress as Deserialize>::stream_deserialize(&mut reader);\n let arg1: Field = <Field as Deserialize>::stream_deserialize(&mut reader);\n let return_value: [Field; 1] = <Field as Serialize>::serialize(consume(arg0, arg1));\n avm::avm_return(return_value.as_vector());\n };\n if selector == _SET_AUTHORIZED_SELECTOR {\n let input_calldata: [Field; 3] = avm::calldata_copy(\n 1,\n (<AztecAddress as Serialize>::N + <Field as Serialize>::N) + <bool as Serialize>::N,\n );\n let mut reader: Reader<3> = Reader::new(input_calldata);\n let arg0: AztecAddress = <AztecAddress as Deserialize>::stream_deserialize(&mut reader);\n let arg1: Field = <Field as Deserialize>::stream_deserialize(&mut reader);\n let arg2: bool = <bool as Deserialize>::stream_deserialize(&mut reader);\n _set_authorized(arg0, arg1, arg2);\n avm::avm_return([].as_vector());\n };\n if selector == IS_REJECT_ALL_SELECTOR {\n let input_calldata: [Field; 1] = avm::calldata_copy(1, <AztecAddress as Serialize>::N);\n let mut reader: Reader<1> = Reader::new(input_calldata);\n let arg0: AztecAddress = <AztecAddress as Deserialize>::stream_deserialize(&mut reader);\n let return_value: [Field; 1] = <bool as Serialize>::serialize(is_reject_all(arg0));\n avm::avm_return(return_value.as_vector());\n };\n if selector == IS_CONSUMABLE_SELECTOR {\n let input_calldata: [Field; 2] =\n avm::calldata_copy(1, <AztecAddress as Serialize>::N + <Field as Serialize>::N);\n let mut reader: Reader<2> = Reader::new(input_calldata);\n let arg0: AztecAddress = <AztecAddress as Deserialize>::stream_deserialize(&mut reader);\n let arg1: Field = <Field as Deserialize>::stream_deserialize(&mut reader);\n let return_value: [Field; 1] =\n <bool as Serialize>::serialize(is_consumable(arg0, arg1));\n avm::avm_return(return_value.as_vector());\n };\n panic(f\"Unknown selector {selector}\")\n }\n\n impl<Context> Storage<Context> {\n fn init(context: Context) -> Self {\n Self {\n reject_all: <Map<AztecAddress, PublicMutable<bool, Context>, Context> as StateVariable<1, Context>>::new(\n context,\n 1,\n ),\n approved_actions: <Map<AztecAddress, Map<Field, PublicMutable<bool, Context>, Context>, Context> as StateVariable<1, Context>>::new(\n context,\n 2,\n ),\n }\n }\n }\n\n pub struct _set_authorized_parameters {\n pub _approver: AztecAddress,\n pub _message_hash: Field,\n pub _authorize: bool,\n }\n\n pub struct consume_parameters {\n pub _on_behalf_of: AztecAddress,\n pub _inner_hash: Field,\n }\n\n pub struct is_consumable_parameters {\n pub _on_behalf_of: AztecAddress,\n pub _message_hash: Field,\n }\n\n pub struct is_reject_all_parameters {\n pub _on_behalf_of: AztecAddress,\n }\n\n pub struct set_authorized_parameters {\n pub _message_hash: Field,\n pub _authorize: bool,\n }\n\n pub struct set_authorized_private_parameters {\n pub _approver: AztecAddress,\n pub _message_hash: Field,\n pub _authorize: bool,\n }\n\n pub struct set_reject_all_parameters {\n pub _reject: bool,\n }\n\n pub struct utility_is_consumable_parameters {\n pub _on_behalf_of: AztecAddress,\n pub _message_hash: Field,\n }\n\n #[abi(functions)]\n pub struct _set_authorized_abi {\n parameters: _set_authorized_parameters,\n }\n\n #[abi(functions)]\n pub struct consume_abi {\n parameters: consume_parameters,\n return_type: Field,\n }\n\n #[abi(functions)]\n pub struct is_consumable_abi {\n parameters: is_consumable_parameters,\n return_type: bool,\n }\n\n #[abi(functions)]\n pub struct is_reject_all_abi {\n parameters: is_reject_all_parameters,\n return_type: bool,\n }\n\n #[abi(functions)]\n pub struct set_authorized_abi {\n parameters: set_authorized_parameters,\n }\n\n #[abi(functions)]\n pub struct set_authorized_private_abi {\n parameters: set_authorized_private_parameters,\n }\n\n #[abi(functions)]\n pub struct set_reject_all_abi {\n parameters: set_reject_all_parameters,\n }\n\n #[abi(functions)]\n pub struct utility_is_consumable_abi {\n parameters: utility_is_consumable_parameters,\n return_type: bool,\n }\n}\n"
|
|
2702
2702
|
},
|
|
2703
2703
|
"52": {
|
|
2704
2704
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/noir-contracts/contracts/protocol/aztec_sublib/src/authwit/auth.nr",
|
|
2705
|
-
"source": "use crate::context::{gas::GasOpts, PrivateContext, PublicContext};\nuse crate::protocol::{\n abis::function_selector::FunctionSelector,\n address::AztecAddress,\n constants::{\n CANONICAL_AUTH_REGISTRY_ADDRESS, DOM_SEP__AUTHWIT_INNER, DOM_SEP__AUTHWIT_NULLIFIER,\n DOM_SEP__AUTHWIT_OUTER,\n },\n hash::poseidon2_hash_with_separator,\n traits::ToField,\n};\n\n/// Success indicator for authwit - 4 last bytes of poseidon2_hash_bytes(\"IS_VALID()\")\npub global IS_VALID_SELECTOR: Field = 0x47dacd73;\n\n/// Assert that `on_behalf_of` has authorized the current call with a valid authentication witness\n///\n/// @param on_behalf_of The address that has allegedly authorized the current call\npub fn assert_current_call_valid_authwit<let N: u32>(\n context: &mut PrivateContext,\n on_behalf_of: AztecAddress,\n) {\n let args_hash: Field = context.get_args_hash();\n\n let inner_hash = compute_inner_authwit_hash([\n context.maybe_msg_sender().unwrap().to_field(),\n context.selector().to_field(),\n args_hash,\n ]);\n\n assert_inner_hash_valid_authwit(context, on_behalf_of, inner_hash);\n}\n\n/// Assert that a specific `inner_hash` is valid for the `on_behalf_of` address\n///\n/// @param on_behalf_of The address that has allegedly authorized the current call\n/// @param inner_hash The hash of the message to authorize\npub fn assert_inner_hash_valid_authwit(\n context: &mut PrivateContext,\n on_behalf_of: AztecAddress,\n inner_hash: Field,\n) {\n // We perform a static call here and not a standard one to ensure that the account contract cannot re-enter.\n let result: Field = context\n .static_call_private_function(\n on_behalf_of,\n comptime { FunctionSelector::from_signature(\"verify_private_authwit(Field)\") },\n [inner_hash],\n )\n .get_preimage();\n assert(result == IS_VALID_SELECTOR, \"Message not authorized by account\");\n // Compute the nullifier to prevent replay attacks\n let nullifier = compute_authwit_nullifier(on_behalf_of, inner_hash);\n context.push_nullifier(nullifier);\n}\n\n/// Assert that `on_behalf_of` has authorized the current call in the authentication registry\n///\n/// @param on_behalf_of The address that has allegedly authorized the current call\npub unconstrained fn assert_current_call_valid_authwit_public(\n context: PublicContext,\n on_behalf_of: AztecAddress,\n) {\n let inner_hash = compute_inner_authwit_hash([\n context.maybe_msg_sender().unwrap().to_field(),\n context.selector().to_field(),\n context.get_args_hash(),\n ]);\n assert_inner_hash_valid_authwit_public(context, on_behalf_of, inner_hash);\n}\n\n/// Assert that `on_behalf_of` has authorized a specific `inner_hash` in the authentication registry\n///\n/// @param on_behalf_of The address that has allegedly authorized the `inner_hash`\npub unconstrained fn assert_inner_hash_valid_authwit_public(\n context: PublicContext,\n on_behalf_of: AztecAddress,\n inner_hash: Field,\n) {\n let results: [Field] = context.call_public_function(\n CANONICAL_AUTH_REGISTRY_ADDRESS,\n comptime { FunctionSelector::from_signature(\"consume((Field),Field)\") },\n [on_behalf_of.to_field(), inner_hash],\n GasOpts::default(),\n );\n assert(results.len() == 1, \"Invalid response from registry\");\n assert(results[0] == IS_VALID_SELECTOR, \"Message not authorized by account\");\n}\n\n/// Computes the `inner_hash` of the authentication witness\n///\n/// @param args The arguments to hash\npub fn compute_inner_authwit_hash<let N: u32>(args: [Field; N]) -> Field {\n poseidon2_hash_with_separator(args, DOM_SEP__AUTHWIT_INNER)\n}\n\n/// Computes the `authwit_nullifier` for a specific `on_behalf_of` and `inner_hash`\n///\n/// @param on_behalf_of The address that has authorized the `inner_hash`\n/// @param inner_hash The hash of the message to authorize\npub fn compute_authwit_nullifier(on_behalf_of: AztecAddress, inner_hash: Field) -> Field {\n poseidon2_hash_with_separator(\n [on_behalf_of.to_field(), inner_hash],\n DOM_SEP__AUTHWIT_NULLIFIER,\n )\n}\n\n/// Computes the `message_hash` for the authentication witness\n///\n/// @param consumer The address of the contract that is consuming the message\n/// @param chain_id The chain id of the chain that the message is being consumed on\n/// @param version The version of the chain that the message is being consumed on\n/// @param inner_hash The hash of the \"inner\" message that is being consumed\npub fn compute_authwit_message_hash(\n consumer: AztecAddress,\n chain_id: Field,\n version: Field,\n inner_hash: Field,\n) -> Field {\n poseidon2_hash_with_separator(\n [consumer.to_field(), chain_id, version, inner_hash],\n DOM_SEP__AUTHWIT_OUTER,\n )\n}\n\n/// Helper function to set the authorization status of a message hash\n///\n/// @param message_hash The hash of the message to authorize\n/// @param authorize True if the message should be authorized, false if it should be revoked\npub unconstrained fn set_authorized(context: PublicContext, message_hash: Field, authorize: bool) {\n let res = context.call_public_function(\n CANONICAL_AUTH_REGISTRY_ADDRESS,\n comptime { FunctionSelector::from_signature(\"set_authorized(Field,bool)\") },\n [message_hash, authorize as Field],\n GasOpts::default(),\n );\n assert(res.len() == 0);\n}\n\n/// Helper function to reject all authwits\n///\n/// @param reject True if all authwits should be rejected, false otherwise\npub unconstrained fn set_reject_all(context: PublicContext, reject: bool) {\n let res = context.call_public_function(\n CANONICAL_AUTH_REGISTRY_ADDRESS,\n comptime { FunctionSelector::from_signature(\"set_reject_all(bool)\") },\n [
|
|
2705
|
+
"source": "use crate::context::{gas::GasOpts, PrivateContext, PublicContext};\nuse crate::protocol::{\n abis::function_selector::FunctionSelector,\n address::AztecAddress,\n constants::{\n CANONICAL_AUTH_REGISTRY_ADDRESS, DOM_SEP__AUTHWIT_INNER, DOM_SEP__AUTHWIT_NULLIFIER,\n DOM_SEP__AUTHWIT_OUTER,\n },\n hash::poseidon2_hash_with_separator,\n traits::ToField,\n};\n\n/// Success indicator for authwit - 4 last bytes of poseidon2_hash_bytes(\"IS_VALID()\")\npub global IS_VALID_SELECTOR: Field = 0x47dacd73;\n\n/// Assert that `on_behalf_of` has authorized the current call with a valid authentication witness\n///\n/// @param on_behalf_of The address that has allegedly authorized the current call\npub fn assert_current_call_valid_authwit<let N: u32>(\n context: &mut PrivateContext,\n on_behalf_of: AztecAddress,\n) {\n let args_hash: Field = context.get_args_hash();\n\n let inner_hash = compute_inner_authwit_hash([\n context.maybe_msg_sender().unwrap().to_field(),\n context.selector().to_field(),\n args_hash,\n ]);\n\n assert_inner_hash_valid_authwit(context, on_behalf_of, inner_hash);\n}\n\n/// Assert that a specific `inner_hash` is valid for the `on_behalf_of` address\n///\n/// @param on_behalf_of The address that has allegedly authorized the current call\n/// @param inner_hash The hash of the message to authorize\npub fn assert_inner_hash_valid_authwit(\n context: &mut PrivateContext,\n on_behalf_of: AztecAddress,\n inner_hash: Field,\n) {\n // We perform a static call here and not a standard one to ensure that the account contract cannot re-enter.\n let result: Field = context\n .static_call_private_function(\n on_behalf_of,\n comptime { FunctionSelector::from_signature(\"verify_private_authwit(Field)\") },\n [inner_hash],\n )\n .get_preimage();\n assert(result == IS_VALID_SELECTOR, \"Message not authorized by account\");\n // Compute the nullifier to prevent replay attacks\n let nullifier = compute_authwit_nullifier(on_behalf_of, inner_hash);\n context.push_nullifier(nullifier);\n}\n\n/// Assert that `on_behalf_of` has authorized the current call in the authentication registry\n///\n/// @param on_behalf_of The address that has allegedly authorized the current call\npub unconstrained fn assert_current_call_valid_authwit_public(\n context: PublicContext,\n on_behalf_of: AztecAddress,\n) {\n let inner_hash = compute_inner_authwit_hash([\n context.maybe_msg_sender().unwrap().to_field(),\n context.selector().to_field(),\n context.get_args_hash(),\n ]);\n assert_inner_hash_valid_authwit_public(context, on_behalf_of, inner_hash);\n}\n\n/// Assert that `on_behalf_of` has authorized a specific `inner_hash` in the authentication registry\n///\n/// @param on_behalf_of The address that has allegedly authorized the `inner_hash`\npub unconstrained fn assert_inner_hash_valid_authwit_public(\n context: PublicContext,\n on_behalf_of: AztecAddress,\n inner_hash: Field,\n) {\n let results: [Field] = context.call_public_function(\n CANONICAL_AUTH_REGISTRY_ADDRESS,\n comptime { FunctionSelector::from_signature(\"consume((Field),Field)\") },\n [on_behalf_of.to_field(), inner_hash],\n GasOpts::default(),\n );\n assert(results.len() == 1, \"Invalid response from registry\");\n assert(results[0] == IS_VALID_SELECTOR, \"Message not authorized by account\");\n}\n\n/// Computes the `inner_hash` of the authentication witness\n///\n/// @param args The arguments to hash\npub fn compute_inner_authwit_hash<let N: u32>(args: [Field; N]) -> Field {\n poseidon2_hash_with_separator(args, DOM_SEP__AUTHWIT_INNER)\n}\n\n/// Computes the `authwit_nullifier` for a specific `on_behalf_of` and `inner_hash`\n///\n/// @param on_behalf_of The address that has authorized the `inner_hash`\n/// @param inner_hash The hash of the message to authorize\npub fn compute_authwit_nullifier(on_behalf_of: AztecAddress, inner_hash: Field) -> Field {\n poseidon2_hash_with_separator(\n [on_behalf_of.to_field(), inner_hash],\n DOM_SEP__AUTHWIT_NULLIFIER,\n )\n}\n\n/// Computes the `message_hash` for the authentication witness\n///\n/// @param consumer The address of the contract that is consuming the message\n/// @param chain_id The chain id of the chain that the message is being consumed on\n/// @param version The version of the chain that the message is being consumed on\n/// @param inner_hash The hash of the \"inner\" message that is being consumed\npub fn compute_authwit_message_hash(\n consumer: AztecAddress,\n chain_id: Field,\n version: Field,\n inner_hash: Field,\n) -> Field {\n poseidon2_hash_with_separator(\n [consumer.to_field(), chain_id, version, inner_hash],\n DOM_SEP__AUTHWIT_OUTER,\n )\n}\n\n/// Helper function to set the authorization status of a message hash\n///\n/// @param message_hash The hash of the message to authorize\n/// @param authorize True if the message should be authorized, false if it should be revoked\npub unconstrained fn set_authorized(context: PublicContext, message_hash: Field, authorize: bool) {\n let res = context.call_public_function(\n CANONICAL_AUTH_REGISTRY_ADDRESS,\n comptime { FunctionSelector::from_signature(\"set_authorized(Field,bool)\") },\n [message_hash, authorize as Field],\n GasOpts::default(),\n );\n assert(res.len() == 0);\n}\n\n/// Helper function to reject all authwits\n///\n/// @param reject True if all authwits should be rejected, false otherwise\npub unconstrained fn set_reject_all(context: PublicContext, reject: bool) {\n let res = context.call_public_function(\n CANONICAL_AUTH_REGISTRY_ADDRESS,\n comptime { FunctionSelector::from_signature(\"set_reject_all(bool)\") },\n [reject as Field],\n GasOpts::default(),\n );\n assert(res.len() == 0);\n}\n"
|
|
2706
2706
|
},
|
|
2707
2707
|
"58": {
|
|
2708
2708
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/noir-contracts/contracts/protocol/aztec_sublib/src/context/private_context.nr",
|
|
2709
|
-
"source": "use crate::{\n context::{inputs::PrivateContextInputs, NullifierExistenceRequest, ReturnsHash},\n hash::hash_args,\n messaging::process_l1_to_l2_message,\n oracle::{\n call_private_function::call_private_function_internal,\n enqueue_public_function_call::{\n is_side_effect_counter_revertible_oracle_wrapper, notify_enqueued_public_function_call,\n notify_set_min_revertible_side_effect_counter,\n },\n execution_cache,\n logs::notify_created_contract_class_log,\n nullifiers::notify_created_nullifier,\n },\n};\nuse crate::protocol::{\n abis::{\n block_header::BlockHeader,\n call_context::CallContext,\n function_selector::FunctionSelector,\n gas_settings::GasSettings,\n log_hash::LogHash,\n nullifier::Nullifier,\n private_call_request::PrivateCallRequest,\n private_circuit_public_inputs::PrivateCircuitPublicInputs,\n private_log::{PrivateLog, PrivateLogData},\n public_call_request::PublicCallRequest,\n },\n address::{AztecAddress, EthAddress},\n constants::{\n CONTRACT_CLASS_LOG_SIZE_IN_FIELDS, MAX_CONTRACT_CLASS_LOGS_PER_CALL,\n MAX_ENQUEUED_CALLS_PER_CALL, MAX_INCLUDE_BY_TIMESTAMP_DURATION, MAX_L2_TO_L1_MSGS_PER_CALL,\n MAX_NULLIFIER_READ_REQUESTS_PER_CALL, MAX_NULLIFIERS_PER_CALL,\n MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL, MAX_PRIVATE_LOGS_PER_CALL,\n NULL_MSG_SENDER_CONTRACT_ADDRESS, PRIVATE_LOG_SIZE_IN_FIELDS,\n },\n hash::poseidon2_hash,\n messaging::l2_to_l1_message::L2ToL1Message,\n side_effect::{Counted, scoped::Scoped},\n traits::Empty,\n utils::arrays::{ClaimedLengthArray, trimmed_array_length_hint},\n};\n\n/// Minimal PrivateContext for protocol contracts going to audit.\n/// Contains only the methods actually used by: fee_juice, auth_registry, contract_class_registry, contract_instance_registry\n#[derive(Eq)]\npub struct PrivateContext {\n pub inputs: PrivateContextInputs,\n pub side_effect_counter: u32,\n\n pub min_revertible_side_effect_counter: u32,\n pub is_fee_payer: bool,\n\n pub args_hash: Field,\n pub return_hash: Field,\n\n pub include_by_timestamp: u64,\n\n pub nullifier_read_requests: BoundedVec<Scoped<Counted<Field>>, MAX_NULLIFIER_READ_REQUESTS_PER_CALL>,\n\n pub nullifiers: BoundedVec<Counted<Nullifier>, MAX_NULLIFIERS_PER_CALL>,\n\n pub private_call_requests: BoundedVec<PrivateCallRequest, MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL>,\n pub public_call_requests: BoundedVec<Counted<PublicCallRequest>, MAX_ENQUEUED_CALLS_PER_CALL>,\n pub public_teardown_call_request: PublicCallRequest,\n pub l2_to_l1_msgs: BoundedVec<Counted<L2ToL1Message>, MAX_L2_TO_L1_MSGS_PER_CALL>,\n\n // Header of a block whose state is used during private execution (not the block the transaction is included in).\n pub anchor_block_header: BlockHeader,\n\n pub private_logs: BoundedVec<Counted<PrivateLogData>, MAX_PRIVATE_LOGS_PER_CALL>,\n pub contract_class_logs_hashes: BoundedVec<Counted<LogHash>, MAX_CONTRACT_CLASS_LOGS_PER_CALL>,\n\n pub expected_non_revertible_side_effect_counter: u32,\n pub expected_revertible_side_effect_counter: u32,\n}\n\nimpl PrivateContext {\n pub fn new(inputs: PrivateContextInputs, args_hash: Field) -> PrivateContext {\n let max_allowed_include_by_timestamp = inputs.anchor_block_header.global_variables.timestamp\n + MAX_INCLUDE_BY_TIMESTAMP_DURATION;\n PrivateContext {\n inputs,\n side_effect_counter: inputs.start_side_effect_counter + 1,\n min_revertible_side_effect_counter: 0,\n is_fee_payer: false,\n args_hash,\n return_hash: 0,\n include_by_timestamp: max_allowed_include_by_timestamp,\n nullifier_read_requests: BoundedVec::new(),\n nullifiers: BoundedVec::new(),\n anchor_block_header: inputs.anchor_block_header,\n private_call_requests: BoundedVec::new(),\n public_call_requests: BoundedVec::new(),\n public_teardown_call_request: PublicCallRequest::empty(),\n l2_to_l1_msgs: BoundedVec::new(),\n private_logs: BoundedVec::new(),\n contract_class_logs_hashes: BoundedVec::new(),\n expected_non_revertible_side_effect_counter: 0,\n expected_revertible_side_effect_counter: 0,\n }\n }\n\n /// Returns the contract address that initiated this function call (similar to msg.sender in Solidity).\n pub fn maybe_msg_sender(self) -> Option<AztecAddress> {\n let maybe_msg_sender = self.inputs.call_context.msg_sender;\n if maybe_msg_sender == NULL_MSG_SENDER_CONTRACT_ADDRESS {\n Option::none()\n } else {\n Option::some(maybe_msg_sender)\n }\n }\n\n /// Returns the contract address of the current function being executed.\n pub fn this_address(self) -> AztecAddress {\n self.inputs.call_context.contract_address\n }\n\n /// Returns the chain ID of the current network.\n pub fn chain_id(self) -> Field {\n self.inputs.tx_context.chain_id\n }\n\n /// Returns the protocol version.\n pub fn version(self) -> Field {\n self.inputs.tx_context.version\n }\n\n /// Returns the gas settings for the current transaction.\n pub fn gas_settings(self) -> GasSettings {\n self.inputs.tx_context.gas_settings\n }\n\n /// Returns the function selector of the currently executing function.\n pub fn selector(self) -> FunctionSelector {\n self.inputs.call_context.function_selector\n }\n\n /// Returns the hash of the arguments passed to the current function.\n pub fn get_args_hash(self) -> Field {\n self.args_hash\n }\n\n /// Returns the anchor block header.\n pub fn get_anchor_block_header(self) -> BlockHeader {\n self.anchor_block_header\n }\n\n /// Sets the hash of the return values for this private function.\n pub fn set_return_hash<let N: u32>(&mut self, serialized_return_values: [Field; N]) {\n let return_hash = hash_args(serialized_return_values);\n self.return_hash = return_hash;\n execution_cache::store(serialized_return_values, return_hash);\n }\n\n /// Builds the PrivateCircuitPublicInputs for this private function.\n pub fn finish(self) -> PrivateCircuitPublicInputs {\n PrivateCircuitPublicInputs {\n call_context: self.inputs.call_context,\n args_hash: self.args_hash,\n returns_hash: self.return_hash,\n min_revertible_side_effect_counter: self.min_revertible_side_effect_counter,\n is_fee_payer: self.is_fee_payer,\n include_by_timestamp: self.include_by_timestamp,\n note_hash_read_requests: ClaimedLengthArray::empty(), // Not used by protocol contracts\n nullifier_read_requests: ClaimedLengthArray::from_bounded_vec(\n self.nullifier_read_requests,\n ),\n key_validation_requests_and_generators: ClaimedLengthArray::empty(), // Not used by protocol contracts\n note_hashes: ClaimedLengthArray::empty(), // Not used by protocol contracts\n nullifiers: ClaimedLengthArray::from_bounded_vec(self.nullifiers),\n private_call_requests: ClaimedLengthArray::from_bounded_vec(self.private_call_requests),\n public_call_requests: ClaimedLengthArray::from_bounded_vec(self.public_call_requests),\n public_teardown_call_request: self.public_teardown_call_request,\n l2_to_l1_msgs: ClaimedLengthArray::from_bounded_vec(self.l2_to_l1_msgs),\n start_side_effect_counter: self.inputs.start_side_effect_counter,\n end_side_effect_counter: self.side_effect_counter,\n private_logs: ClaimedLengthArray::from_bounded_vec(self.private_logs),\n contract_class_logs_hashes: ClaimedLengthArray::from_bounded_vec(\n self.contract_class_logs_hashes,\n ),\n anchor_block_header: self.anchor_block_header,\n tx_context: self.inputs.tx_context,\n expected_non_revertible_side_effect_counter: self\n .expected_non_revertible_side_effect_counter,\n expected_revertible_side_effect_counter: self.expected_revertible_side_effect_counter,\n }\n }\n\n /// Declares the end of the \"setup phase\" of this tx. Used by fee_juice.\n pub fn end_setup(&mut self) {\n self.side_effect_counter += 1;\n self.min_revertible_side_effect_counter = self.next_counter();\n notify_set_min_revertible_side_effect_counter(self.min_revertible_side_effect_counter);\n }\n\n pub fn in_revertible_phase(&mut self) -> bool {\n let current_counter = self.side_effect_counter;\n\n // Safety: Kernel will validate that the claim is correct by validating the expected counters.\n let is_revertible =\n unsafe { is_side_effect_counter_revertible_oracle_wrapper(current_counter) };\n\n if is_revertible {\n if (self.expected_revertible_side_effect_counter == 0)\n | (current_counter < self.expected_revertible_side_effect_counter) {\n self.expected_revertible_side_effect_counter = current_counter;\n }\n } else if current_counter > self.expected_non_revertible_side_effect_counter {\n self.expected_non_revertible_side_effect_counter = current_counter;\n }\n\n is_revertible\n }\n\n /// Sets a deadline for when this transaction must be included in a block.\n pub fn set_include_by_timestamp(&mut self, include_by_timestamp: u64) {\n self.include_by_timestamp = std::cmp::min(self.include_by_timestamp, include_by_timestamp);\n }\n\n /// Pushes a new nullifier. Used by class_registry and instance_registry.\n pub fn push_nullifier(&mut self, nullifier: Field) {\n notify_created_nullifier(nullifier);\n self.nullifiers.push(Nullifier { value: nullifier, note_hash: 0 }.count(self.next_counter()));\n }\n\n /// Asserts that a nullifier has been emitted. Used by instance_registry.\n pub fn assert_nullifier_exists(\n &mut self,\n nullifier_existence_request: NullifierExistenceRequest,\n ) {\n let nullifier = nullifier_existence_request.nullifier();\n let contract_address =\n nullifier_existence_request.maybe_contract_address().unwrap_or(AztecAddress::zero());\n\n let request = Scoped::new(\n Counted::new(nullifier, self.next_counter()),\n contract_address,\n );\n\n self.nullifier_read_requests.push(request);\n }\n\n /// Consumes a message sent from Ethereum (L1) to Aztec (L2). Used by fee_juice.\n pub fn consume_l1_to_l2_message(\n &mut self,\n content: Field,\n secret: Field,\n sender: EthAddress,\n leaf_index: Field,\n ) {\n let nullifier = process_l1_to_l2_message(\n self.anchor_block_header.state.l1_to_l2_message_tree.root,\n self.this_address(),\n sender,\n self.chain_id(),\n self.version(),\n content,\n secret,\n leaf_index,\n );\n\n // Push nullifier (and the \"commitment\" corresponding to this can be \"empty\")\n self.push_nullifier(nullifier)\n }\n\n /// Emits a private log. Used by instance_registry.\n pub fn emit_private_log(&mut self, log: [Field; PRIVATE_LOG_SIZE_IN_FIELDS], length: u32) {\n let counter = self.next_counter();\n let private_log = PrivateLogData { log: PrivateLog::new(log, length), note_hash_counter: 0 }\n .count(counter);\n self.private_logs.push(private_log);\n }\n\n /// Emits a contract class log. Used by class_registry.\n pub fn emit_contract_class_log<let N: u32>(&mut self, log: [Field; N]) {\n let contract_address = self.this_address();\n let counter = self.next_counter();\n\n let log_to_emit: [Field; CONTRACT_CLASS_LOG_SIZE_IN_FIELDS] =\n log.concat([0; CONTRACT_CLASS_LOG_SIZE_IN_FIELDS - N]);\n // Safety: The below length is constrained in the base rollup, which will make sure that all the fields beyond\n // length are zero. However, it won't be able to check that we didn't add extra padding (trailing zeroes) or\n // that we cut trailing zeroes from the end.\n let length = unsafe { trimmed_array_length_hint(log_to_emit) };\n // We hash the entire padded log to ensure a user cannot pass a shorter length and so emit incorrect shorter\n // bytecode.\n let log_hash = poseidon2_hash(log_to_emit);\n // Safety: the below only exists to broadcast the raw log, so we can provide it to the base rollup later to be\n // constrained.\n unsafe {\n notify_created_contract_class_log(contract_address, log_to_emit, length, counter);\n }\n\n self.contract_class_logs_hashes.push(LogHash { value: log_hash, length: length }.count(\n counter,\n ));\n }\n\n /// Makes a read-only call to a private function. Used by auth_registry for authwit.\n pub fn static_call_private_function<let ArgsCount: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ArgsCount],\n ) -> ReturnsHash {\n let args_hash = hash_args(args);\n execution_cache::store(args, args_hash);\n self.call_private_function_with_args_hash(\n contract_address,\n function_selector,\n args_hash,\n true,\n )\n }\n\n fn call_private_function_with_args_hash(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n ) -> ReturnsHash {\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n let start_side_effect_counter = self.side_effect_counter;\n\n // Safety: The oracle simulates the private call and returns the value of the side effects counter after\n // execution of the call.\n let (end_side_effect_counter, returns_hash) = unsafe {\n call_private_function_internal(\n contract_address,\n function_selector,\n args_hash,\n start_side_effect_counter,\n is_static_call,\n )\n };\n\n self.private_call_requests.push(\n PrivateCallRequest {\n call_context: CallContext {\n msg_sender: self.this_address(),\n contract_address,\n function_selector,\n is_static_call,\n },\n args_hash,\n returns_hash,\n start_side_effect_counter,\n end_side_effect_counter,\n },\n );\n\n self.side_effect_counter = end_side_effect_counter + 1;\n ReturnsHash::new(returns_hash)\n }\n\n /// Enqueues a call to a public function with a calldata hash. Used by fee_juice and auth_registry.\n pub fn call_public_function_with_calldata_hash(\n &mut self,\n contract_address: AztecAddress,\n calldata_hash: Field,\n is_static_call: bool,\n hide_msg_sender: bool,\n ) {\n let counter = self.next_counter();\n\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n\n notify_enqueued_public_function_call(\n contract_address,\n calldata_hash,\n counter,\n is_static_call,\n );\n\n let msg_sender = if hide_msg_sender {\n NULL_MSG_SENDER_CONTRACT_ADDRESS\n } else {\n self.this_address()\n };\n\n let call_request =\n PublicCallRequest { msg_sender, contract_address, is_static_call, calldata_hash };\n\n self.public_call_requests.push(Counted::new(call_request, counter));\n }\n\n fn next_counter(&mut self) -> u32 {\n let counter = self.side_effect_counter;\n self.side_effect_counter += 1;\n counter\n }\n}\n\nimpl Empty for PrivateContext {\n fn empty() -> Self {\n PrivateContext {\n inputs: PrivateContextInputs::empty(),\n side_effect_counter: 0 as u32,\n min_revertible_side_effect_counter: 0 as u32,\n is_fee_payer: false,\n args_hash: 0,\n return_hash: 0,\n include_by_timestamp: 0,\n nullifier_read_requests: BoundedVec::new(),\n nullifiers: BoundedVec::new(),\n private_call_requests: BoundedVec::new(),\n public_call_requests: BoundedVec::new(),\n public_teardown_call_request: PublicCallRequest::empty(),\n l2_to_l1_msgs: BoundedVec::new(),\n anchor_block_header: BlockHeader::empty(),\n private_logs: BoundedVec::new(),\n contract_class_logs_hashes: BoundedVec::new(),\n expected_non_revertible_side_effect_counter: 0,\n expected_revertible_side_effect_counter: 0,\n }\n }\n}\n"
|
|
2709
|
+
"source": "use crate::{\n context::{inputs::PrivateContextInputs, NullifierExistenceRequest, ReturnsHash},\n hash::hash_args,\n messaging::process_l1_to_l2_message,\n oracle::{\n call_private_function::call_private_function_internal,\n enqueue_public_function_call::{\n is_side_effect_counter_revertible_oracle_wrapper, notify_enqueued_public_function_call,\n notify_set_min_revertible_side_effect_counter,\n },\n execution_cache,\n logs::notify_created_contract_class_log,\n nullifiers::notify_created_nullifier,\n },\n};\nuse crate::protocol::{\n abis::{\n block_header::BlockHeader,\n call_context::CallContext,\n function_selector::FunctionSelector,\n gas_settings::GasSettings,\n log_hash::LogHash,\n nullifier::Nullifier,\n private_call_request::PrivateCallRequest,\n private_circuit_public_inputs::PrivateCircuitPublicInputs,\n private_log::{PrivateLog, PrivateLogData},\n public_call_request::PublicCallRequest,\n },\n address::{AztecAddress, EthAddress},\n constants::{\n CONTRACT_CLASS_LOG_SIZE_IN_FIELDS, MAX_CONTRACT_CLASS_LOGS_PER_CALL,\n MAX_ENQUEUED_CALLS_PER_CALL, MAX_TX_LIFETIME, MAX_L2_TO_L1_MSGS_PER_CALL,\n MAX_NULLIFIER_READ_REQUESTS_PER_CALL, MAX_NULLIFIERS_PER_CALL,\n MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL, MAX_PRIVATE_LOGS_PER_CALL,\n NULL_MSG_SENDER_CONTRACT_ADDRESS, PRIVATE_LOG_SIZE_IN_FIELDS,\n },\n hash::poseidon2_hash,\n messaging::l2_to_l1_message::L2ToL1Message,\n side_effect::{Counted, scoped::Scoped},\n traits::Empty,\n utils::arrays::{ClaimedLengthArray, trimmed_array_length_hint},\n};\n\n/// Minimal PrivateContext for protocol contracts going to audit.\n/// Contains only the methods actually used by: fee_juice, auth_registry, contract_class_registry, contract_instance_registry\n#[derive(Eq)]\npub struct PrivateContext {\n pub inputs: PrivateContextInputs,\n pub side_effect_counter: u32,\n\n pub min_revertible_side_effect_counter: u32,\n pub is_fee_payer: bool,\n\n pub args_hash: Field,\n pub return_hash: Field,\n\n pub expiration_timestamp: u64,\n\n pub nullifier_read_requests: BoundedVec<Scoped<Counted<Field>>, MAX_NULLIFIER_READ_REQUESTS_PER_CALL>,\n\n pub nullifiers: BoundedVec<Counted<Nullifier>, MAX_NULLIFIERS_PER_CALL>,\n\n pub private_call_requests: BoundedVec<PrivateCallRequest, MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL>,\n pub public_call_requests: BoundedVec<Counted<PublicCallRequest>, MAX_ENQUEUED_CALLS_PER_CALL>,\n pub public_teardown_call_request: PublicCallRequest,\n pub l2_to_l1_msgs: BoundedVec<Counted<L2ToL1Message>, MAX_L2_TO_L1_MSGS_PER_CALL>,\n\n // Header of a block whose state is used during private execution (not the block the transaction is included in).\n pub anchor_block_header: BlockHeader,\n\n pub private_logs: BoundedVec<Counted<PrivateLogData>, MAX_PRIVATE_LOGS_PER_CALL>,\n pub contract_class_logs_hashes: BoundedVec<Counted<LogHash>, MAX_CONTRACT_CLASS_LOGS_PER_CALL>,\n\n pub expected_non_revertible_side_effect_counter: u32,\n pub expected_revertible_side_effect_counter: u32,\n}\n\nimpl PrivateContext {\n pub fn new(inputs: PrivateContextInputs, args_hash: Field) -> PrivateContext {\n PrivateContext {\n inputs,\n side_effect_counter: inputs.start_side_effect_counter + 1,\n min_revertible_side_effect_counter: 0,\n is_fee_payer: false,\n args_hash,\n return_hash: 0,\n expiration_timestamp: inputs.anchor_block_header.global_variables.timestamp\n + MAX_TX_LIFETIME,\n nullifier_read_requests: BoundedVec::new(),\n nullifiers: BoundedVec::new(),\n anchor_block_header: inputs.anchor_block_header,\n private_call_requests: BoundedVec::new(),\n public_call_requests: BoundedVec::new(),\n public_teardown_call_request: PublicCallRequest::empty(),\n l2_to_l1_msgs: BoundedVec::new(),\n private_logs: BoundedVec::new(),\n contract_class_logs_hashes: BoundedVec::new(),\n expected_non_revertible_side_effect_counter: 0,\n expected_revertible_side_effect_counter: 0,\n }\n }\n\n /// Returns the contract address that initiated this function call (similar to msg.sender in Solidity).\n pub fn maybe_msg_sender(self) -> Option<AztecAddress> {\n let maybe_msg_sender = self.inputs.call_context.msg_sender;\n if maybe_msg_sender == NULL_MSG_SENDER_CONTRACT_ADDRESS {\n Option::none()\n } else {\n Option::some(maybe_msg_sender)\n }\n }\n\n /// Returns the contract address of the current function being executed.\n pub fn this_address(self) -> AztecAddress {\n self.inputs.call_context.contract_address\n }\n\n /// Returns the chain ID of the current network.\n pub fn chain_id(self) -> Field {\n self.inputs.tx_context.chain_id\n }\n\n /// Returns the protocol version.\n pub fn version(self) -> Field {\n self.inputs.tx_context.version\n }\n\n /// Returns the gas settings for the current transaction.\n pub fn gas_settings(self) -> GasSettings {\n self.inputs.tx_context.gas_settings\n }\n\n /// Returns the function selector of the currently executing function.\n pub fn selector(self) -> FunctionSelector {\n self.inputs.call_context.function_selector\n }\n\n /// Returns the hash of the arguments passed to the current function.\n pub fn get_args_hash(self) -> Field {\n self.args_hash\n }\n\n /// Returns the anchor block header.\n pub fn get_anchor_block_header(self) -> BlockHeader {\n self.anchor_block_header\n }\n\n /// Sets the hash of the return values for this private function.\n pub fn set_return_hash<let N: u32>(&mut self, serialized_return_values: [Field; N]) {\n let return_hash = hash_args(serialized_return_values);\n self.return_hash = return_hash;\n execution_cache::store(serialized_return_values, return_hash);\n }\n\n /// Builds the PrivateCircuitPublicInputs for this private function.\n pub fn finish(self) -> PrivateCircuitPublicInputs {\n PrivateCircuitPublicInputs {\n call_context: self.inputs.call_context,\n args_hash: self.args_hash,\n returns_hash: self.return_hash,\n min_revertible_side_effect_counter: self.min_revertible_side_effect_counter,\n is_fee_payer: self.is_fee_payer,\n expiration_timestamp: self.expiration_timestamp,\n note_hash_read_requests: ClaimedLengthArray::empty(), // Not used by protocol contracts\n nullifier_read_requests: ClaimedLengthArray::from_bounded_vec(\n self.nullifier_read_requests,\n ),\n key_validation_requests_and_separators: ClaimedLengthArray::empty(), // Not used by protocol contracts\n note_hashes: ClaimedLengthArray::empty(), // Not used by protocol contracts\n nullifiers: ClaimedLengthArray::from_bounded_vec(self.nullifiers),\n private_call_requests: ClaimedLengthArray::from_bounded_vec(self.private_call_requests),\n public_call_requests: ClaimedLengthArray::from_bounded_vec(self.public_call_requests),\n public_teardown_call_request: self.public_teardown_call_request,\n l2_to_l1_msgs: ClaimedLengthArray::from_bounded_vec(self.l2_to_l1_msgs),\n start_side_effect_counter: self.inputs.start_side_effect_counter,\n end_side_effect_counter: self.side_effect_counter,\n private_logs: ClaimedLengthArray::from_bounded_vec(self.private_logs),\n contract_class_logs_hashes: ClaimedLengthArray::from_bounded_vec(\n self.contract_class_logs_hashes,\n ),\n anchor_block_header: self.anchor_block_header,\n tx_context: self.inputs.tx_context,\n expected_non_revertible_side_effect_counter: self\n .expected_non_revertible_side_effect_counter,\n expected_revertible_side_effect_counter: self.expected_revertible_side_effect_counter,\n }\n }\n\n /// Declares the end of the \"setup phase\" of this tx. Used by fee_juice.\n pub fn end_setup(&mut self) {\n self.side_effect_counter += 1;\n self.min_revertible_side_effect_counter = self.next_counter();\n notify_set_min_revertible_side_effect_counter(self.min_revertible_side_effect_counter);\n }\n\n pub fn in_revertible_phase(&mut self) -> bool {\n let current_counter = self.side_effect_counter;\n\n // Safety: Kernel will validate that the claim is correct by validating the expected counters.\n let is_revertible =\n unsafe { is_side_effect_counter_revertible_oracle_wrapper(current_counter) };\n\n if is_revertible {\n if (self.expected_revertible_side_effect_counter == 0)\n | (current_counter < self.expected_revertible_side_effect_counter) {\n self.expected_revertible_side_effect_counter = current_counter;\n }\n } else if current_counter > self.expected_non_revertible_side_effect_counter {\n self.expected_non_revertible_side_effect_counter = current_counter;\n }\n\n is_revertible\n }\n\n /// Sets a deadline for when this transaction must be included in a block.\n pub fn set_expiration_timestamp(&mut self, expiration_timestamp: u64) {\n self.expiration_timestamp = std::cmp::min(self.expiration_timestamp, expiration_timestamp);\n }\n\n /// Pushes a new nullifier. Used by class_registry and instance_registry.\n pub fn push_nullifier(&mut self, nullifier: Field) {\n notify_created_nullifier(nullifier);\n self.nullifiers.push(Nullifier { value: nullifier, note_hash: 0 }.count(self.next_counter()));\n }\n\n /// Asserts that a nullifier has been emitted. Used by instance_registry.\n pub fn assert_nullifier_exists(\n &mut self,\n nullifier_existence_request: NullifierExistenceRequest,\n ) {\n let nullifier = nullifier_existence_request.nullifier();\n let contract_address =\n nullifier_existence_request.maybe_contract_address().unwrap_or(AztecAddress::zero());\n\n let request = Scoped::new(\n Counted::new(nullifier, self.next_counter()),\n contract_address,\n );\n\n self.nullifier_read_requests.push(request);\n }\n\n /// Consumes a message sent from Ethereum (L1) to Aztec (L2). Used by fee_juice.\n pub fn consume_l1_to_l2_message(\n &mut self,\n content: Field,\n secret: Field,\n sender: EthAddress,\n leaf_index: Field,\n ) {\n let nullifier = process_l1_to_l2_message(\n self.anchor_block_header.state.l1_to_l2_message_tree.root,\n self.this_address(),\n sender,\n self.chain_id(),\n self.version(),\n content,\n secret,\n leaf_index,\n );\n\n // Push nullifier (and the \"commitment\" corresponding to this can be \"empty\")\n self.push_nullifier(nullifier)\n }\n\n /// Emits a private log. Used by instance_registry.\n pub fn emit_private_log(&mut self, log: [Field; PRIVATE_LOG_SIZE_IN_FIELDS], length: u32) {\n let counter = self.next_counter();\n let private_log = PrivateLogData { log: PrivateLog::new(log, length), note_hash_counter: 0 }\n .count(counter);\n self.private_logs.push(private_log);\n }\n\n /// Emits a contract class log. Used by class_registry.\n pub fn emit_contract_class_log<let N: u32>(&mut self, log: [Field; N]) {\n let contract_address = self.this_address();\n let counter = self.next_counter();\n\n let log_to_emit: [Field; CONTRACT_CLASS_LOG_SIZE_IN_FIELDS] =\n log.concat([0; CONTRACT_CLASS_LOG_SIZE_IN_FIELDS - N]);\n // Safety: The below length is constrained in the base rollup, which will make sure that all the fields beyond\n // length are zero. However, it won't be able to check that we didn't add extra padding (trailing zeroes) or\n // that we cut trailing zeroes from the end.\n let length = unsafe { trimmed_array_length_hint(log_to_emit) };\n // We hash the entire padded log to ensure a user cannot pass a shorter length and so emit incorrect shorter\n // bytecode.\n let log_hash = poseidon2_hash(log_to_emit);\n // Safety: the below only exists to broadcast the raw log, so we can provide it to the base rollup later to be\n // constrained.\n unsafe {\n notify_created_contract_class_log(contract_address, log_to_emit, length, counter);\n }\n\n self.contract_class_logs_hashes.push(LogHash { value: log_hash, length: length }.count(\n counter,\n ));\n }\n\n /// Makes a read-only call to a private function. Used by auth_registry for authwit.\n pub fn static_call_private_function<let ArgsCount: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ArgsCount],\n ) -> ReturnsHash {\n let args_hash = hash_args(args);\n execution_cache::store(args, args_hash);\n self.call_private_function_with_args_hash(\n contract_address,\n function_selector,\n args_hash,\n true,\n )\n }\n\n fn call_private_function_with_args_hash(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n ) -> ReturnsHash {\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n let start_side_effect_counter = self.side_effect_counter;\n\n // Safety: The oracle simulates the private call and returns the value of the side effects counter after\n // execution of the call.\n let (end_side_effect_counter, returns_hash) = unsafe {\n call_private_function_internal(\n contract_address,\n function_selector,\n args_hash,\n start_side_effect_counter,\n is_static_call,\n )\n };\n\n self.private_call_requests.push(\n PrivateCallRequest {\n call_context: CallContext {\n msg_sender: self.this_address(),\n contract_address,\n function_selector,\n is_static_call,\n },\n args_hash,\n returns_hash,\n start_side_effect_counter,\n end_side_effect_counter,\n },\n );\n\n self.side_effect_counter = end_side_effect_counter + 1;\n ReturnsHash::new(returns_hash)\n }\n\n /// Enqueues a call to a public function with a calldata hash. Used by fee_juice and auth_registry.\n pub fn call_public_function_with_calldata_hash(\n &mut self,\n contract_address: AztecAddress,\n calldata_hash: Field,\n is_static_call: bool,\n hide_msg_sender: bool,\n ) {\n let counter = self.next_counter();\n\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n\n notify_enqueued_public_function_call(\n contract_address,\n calldata_hash,\n counter,\n is_static_call,\n );\n\n let msg_sender = if hide_msg_sender {\n NULL_MSG_SENDER_CONTRACT_ADDRESS\n } else {\n self.this_address()\n };\n\n let call_request =\n PublicCallRequest { msg_sender, contract_address, is_static_call, calldata_hash };\n\n self.public_call_requests.push(Counted::new(call_request, counter));\n }\n\n fn next_counter(&mut self) -> u32 {\n let counter = self.side_effect_counter;\n self.side_effect_counter += 1;\n counter\n }\n}\n\nimpl Empty for PrivateContext {\n fn empty() -> Self {\n PrivateContext {\n inputs: PrivateContextInputs::empty(),\n side_effect_counter: 0 as u32,\n min_revertible_side_effect_counter: 0 as u32,\n is_fee_payer: false,\n args_hash: 0,\n return_hash: 0,\n expiration_timestamp: 0,\n nullifier_read_requests: BoundedVec::new(),\n nullifiers: BoundedVec::new(),\n private_call_requests: BoundedVec::new(),\n public_call_requests: BoundedVec::new(),\n public_teardown_call_request: PublicCallRequest::empty(),\n l2_to_l1_msgs: BoundedVec::new(),\n anchor_block_header: BlockHeader::empty(),\n private_logs: BoundedVec::new(),\n contract_class_logs_hashes: BoundedVec::new(),\n expected_non_revertible_side_effect_counter: 0,\n expected_revertible_side_effect_counter: 0,\n }\n }\n}\n"
|
|
2710
2710
|
},
|
|
2711
2711
|
"59": {
|
|
2712
2712
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/noir-contracts/contracts/protocol/aztec_sublib/src/context/public_context.nr",
|
|
@@ -2722,11 +2722,11 @@
|
|
|
2722
2722
|
},
|
|
2723
2723
|
"62": {
|
|
2724
2724
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/noir-contracts/contracts/protocol/aztec_sublib/src/hash.nr",
|
|
2725
|
-
"source": "//! Aztec hash functions.\n\nuse crate::protocol::{\n address::{AztecAddress, EthAddress},\n constants::{\n DOM_SEP__FUNCTION_ARGS, DOM_SEP__MESSAGE_NULLIFIER, DOM_SEP__PUBLIC_BYTECODE,\n DOM_SEP__PUBLIC_CALLDATA, DOM_SEP__SECRET_HASH, MAX_PACKED_PUBLIC_BYTECODE_SIZE_IN_FIELDS,\n },\n hash::{poseidon2_hash_subarray, poseidon2_hash_with_separator, sha256_to_field},\n traits::ToField,\n};\n\npub use crate::protocol::hash::compute_siloed_nullifier;\n\npub fn compute_secret_hash(secret: Field) -> Field {\n poseidon2_hash_with_separator([secret], DOM_SEP__SECRET_HASH)\n}\n\npub fn compute_l1_to_l2_message_hash(\n sender: EthAddress,\n chain_id: Field,\n recipient: AztecAddress,\n version: Field,\n content: Field,\n secret_hash: Field,\n leaf_index: Field,\n) -> Field {\n let mut hash_bytes = [0 as u8; 224];\n let sender_bytes: [u8; 32] = sender.to_field().to_be_bytes();\n let chain_id_bytes: [u8; 32] = chain_id.to_be_bytes();\n let recipient_bytes: [u8; 32] = recipient.to_field().to_be_bytes();\n let version_bytes: [u8; 32] = version.to_be_bytes();\n let content_bytes: [u8; 32] = content.to_be_bytes();\n let secret_hash_bytes: [u8; 32] = secret_hash.to_be_bytes();\n let leaf_index_bytes: [u8; 32] = leaf_index.to_be_bytes();\n\n for i in 0..32 {\n hash_bytes[i] = sender_bytes[i];\n hash_bytes[i + 32] = chain_id_bytes[i];\n hash_bytes[i + 64] = recipient_bytes[i];\n hash_bytes[i + 96] = version_bytes[i];\n hash_bytes[i + 128] = content_bytes[i];\n hash_bytes[i + 160] = secret_hash_bytes[i];\n hash_bytes[i + 192] = leaf_index_bytes[i];\n }\n\n sha256_to_field(hash_bytes)\n}\n\n// The nullifier of a l1 to l2 message is the hash of the message salted with the secret\npub fn compute_l1_to_l2_message_nullifier(message_hash: Field, secret: Field) -> Field {\n poseidon2_hash_with_separator([message_hash, secret], DOM_SEP__MESSAGE_NULLIFIER)\n}\n\n// Computes the hash of input arguments or return values for private functions, or for authwit creation.\npub fn hash_args<let N: u32>(args: [Field; N]) -> Field {\n if args.len() == 0 {\n 0\n } else {\n poseidon2_hash_with_separator(args, DOM_SEP__FUNCTION_ARGS)\n }\n}\n\n// Computes the hash of calldata for public functions.\npub fn hash_calldata_array<let N: u32>(calldata: [Field; N]) -> Field {\n poseidon2_hash_with_separator(calldata, DOM_SEP__PUBLIC_CALLDATA)\n}\n\n/// Computes the public bytecode commitment for a contract class. The commitment is `hash([separator
|
|
2725
|
+
"source": "//! Aztec hash functions.\n\nuse crate::protocol::{\n address::{AztecAddress, EthAddress},\n constants::{\n DOM_SEP__FUNCTION_ARGS, DOM_SEP__MESSAGE_NULLIFIER, DOM_SEP__PUBLIC_BYTECODE,\n DOM_SEP__PUBLIC_CALLDATA, DOM_SEP__SECRET_HASH, MAX_PACKED_PUBLIC_BYTECODE_SIZE_IN_FIELDS,\n },\n hash::{poseidon2_hash_subarray, poseidon2_hash_with_separator, sha256_to_field},\n traits::ToField,\n};\n\npub use crate::protocol::hash::compute_siloed_nullifier;\n\npub fn compute_secret_hash(secret: Field) -> Field {\n poseidon2_hash_with_separator([secret], DOM_SEP__SECRET_HASH)\n}\n\npub fn compute_l1_to_l2_message_hash(\n sender: EthAddress,\n chain_id: Field,\n recipient: AztecAddress,\n version: Field,\n content: Field,\n secret_hash: Field,\n leaf_index: Field,\n) -> Field {\n let mut hash_bytes = [0 as u8; 224];\n let sender_bytes: [u8; 32] = sender.to_field().to_be_bytes();\n let chain_id_bytes: [u8; 32] = chain_id.to_be_bytes();\n let recipient_bytes: [u8; 32] = recipient.to_field().to_be_bytes();\n let version_bytes: [u8; 32] = version.to_be_bytes();\n let content_bytes: [u8; 32] = content.to_be_bytes();\n let secret_hash_bytes: [u8; 32] = secret_hash.to_be_bytes();\n let leaf_index_bytes: [u8; 32] = leaf_index.to_be_bytes();\n\n for i in 0..32 {\n hash_bytes[i] = sender_bytes[i];\n hash_bytes[i + 32] = chain_id_bytes[i];\n hash_bytes[i + 64] = recipient_bytes[i];\n hash_bytes[i + 96] = version_bytes[i];\n hash_bytes[i + 128] = content_bytes[i];\n hash_bytes[i + 160] = secret_hash_bytes[i];\n hash_bytes[i + 192] = leaf_index_bytes[i];\n }\n\n sha256_to_field(hash_bytes)\n}\n\n// The nullifier of a l1 to l2 message is the hash of the message salted with the secret\npub fn compute_l1_to_l2_message_nullifier(message_hash: Field, secret: Field) -> Field {\n poseidon2_hash_with_separator([message_hash, secret], DOM_SEP__MESSAGE_NULLIFIER)\n}\n\n// Computes the hash of input arguments or return values for private functions, or for authwit creation.\npub fn hash_args<let N: u32>(args: [Field; N]) -> Field {\n if args.len() == 0 {\n 0\n } else {\n poseidon2_hash_with_separator(args, DOM_SEP__FUNCTION_ARGS)\n }\n}\n\n// Computes the hash of calldata for public functions.\npub fn hash_calldata_array<let N: u32>(calldata: [Field; N]) -> Field {\n poseidon2_hash_with_separator(calldata, DOM_SEP__PUBLIC_CALLDATA)\n}\n\n/// Computes the public bytecode commitment for a contract class. The commitment is `hash([(length | separator),\n/// ...bytecode])`.\n///\n/// @param packed_bytecode - The packed bytecode of the contract class. 0th word is the length in bytes.\n/// packed_bytecode is mutable so that we can avoid copying the array to construct one starting with first_field\n/// instead of length. @returns The public bytecode commitment.\npub fn compute_public_bytecode_commitment(\n mut packed_public_bytecode: [Field; MAX_PACKED_PUBLIC_BYTECODE_SIZE_IN_FIELDS],\n) -> Field {\n // First field element contains the length of the bytecode\n let bytecode_length_in_bytes: u32 = packed_public_bytecode[0] as u32;\n let bytecode_length_in_fields: u32 = (bytecode_length_in_bytes / 31) + (bytecode_length_in_bytes % 31 != 0) as u32;\n // Don't allow empty public bytecode. AVM doesn't handle execution of contracts that exist with empty bytecode.\n assert(bytecode_length_in_fields != 0);\n assert(bytecode_length_in_fields < MAX_PACKED_PUBLIC_BYTECODE_SIZE_IN_FIELDS);\n\n // Packed_bytecode's 0th entry is the length. Append it to the separator before hashing.\n let first_field = DOM_SEP__PUBLIC_BYTECODE.to_field() + (packed_public_bytecode[0] as u64 << 32) as Field;\n packed_public_bytecode[0] = first_field;\n\n // `fields_to_hash` is the number of fields from the start of `packed_public_bytecode` that should be included in\n // the hash. Fields after this length are ignored. +1 to account for the separator.\n let num_fields_to_hash = bytecode_length_in_fields + 1;\n\n poseidon2_hash_subarray(packed_public_bytecode, num_fields_to_hash)\n}\n"
|
|
2726
2726
|
},
|
|
2727
2727
|
"72": {
|
|
2728
2728
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/noir-contracts/contracts/protocol/aztec_sublib/src/oracle/avm.nr",
|
|
2729
|
-
"source": "//! AVM oracles.\n//!\n//! There are only available during public execution. Calling any of them from a private or utility function will\n//! result in runtime errors.\n\nuse crate::protocol::address::{AztecAddress, EthAddress};\n\npub unconstrained fn address() -> AztecAddress {\n address_opcode()\n}\npub unconstrained fn sender() -> AztecAddress {\n sender_opcode()\n}\npub unconstrained fn transaction_fee() -> Field {\n transaction_fee_opcode()\n}\npub unconstrained fn chain_id() -> Field {\n chain_id_opcode()\n}\npub unconstrained fn version() -> Field {\n version_opcode()\n}\npub unconstrained fn block_number() -> u32 {\n block_number_opcode()\n}\npub unconstrained fn timestamp() -> u64 {\n timestamp_opcode()\n}\npub unconstrained fn min_fee_per_l2_gas() -> u128 {\n min_fee_per_l2_gas_opcode()\n}\npub unconstrained fn min_fee_per_da_gas() -> u128 {\n min_fee_per_da_gas_opcode()\n}\npub unconstrained fn l2_gas_left() -> u32 {\n l2_gas_left_opcode()\n}\npub unconstrained fn da_gas_left() -> u32 {\n da_gas_left_opcode()\n}\npub unconstrained fn is_static_call() -> u1 {\n is_static_call_opcode()\n}\npub unconstrained fn note_hash_exists(note_hash: Field, leaf_index: u64) -> u1 {\n note_hash_exists_opcode(note_hash, leaf_index)\n}\npub unconstrained fn emit_note_hash(note_hash: Field) {\n emit_note_hash_opcode(note_hash)\n}\npub unconstrained fn nullifier_exists(siloed_nullifier: Field) -> u1 {\n nullifier_exists_opcode(siloed_nullifier)\n}\npub unconstrained fn emit_nullifier(nullifier: Field) {\n emit_nullifier_opcode(nullifier)\n}\npub unconstrained fn emit_public_log(message: [Field]) {\n emit_public_log_opcode(message)\n}\npub unconstrained fn l1_to_l2_msg_exists(msg_hash: Field, msg_leaf_index: u64) -> u1 {\n l1_to_l2_msg_exists_opcode(msg_hash, msg_leaf_index)\n}\npub unconstrained fn send_l2_to_l1_msg(recipient: EthAddress, content: Field) {\n send_l2_to_l1_msg_opcode(recipient, content)\n}\n\npub unconstrained fn call<let N: u32>(\n l2_gas_allocation: u32,\n da_gas_allocation: u32,\n address: AztecAddress,\n args: [Field; N],\n) {\n call_opcode(l2_gas_allocation, da_gas_allocation, address, N, args)\n}\n\npub unconstrained fn call_static<let N: u32>(\n l2_gas_allocation: u32,\n da_gas_allocation: u32,\n address: AztecAddress,\n args: [Field; N],\n) {\n call_static_opcode(l2_gas_allocation, da_gas_allocation, address, N, args)\n}\n\npub unconstrained fn calldata_copy<let N: u32>(cdoffset: u32, copy_size: u32) -> [Field; N] {\n calldata_copy_opcode(cdoffset, copy_size)\n}\n\n/// `success_copy` is placed immediately after the CALL opcode to get the success value\npub unconstrained fn success_copy() -> bool {\n success_copy_opcode()\n}\n\npub unconstrained fn returndata_size() -> u32 {\n returndata_size_opcode()\n}\n\npub unconstrained fn returndata_copy(rdoffset: u32, copy_size: u32) -> [Field] {\n returndata_copy_opcode(rdoffset, copy_size)\n}\n\n/// The additional prefix is to avoid clashing with the `return` Noir keyword.\npub unconstrained fn avm_return(returndata: [Field]) {\n return_opcode(returndata)\n}\n\n/// This opcode reverts using the exact data given. In general it should only be used to do rethrows, where the revert\n/// data is the same as the original revert data. For normal reverts, use Noir's `assert` which, on top of reverting,\n/// will also add an error selector to the revert data.\npub unconstrained fn revert(revertdata: [Field]) {\n revert_opcode(revertdata)\n}\n\npub unconstrained fn storage_read(storage_slot: Field, contract_address: Field) -> Field {\n storage_read_opcode(storage_slot, contract_address)\n}\n\npub unconstrained fn storage_write(storage_slot: Field, value: Field) {\n storage_write_opcode(storage_slot, value);\n}\n\n#[oracle(avmOpcodeAddress)]\nunconstrained fn address_opcode() -> AztecAddress {}\n\n#[oracle(avmOpcodeSender)]\nunconstrained fn sender_opcode() -> AztecAddress {}\n\n#[oracle(avmOpcodeTransactionFee)]\nunconstrained fn transaction_fee_opcode() -> Field {}\n\n#[oracle(avmOpcodeChainId)]\nunconstrained fn chain_id_opcode() -> Field {}\n\n#[oracle(avmOpcodeVersion)]\nunconstrained fn version_opcode() -> Field {}\n\n#[oracle(avmOpcodeBlockNumber)]\nunconstrained fn block_number_opcode() -> u32 {}\n\n#[oracle(avmOpcodeTimestamp)]\nunconstrained fn timestamp_opcode() -> u64 {}\n\n#[oracle(avmOpcodeMinFeePerL2Gas)]\nunconstrained fn min_fee_per_l2_gas_opcode() -> u128 {}\n\n#[oracle(avmOpcodeMinFeePerDaGas)]\nunconstrained fn min_fee_per_da_gas_opcode() -> u128 {}\n\n#[oracle(avmOpcodeL2GasLeft)]\nunconstrained fn l2_gas_left_opcode() -> u32 {}\n\n#[oracle(avmOpcodeDaGasLeft)]\nunconstrained fn da_gas_left_opcode() -> u32 {}\n\n#[oracle(avmOpcodeIsStaticCall)]\nunconstrained fn is_static_call_opcode() -> u1 {}\n\n#[oracle(avmOpcodeNoteHashExists)]\nunconstrained fn note_hash_exists_opcode(note_hash: Field, leaf_index: u64) -> u1 {}\n\n#[oracle(avmOpcodeEmitNoteHash)]\nunconstrained fn emit_note_hash_opcode(note_hash: Field) {}\n\n#[oracle(avmOpcodeNullifierExists)]\nunconstrained fn nullifier_exists_opcode(siloed_nullifier: Field) -> u1 {}\n\n#[oracle(avmOpcodeEmitNullifier)]\nunconstrained fn emit_nullifier_opcode(nullifier: Field) {}\n\n
|
|
2729
|
+
"source": "//! AVM oracles.\n//!\n//! There are only available during public execution. Calling any of them from a private or utility function will\n//! result in runtime errors.\n\nuse crate::protocol::address::{AztecAddress, EthAddress};\n\npub unconstrained fn address() -> AztecAddress {\n address_opcode()\n}\npub unconstrained fn sender() -> AztecAddress {\n sender_opcode()\n}\npub unconstrained fn transaction_fee() -> Field {\n transaction_fee_opcode()\n}\npub unconstrained fn chain_id() -> Field {\n chain_id_opcode()\n}\npub unconstrained fn version() -> Field {\n version_opcode()\n}\npub unconstrained fn block_number() -> u32 {\n block_number_opcode()\n}\npub unconstrained fn timestamp() -> u64 {\n timestamp_opcode()\n}\npub unconstrained fn min_fee_per_l2_gas() -> u128 {\n min_fee_per_l2_gas_opcode()\n}\npub unconstrained fn min_fee_per_da_gas() -> u128 {\n min_fee_per_da_gas_opcode()\n}\npub unconstrained fn l2_gas_left() -> u32 {\n l2_gas_left_opcode()\n}\npub unconstrained fn da_gas_left() -> u32 {\n da_gas_left_opcode()\n}\npub unconstrained fn is_static_call() -> u1 {\n is_static_call_opcode()\n}\npub unconstrained fn note_hash_exists(note_hash: Field, leaf_index: u64) -> u1 {\n note_hash_exists_opcode(note_hash, leaf_index)\n}\npub unconstrained fn emit_note_hash(note_hash: Field) {\n emit_note_hash_opcode(note_hash)\n}\npub unconstrained fn nullifier_exists(siloed_nullifier: Field) -> u1 {\n nullifier_exists_opcode(siloed_nullifier)\n}\npub unconstrained fn emit_nullifier(nullifier: Field) {\n emit_nullifier_opcode(nullifier)\n}\npub unconstrained fn emit_public_log(message: [Field]) {\n emit_public_log_opcode(message)\n}\npub unconstrained fn l1_to_l2_msg_exists(msg_hash: Field, msg_leaf_index: u64) -> u1 {\n l1_to_l2_msg_exists_opcode(msg_hash, msg_leaf_index)\n}\npub unconstrained fn send_l2_to_l1_msg(recipient: EthAddress, content: Field) {\n send_l2_to_l1_msg_opcode(recipient, content)\n}\n\npub unconstrained fn call<let N: u32>(\n l2_gas_allocation: u32,\n da_gas_allocation: u32,\n address: AztecAddress,\n args: [Field; N],\n) {\n call_opcode(l2_gas_allocation, da_gas_allocation, address, N, args)\n}\n\npub unconstrained fn call_static<let N: u32>(\n l2_gas_allocation: u32,\n da_gas_allocation: u32,\n address: AztecAddress,\n args: [Field; N],\n) {\n call_static_opcode(l2_gas_allocation, da_gas_allocation, address, N, args)\n}\n\npub unconstrained fn calldata_copy<let N: u32>(cdoffset: u32, copy_size: u32) -> [Field; N] {\n calldata_copy_opcode(cdoffset, copy_size)\n}\n\n/// `success_copy` is placed immediately after the CALL opcode to get the success value\npub unconstrained fn success_copy() -> bool {\n success_copy_opcode()\n}\n\npub unconstrained fn returndata_size() -> u32 {\n returndata_size_opcode()\n}\n\npub unconstrained fn returndata_copy(rdoffset: u32, copy_size: u32) -> [Field] {\n returndata_copy_opcode(rdoffset, copy_size)\n}\n\n/// The additional prefix is to avoid clashing with the `return` Noir keyword.\npub unconstrained fn avm_return(returndata: [Field]) {\n return_opcode(returndata)\n}\n\n/// This opcode reverts using the exact data given. In general it should only be used to do rethrows, where the revert\n/// data is the same as the original revert data. For normal reverts, use Noir's `assert` which, on top of reverting,\n/// will also add an error selector to the revert data.\npub unconstrained fn revert(revertdata: [Field]) {\n revert_opcode(revertdata)\n}\n\npub unconstrained fn storage_read(storage_slot: Field, contract_address: Field) -> Field {\n storage_read_opcode(storage_slot, contract_address)\n}\n\npub unconstrained fn storage_write(storage_slot: Field, value: Field) {\n storage_write_opcode(storage_slot, value);\n}\n\n#[oracle(avmOpcodeAddress)]\nunconstrained fn address_opcode() -> AztecAddress {}\n\n#[oracle(avmOpcodeSender)]\nunconstrained fn sender_opcode() -> AztecAddress {}\n\n#[oracle(avmOpcodeTransactionFee)]\nunconstrained fn transaction_fee_opcode() -> Field {}\n\n#[oracle(avmOpcodeChainId)]\nunconstrained fn chain_id_opcode() -> Field {}\n\n#[oracle(avmOpcodeVersion)]\nunconstrained fn version_opcode() -> Field {}\n\n#[oracle(avmOpcodeBlockNumber)]\nunconstrained fn block_number_opcode() -> u32 {}\n\n#[oracle(avmOpcodeTimestamp)]\nunconstrained fn timestamp_opcode() -> u64 {}\n\n#[oracle(avmOpcodeMinFeePerL2Gas)]\nunconstrained fn min_fee_per_l2_gas_opcode() -> u128 {}\n\n#[oracle(avmOpcodeMinFeePerDaGas)]\nunconstrained fn min_fee_per_da_gas_opcode() -> u128 {}\n\n#[oracle(avmOpcodeL2GasLeft)]\nunconstrained fn l2_gas_left_opcode() -> u32 {}\n\n#[oracle(avmOpcodeDaGasLeft)]\nunconstrained fn da_gas_left_opcode() -> u32 {}\n\n#[oracle(avmOpcodeIsStaticCall)]\nunconstrained fn is_static_call_opcode() -> u1 {}\n\n#[oracle(avmOpcodeNoteHashExists)]\nunconstrained fn note_hash_exists_opcode(note_hash: Field, leaf_index: u64) -> u1 {}\n\n#[oracle(avmOpcodeEmitNoteHash)]\nunconstrained fn emit_note_hash_opcode(note_hash: Field) {}\n\n#[oracle(avmOpcodeNullifierExists)]\nunconstrained fn nullifier_exists_opcode(siloed_nullifier: Field) -> u1 {}\n\n#[oracle(avmOpcodeEmitNullifier)]\nunconstrained fn emit_nullifier_opcode(nullifier: Field) {}\n\n#[oracle(avmOpcodeEmitPublicLog)]\nunconstrained fn emit_public_log_opcode(message: [Field]) {}\n\n#[oracle(avmOpcodeL1ToL2MsgExists)]\nunconstrained fn l1_to_l2_msg_exists_opcode(msg_hash: Field, msg_leaf_index: u64) -> u1 {}\n\n#[oracle(avmOpcodeSendL2ToL1Msg)]\nunconstrained fn send_l2_to_l1_msg_opcode(recipient: EthAddress, content: Field) {}\n\n#[oracle(avmOpcodeCalldataCopy)]\nunconstrained fn calldata_copy_opcode<let N: u32>(cdoffset: u32, copy_size: u32) -> [Field; N] {}\n\n#[oracle(avmOpcodeReturndataSize)]\nunconstrained fn returndata_size_opcode() -> u32 {}\n\n#[oracle(avmOpcodeReturndataCopy)]\nunconstrained fn returndata_copy_opcode(rdoffset: u32, copy_size: u32) -> [Field] {}\n\n#[oracle(avmOpcodeReturn)]\nunconstrained fn return_opcode(returndata: [Field]) {}\n\n#[oracle(avmOpcodeRevert)]\nunconstrained fn revert_opcode(revertdata: [Field]) {}\n\n// While the length parameter might seem unnecessary given that we have N we keep it around because at the AVM bytecode\n// level, we want to support non-comptime-known lengths for such opcodes, even if Noir code will not generally take\n// that route.\n#[oracle(avmOpcodeCall)]\nunconstrained fn call_opcode<let N: u32>(\n l2_gas_allocation: u32,\n da_gas_allocation: u32,\n address: AztecAddress,\n length: u32,\n args: [Field; N],\n) {}\n\n// While the length parameter might seem unnecessary given that we have N we keep it around because at the AVM bytecode\n// level, we want to support non-comptime-known lengths for such opcodes, even if Noir code will not generally take\n// that route.\n#[oracle(avmOpcodeStaticCall)]\nunconstrained fn call_static_opcode<let N: u32>(\n l2_gas_allocation: u32,\n da_gas_allocation: u32,\n address: AztecAddress,\n length: u32,\n args: [Field; N],\n) {}\n\n#[oracle(avmOpcodeSuccessCopy)]\nunconstrained fn success_copy_opcode() -> bool {}\n\n#[oracle(avmOpcodeStorageRead)]\nunconstrained fn storage_read_opcode(storage_slot: Field, contract_address: Field) -> Field {}\n\n#[oracle(avmOpcodeStorageWrite)]\nunconstrained fn storage_write_opcode(storage_slot: Field, value: Field) {}\n"
|
|
2730
2730
|
},
|
|
2731
2731
|
"73": {
|
|
2732
2732
|
"path": "/home/aztec-dev/aztec-packages/noir-projects/noir-contracts/contracts/protocol/aztec_sublib/src/oracle/call_private_function.nr",
|