@aztec/protocol-contracts 0.44.0 → 0.45.1
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.d.json.ts +3 -0
- package/artifacts/AuthRegistry.json +1 -0
- package/artifacts/ContractClassRegisterer.d.json.ts +3 -0
- package/artifacts/ContractClassRegisterer.json +1 -0
- package/artifacts/ContractInstanceDeployer.d.json.ts +3 -0
- package/artifacts/ContractInstanceDeployer.json +1 -0
- package/artifacts/GasToken.d.json.ts +3 -0
- package/artifacts/GasToken.json +1 -0
- package/artifacts/KeyRegistry.d.json.ts +3 -0
- package/artifacts/KeyRegistry.json +1 -0
- package/artifacts/MultiCallEntrypoint.d.json.ts +3 -0
- package/artifacts/MultiCallEntrypoint.json +1 -0
- package/dest/auth-registry/artifact.js +2 -2
- package/dest/class-registerer/artifact.js +2 -2
- package/dest/gas-token/artifact.js +2 -2
- package/dest/instance-deployer/artifact.js +2 -2
- package/dest/key-registry/artifact.js +2 -2
- package/dest/multi-call-entrypoint/artifact.js +2 -2
- package/package.json +7 -6
- package/src/auth-registry/artifact.ts +1 -1
- package/src/class-registerer/artifact.ts +1 -1
- package/src/gas-token/artifact.ts +1 -1
- package/src/instance-deployer/artifact.ts +1 -1
- package/src/key-registry/artifact.ts +1 -1
- package/src/multi-call-entrypoint/artifact.ts +1 -1
- package/dest/artifacts/AuthRegistry.json +0 -1
- package/dest/artifacts/ContractClassRegisterer.json +0 -1
- package/dest/artifacts/ContractInstanceDeployer.json +0 -1
- package/dest/artifacts/GasToken.json +0 -1
- package/dest/artifacts/KeyRegistry.json +0 -1
- package/dest/artifacts/MultiCallEntrypoint.json +0 -1
- package/src/artifacts/AuthRegistry.json +0 -1
- package/src/artifacts/ContractClassRegisterer.json +0 -1
- package/src/artifacts/ContractInstanceDeployer.json +0 -1
- package/src/artifacts/GasToken.json +0 -1
- package/src/artifacts/KeyRegistry.json +0 -1
- package/src/artifacts/MultiCallEntrypoint.json +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"transpiled":true,"noir_version":"0.31.0+10076d9663dcf40ac712df69e3a71a1bb54866e2","name":"GasToken","functions":[{"name":"_increase_public_balance","is_unconstrained":true,"custom_attributes":["aztec(public)","aztec(internal)"],"abi":{"error_types":{},"parameters":[{"name":"inputs","type":{"fields":[{"name":"args_hash","type":{"kind":"field"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"aztec::context::inputs::public_context_inputs::PublicContextInputs"},"visibility":"private"},{"name":"to","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"},"visibility":"private"},{"name":"amount","type":{"kind":"field"},"visibility":"private"}],"return_type":null},"bytecode":"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","debug_symbols":"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"},{"name":"set_portal","is_unconstrained":true,"custom_attributes":["aztec(public)"],"abi":{"error_types":{},"parameters":[{"name":"inputs","type":{"fields":[{"name":"args_hash","type":{"kind":"field"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"aztec::context::inputs::public_context_inputs::PublicContextInputs"},"visibility":"private"},{"name":"portal_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::eth_address::EthAddress"},"visibility":"private"}],"return_type":null},"bytecode":"H4sIAAAAAAAC/72WzW7TQBSFx0nTRKR14tAkzv+fx2mpWIKQkNiz5glAIIEELBAs4FF4B16kD8GeNRLbMufOz4njNpKlqiNNM75zvnvuzLjyZKquVMt0pWbKNURUrI7NT4T+QvmRGdRMj2IV+ZDGJKiadjJVlxGER2vz58ET5S0y1VDFBlVDvGSqUVYg47FVSM9Qn0Tb2muaUrS0tvXxmta25lLjqZkF3Qk1p8cyPMHQ9HiF+RSjpxHrqFsfkcUaEzHsbGVwbe3Vfm0aVFYBcWwU13sNplYB71Pm2LFWHavooNdCOjzGe48qPJ4WuWZThi23io4s8hwjLrK8+WitOJCtBleLRJLkMUa3Jnn+86pW3Kc2d7570wl2iyfYkRNsF08Qw4THlpjek2KeYXTbsfXk2HrwsAvpuoV0bNYNUt1UUlIsqcfXKMlU9Mr8PqQTxGe6ZoPqjNiZ1SR2KOh7hj3aFxSCPtE+0b5DXzPs0YGgEAyIDogOHPqFYY8OBYVgSHRIdOjQdwx7NBUUgpRoSjR16FuGPToSFIIR0RHRkUNfMuzRsaAQjImOiY4d+olhj04EhWBCdEJ0Yn8rI8btG8MenQoKwZTolOjUoV8Z9uhMUAhmRGdEZ+VCZ+EVOIAYtzcMe3QuKARzonOic4d+ZNijC0EhWBBdEF2UC12Et+YAYtyWDHt0KSgES6JLosuy2zJsS0VkXh0ZVEeG97KW9DBiNvs7wx5dCQrBiuiK6KrstgrncwAxbh8Y9uhaUAjWRNdE1w79zLBHN4JCsCG6IbopF7oJbhWR6b249Ksj8zsvzGz2D4Y9mgkKQUY0I5qV3bLwpldE0sOIfPb/8SOeCaj45a6Hi4lp2n/OTcajnWuKFitdtMpVyJhzBqvOKTrnZeDC3kgunP6R2TsoLiMRXiKELhX/tU9+uWAutZdtaWwnajaISe+Au9sF/i//7JS1V7BchJLionTYmy73Ru/dubgmXboU/v4Frb3PZTyQrkuTSLGZfXfCXc1qtCtHn0eOiIoXwjwUp1lcXiwuyXZnfFqItmKNY91S7vYydzuYi7V2k40NRukV+n+JxmtyCw0AAA==","debug_symbols":"7ZzdahpRFEbfxetQ5tv7/OZVSinmrwjBhMQUSsi7V6tjItpKgywdjndR98ze3wmLMwyL8zq6ub16+fF9Mr17eB5dfn0d3T9cj2eTh+n80+uo+6Luz7fPj+Pp4ovn2fhpNrp0eXcxup3eLP5M6e1idDe5vx1dWtXbxVa1sqdVtXLp1tUKZUd1dA+r6uiprqtr2FWs6n2xaU9xiV1eFZcY/GPxt4tFVmsoa2goa2woa2ooa24oa2koa+Wzqq6z5u7f4+fS3znX+D5GScvprRv09Br09Dbo6X3Q04dBTx8HPX067emTr6dPG9Nv11bv71s/bDq7a3Ms6/uG91pbLUo+L8r2opz43nqURfET3/SOsygnvhsdZ1FOfJM7zqKc+N55nEU5b8k7FuW8Je9YlHJelO1FOT+nbC9K2P9qIW8uyvIy+9xl/rnLwucu+8smUvpXRW6+9x9uqV8+ucLJvuAKuaGspaGstZ2ssWsoqxrKanzW/9h4VcN6T6/xw6sw7+f3gc8fBj5/HPj8aeDz54HPf4jnBXet5w9pY/5lkwo0SR3RREQTI5o40SQQTSLRJBFNMtGEID4RxGeC+EwQnwniM0F8JojPBPGZID4TxGeC+EwQXwjiC0F8IYgvBPGFIL4QxBeC+EIQXwjiC0F8JYivBPGVIL4SxFeC+EoQXwniK0F8JYivBPHqOqSLkC6GdHGkS0C6RKRLQrpkpEtBuiDsC2FfCPtC2BfCvhD2hbAvhH0h7AthXwj7hrBvCPuGsG8I+4awbwj7hrBvCPuGsG8I+46w7wj7jrDvCPuOsO8I+46w7wj7jrDvCPsBYT8g7AeE/YCwHxD2A8J+QNgPCPsBYT8g7EeE/YiwHxH2I8J+RNiPCPsRYT8i7CO6nhBfT4iwJ8TYE6LsCXH2hEh7Qqw9IdqeEG9PiLgnxNwTou4JcfeEyHtC7D0h+p4Qf0+IwCfE4BOi8Alx+IRIfEIsPiEanxCPT4jIJ8TkE6LyCXH5hMh8Qmw+ITqfEJ9PiNAnxOgTovQJcfqESH1CrD4hWp8Qr88Qr88Qr88Qr88Qr8+6gHSJSJeEdMlIl4J0QdhHvD5DvD5DvD5DvD5DvD5DvD5DvD5DvD5DvD5DvD5DvD5DvD5DvD5DvD5DvD5DvD5DvD5DvD5DvD5DvD5DvD5DvD5DvD5DvD5DvD5DvD5DvD5DvD5DvD5DvD5DvD5DvD5DvD5DvD5DvD5DvD47iNcXu/5ALcW09/itpP5k1ZjS+4lau48KDHldHLs9xSVZfwxYSZsHe63C5pbClpbC1obCHsT5HExYtRTWWwobWgobWwrb0kNFbOmh4iD6dMz9WdFKlk44bG0o7EFk8sGEVUthraWw3lLY0FLY2FLY1FLY3EbY+Yef46fJ+Or+9nl+yeK3l+n1bPIwXX2c/Xpc/jKv/Q0="},{"name":"compute_note_hash_and_optionally_a_nullifier","is_unconstrained":true,"custom_attributes":[],"abi":{"error_types":{},"parameters":[{"name":"contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"},"visibility":"private"},{"name":"nonce","type":{"kind":"field"},"visibility":"private"},{"name":"storage_slot","type":{"kind":"field"},"visibility":"private"},{"name":"note_type_id","type":{"kind":"field"},"visibility":"private"},{"name":"compute_nullifier","type":{"kind":"boolean"},"visibility":"private"},{"name":"serialized_note","type":{"kind":"array","length":0,"type":{"kind":"field"}},"visibility":"private"}],"return_type":{"abi_type":{"kind":"array","length":4,"type":{"kind":"field"}},"visibility":"public"}},"bytecode":"H4sIAAAAAAAA/+2b3U7bQBCF18GhBoOb2HGckEAIBaTehRSScMfLtM/d60p9haqss6Mclmm0UcdLVool5LG9O+ebsz+EyERqfSSvP5GJ2+Z8rN4f1ObFnGf/dzwI5po1yRkFwtkKhPMoEM5YkDNiOPU5NrFed3rNfVLr9fjuIXbWA30Ez9W2RLZqYgJ8eC1V6Wr2fAzJEVwZ8Ng8o7PGSc0zBEtNkXUbuEeFtuAe6RzBPdrBSCcxpgjX+5RskOXyvs4+XcOJyUXcKcT4bAzWxQ3V2Jav8bGRMXn1rqExqVcx+d42uRO4pjE4NbHgb44H1I7Mz6k1F2KIR9CW2pEfLWDVx7narJfTLf1iq18GbY6hn7230DWNtfaqa2J9btOeAPkb8HCm86byed+MTWx5l0JNGXgioz1f6fxn6u0RWdfXEGfAcy7Os1578nWux+4zsMvkfXrUXnUsr84srzJogwydBvyLQJdy03WH0ZbzYrHS2l0HL7oMT9ezF11GW9CLZ62dO3iRMzy5Zy9yRlvOi+U3rV04eFEwPIVnLwpGW86Lef0ZoOfgRY/h6Xn2osdoC66Rel6UDl6UDE/p2YuS0Rb04ofW7jt40Wd4+p696DPagl5819qVgxcVw1N59qJitAX3zvrzxcDBiwHDM/DsxYDRFvRirrWHDl4MGZ6hZy+GjLbgGqm1Lxy8uGB4Ljx7QXq7MvcCZK4CZC72gDmxYhntRb1/jhy8GDE8I89e4HcuuzCXe8CcWLGM9uJJa48dvBgzPGPPXpDersx5gMxFgMz9AJnLAJmrAJn3YT4nViyjvaz30EsHLy4ZnkvPXpDersx5gMyjAJmLPWBOrFhGe1l/N3fl4MUVw3Pl2QvS25V5ECBzdw+YEyuW0V4utPbEwYsJwzPx7AXp7co8DJC5CpB5FCBzESBzP0DmMkDmwxr0w5zvATO+e/S7UZ75c2rxkGfKYlQWYwpxBozU9kXJva+SWbWT1lTcj/X42POFrqeNas9XOu+XBmrSeW/l89Z/I9yZXPQO3y3j1b2JI+FxuoO8EejQ/RjiX9CW2pEftB8Qu36X68bE91v6Tax+GbS5gX63Vj+6prHW3v00cVNzy2Ved9RmLX8Fngb2wUd8J1eBV8pipGMCPNfyPA8N1TnDd/j+KNm1N7W8OrG8yqAN7tEftW8emA/M/2LGzxMncA956F7LqgX/v2EKOf4CARQXTpY1AAA=","debug_symbols":"ndpBattQGIXRvWhsiu9v6T3JWymlOIlTDMYOsVMoJnuv3dIF9Mz0JN3ZNzq82/Cyf/r48f1wej1fhu3X23A8P++uh/PpfroN6y81/3l7edudHi8u1937ddhuWl8N+9PL/anX52p4PRz3w7aWfH5bPUYLjDZrGUVGJaONjEYZTTJqMuoykiI2UsQoRYxSxChFjFLEKEWMUsQoRYxSxChFjFLEJEVMUsQkRUxSxCRFTFLEJEVMUsQkRUxSRJMimhTRpIgmRTQpokkRTYpoUkSTIpoU0aWILkV0KaJLEV2K6FJElyK6FNGliC5FzFLELEXMUsQsRcxSxCxFzFLELEXMUsQsRSxSxCJFLFLEIkUsUsQiRSxSxCJFLFLEIkVkvaZVaFW02tBqpNVEq0arTquZVtRGqI1QG6E2Qm2E2gi1EWoj1EaojVAbRW0UtVHURlEbRW0UtVHURlEbBJoh0QyRZsg0Q6gZUs0Qa4ZcMwSbIdkM0WbINkO4GdLNEG+GfDMEnCHhDBFnyDhDyBlSzhBzhpwzBJ0h6QxRZ8g6Q9gZ0s4Qd4a8MwSeIfEMkWfIPEPoGVLPEHuG3DMEnyH5DNFnyD5D+BnSzxB/hvwzBKAhAQ0RaMhAQwgaUtAQg4YcNAShIQkNUWjIQkMYGtLQEIeGPDQEoiERDZFoyERDKBpS0RCLhly0yEWLXLTIRYtctMhFi1y0yEWLXLTIRYtctMhFi1y0yEWLXLTIRYtctMhFi1y0yEWLXLTIRYtctMhFi1y0yEWLXLTIRYtctOyiJ7lokYsWuWiRixa5aJGLFrlo/beL3k8/d++H3dNx/7jb+/j4cXr+d9X3frz+evv75f7vbw=="},{"name":"balance_of_public","is_unconstrained":true,"custom_attributes":["aztec(public)","aztec(view)"],"abi":{"error_types":{},"parameters":[{"name":"inputs","type":{"fields":[{"name":"args_hash","type":{"kind":"field"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"aztec::context::inputs::public_context_inputs::PublicContextInputs"},"visibility":"private"},{"name":"owner","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"},"visibility":"private"}],"return_type":{"abi_type":{"kind":"field"},"visibility":"public"}},"bytecode":"H4sIAAAAAAAC/83YW2/rRBAH8E3itA1NHCd2mmvbtLFzT3NOKYgjKI8g8cojD4i7kLiJixBfkS8FO7M7+09qHVcrHVnHUmpnPD/P7tppM01VTamzQOntUtmNIipUJ3pXodfHSo70QVW/KqGqSCijk6SqmU1TNT6ixOBW/zjPlHFntffoRI2ukKoKpZ7UVcVUpHKqnvLhB/rVyGQ4p+Y8bQ36YXKInaU4oy/4id6/Y5JPbfJ5VjVBdQ52bnIa5pDpXwgLbTKlhCZoE7Rp6S8IC20xpYQWaAu0Zek3CAsNmVJCCBqChpb+ibDQNlNKaIO2QduW/oiw0IgpJUSgEWhk6a8IC+0wpYQOaAe0Y/Z50iwmutoUYaFdppTQBe2Cdi39GmGhMVNKiEFj0NjSrxAWmjClhAQ0AU0s/QlhoT2mlNAD7YH28svTc9U8SdOftIqJntN3CAu9YEoJF6AXoBeWfomw0D5TSuiD9kH7+YH23QNWQHS17xEWOmBKCQPQAeggX23gBlhAdLXfEBY6ZEoJQ9Ah6DBfbeh+x3iSrj9J/Enbn7T8SaeUKrE/aZYyl6iUgT1z9/UT/Q/CQkdMKWEEOgId5auN3DJ4kq4/6ZUysJY/if1JUgp5ZsX0U/AtwkLHTClhDDoGHeerjd1iFxBd7Q+EhU6YUsIEdAI6yVebuC8+niQupUrbn7RKmUtSChkWkxuKX+K7/yuGCl/45Rs+ZatMugB9xUBhu+RSl8elrgyemEM5Q83FFZKm6CFuTvjwxubf2h5lVuHEGYXoxSMemXcyXYrNMkm7RmFzomqCdFIqTGmvf1Sig2E9GfD7FTvbVyaH55gdtGkycm7dMKc65nSZqro63vgucHvHlewNqdnLNHiwE/MBlQs2Ds6bfZ4ExeRoSDKZqw+Dg5yauTNPx0vbtRkvreF1nQ8b9m2Qcjl1YzrJQJbXFPmI1sWt2C1WLD1esRmGl+oLfm4etZq95ZQ850nSpeZgc5OTmkPa50noT6Jiogf4O8JCF0wpYQG6AF3kqy3cb44Coqv9gLDQJVNKWIIuQZf5akv3J8iTdPzJ2J8k/iTyJ+Ebn76+Py8QFrpiSgkr0BXoKl9t5ap5kqY/ifxJWMpcYn+SlEKeWTH9FPyNsNA1U0pYg65B1/lqa/cp9SSjYqIHeIew0A1TStiAbkA3+Wobd2s9SeZPQn8S+ZO5P4n9ycKf9Eq5L2N/kpRyX8JS5vLMiunPzc8IC90ypYQt6BZ0m6+2df9r8iRjfxL6k87bOrDYn8zf1hXrlzKXyJ9s3vj09efmJcJCd0wpYQe6A93lq+3cn6gCQi1H9TP0HY8MFZoN6S4o23SxqbniYRd7x6XujkvtDd6ZQzlDjc0eSS/Rv9ybLvbe5r9ru9gH08U+UIhePOJPzTuZLpmHTNJeoLA5UTVBOikVaInvp/pKjwfDejJg7mJpto8YL3qy4LU92XRRtX0eN3YH+MS1lkT2PBVq2fZcym41c3FO22d2JVUjdN2jvlX1/55sZEwG0eCUD6f2rSn0xXGh0DS+lBYiu+KqBLaSTT8YoNobQMPa82MwlUFWHd+bsIyIMhrunyDTTFR1RoeDf+n1P22FxfXTHQAA","debug_symbols":"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"},{"name":"deploy","is_unconstrained":false,"custom_attributes":["aztec(private)"],"abi":{"error_types":{},"parameters":[{"name":"inputs","type":{"fields":[{"name":"call_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"storage_contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"function_selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"is_delegate_call","type":{"kind":"boolean"}},{"name":"is_static_call","type":{"kind":"boolean"}},{"name":"side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::call_context::CallContext"}},{"name":"historical_header","type":{"fields":[{"name":"last_archive","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"content_commitment","type":{"fields":[{"name":"num_txs","type":{"kind":"field"}},{"name":"txs_effects_hash","type":{"kind":"field"}},{"name":"in_hash","type":{"kind":"field"}},{"name":"out_hash","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::content_commitment::ContentCommitment"}},{"name":"state","type":{"fields":[{"name":"l1_to_l2_message_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"partial","type":{"fields":[{"name":"note_hash_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"nullifier_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"public_data_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}}],"kind":"struct","path":"authwit::aztec::protocol_types::partial_state_reference::PartialStateReference"}}],"kind":"struct","path":"authwit::aztec::protocol_types::state_reference::StateReference"}},{"name":"global_variables","type":{"fields":[{"name":"chain_id","type":{"kind":"field"}},{"name":"version","type":{"kind":"field"}},{"name":"block_number","type":{"kind":"field"}},{"name":"timestamp","type":{"kind":"integer","sign":"unsigned","width":64}},{"name":"coinbase","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::eth_address::EthAddress"}},{"name":"fee_recipient","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"gas_fees","type":{"fields":[{"name":"fee_per_da_gas","type":{"kind":"field"}},{"name":"fee_per_l2_gas","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_fees::GasFees"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::global_variables::GlobalVariables"}},{"name":"total_fees","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::header::Header"}},{"name":"tx_context","type":{"fields":[{"name":"chain_id","type":{"kind":"field"}},{"name":"version","type":{"kind":"field"}},{"name":"gas_settings","type":{"fields":[{"name":"gas_limits","type":{"fields":[{"name":"da_gas","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"l2_gas","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas::Gas"}},{"name":"teardown_gas_limits","type":{"fields":[{"name":"da_gas","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"l2_gas","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas::Gas"}},{"name":"max_fees_per_gas","type":{"fields":[{"name":"fee_per_da_gas","type":{"kind":"field"}},{"name":"fee_per_l2_gas","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_fees::GasFees"}},{"name":"inclusion_fee","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_settings::GasSettings"}}],"kind":"struct","path":"authwit::aztec::protocol_types::transaction::tx_context::TxContext"}},{"name":"start_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"aztec::context::inputs::private_context_inputs::PrivateContextInputs"},"visibility":"private"},{"name":"artifact_hash","type":{"kind":"field"},"visibility":"private"},{"name":"private_functions_root","type":{"kind":"field"},"visibility":"private"},{"name":"public_bytecode_commitment","type":{"kind":"field"},"visibility":"private"},{"name":"portal_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::eth_address::EthAddress"},"visibility":"private"}],"return_type":{"abi_type":{"fields":[{"name":"call_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"storage_contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"function_selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"is_delegate_call","type":{"kind":"boolean"}},{"name":"is_static_call","type":{"kind":"boolean"}},{"name":"side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::call_context::CallContext"}},{"name":"args_hash","type":{"kind":"field"}},{"name":"returns_hash","type":{"kind":"field"}},{"name":"min_revertible_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"is_fee_payer","type":{"kind":"boolean"}},{"name":"max_block_number","type":{"fields":[{"name":"_opt","type":{"fields":[{"name":"_is_some","type":{"kind":"boolean"}},{"name":"_value","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"std::option::Option"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::max_block_number::MaxBlockNumber"}},{"name":"note_hash_read_requests","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::read_request::ReadRequest"}}},{"name":"nullifier_read_requests","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::read_request::ReadRequest"}}},{"name":"key_validation_requests_and_generators","type":{"kind":"array","length":16,"type":{"fields":[{"name":"request","type":{"fields":[{"name":"pk_m","type":{"fields":[{"name":"x","type":{"kind":"field"}},{"name":"y","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::grumpkin_point::GrumpkinPoint"}},{"name":"sk_app","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::validation_requests::key_validation_request::KeyValidationRequest"}},{"name":"sk_app_generator","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::validation_requests::key_validation_request_and_generator::KeyValidationRequestAndGenerator"}}},{"name":"note_hashes","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::note_hash::NoteHash"}}},{"name":"nullifiers","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"note_hash","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::nullifier::Nullifier"}}},{"name":"private_call_requests","type":{"kind":"array","length":4,"type":{"fields":[{"name":"hash","type":{"kind":"field"}},{"name":"caller_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"storage_contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::caller_context::CallerContext"}},{"name":"start_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"end_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::private_call_request::PrivateCallRequest"}}},{"name":"public_call_stack_hashes","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"public_teardown_function_hash","type":{"kind":"field"}},{"name":"l2_to_l1_msgs","type":{"kind":"array","length":2,"type":{"fields":[{"name":"recipient","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::eth_address::EthAddress"}},{"name":"content","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::messaging::l2_to_l1_message::L2ToL1Message"}}},{"name":"start_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"end_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"note_encrypted_logs_hashes","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"length","type":{"kind":"field"}},{"name":"note_hash_counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::log_hash::NoteLogHash"}}},{"name":"encrypted_logs_hashes","type":{"kind":"array","length":4,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"length","type":{"kind":"field"}},{"name":"randomness","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::log_hash::EncryptedLogHash"}}},{"name":"unencrypted_logs_hashes","type":{"kind":"array","length":4,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"length","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::log_hash::LogHash"}}},{"name":"historical_header","type":{"fields":[{"name":"last_archive","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"content_commitment","type":{"fields":[{"name":"num_txs","type":{"kind":"field"}},{"name":"txs_effects_hash","type":{"kind":"field"}},{"name":"in_hash","type":{"kind":"field"}},{"name":"out_hash","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::content_commitment::ContentCommitment"}},{"name":"state","type":{"fields":[{"name":"l1_to_l2_message_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"partial","type":{"fields":[{"name":"note_hash_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"nullifier_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"public_data_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}}],"kind":"struct","path":"authwit::aztec::protocol_types::partial_state_reference::PartialStateReference"}}],"kind":"struct","path":"authwit::aztec::protocol_types::state_reference::StateReference"}},{"name":"global_variables","type":{"fields":[{"name":"chain_id","type":{"kind":"field"}},{"name":"version","type":{"kind":"field"}},{"name":"block_number","type":{"kind":"field"}},{"name":"timestamp","type":{"kind":"integer","sign":"unsigned","width":64}},{"name":"coinbase","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::eth_address::EthAddress"}},{"name":"fee_recipient","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"gas_fees","type":{"fields":[{"name":"fee_per_da_gas","type":{"kind":"field"}},{"name":"fee_per_l2_gas","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_fees::GasFees"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::global_variables::GlobalVariables"}},{"name":"total_fees","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::header::Header"}},{"name":"tx_context","type":{"fields":[{"name":"chain_id","type":{"kind":"field"}},{"name":"version","type":{"kind":"field"}},{"name":"gas_settings","type":{"fields":[{"name":"gas_limits","type":{"fields":[{"name":"da_gas","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"l2_gas","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas::Gas"}},{"name":"teardown_gas_limits","type":{"fields":[{"name":"da_gas","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"l2_gas","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas::Gas"}},{"name":"max_fees_per_gas","type":{"fields":[{"name":"fee_per_da_gas","type":{"kind":"field"}},{"name":"fee_per_l2_gas","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_fees::GasFees"}},{"name":"inclusion_fee","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_settings::GasSettings"}}],"kind":"struct","path":"authwit::aztec::protocol_types::transaction::tx_context::TxContext"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::private_circuit_public_inputs::PrivateCircuitPublicInputs"},"visibility":"public"}},"bytecode":"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","debug_symbols":"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3/vWne996873vnXne9+6871v3fnet+5y71t3ufetu9z71l3ufesu9751l3vfugv1c3+Ox3uMc7w+PvVzv3r8lfrJM8+Pj9nOy/ry+NRPnvrxqZ889eNTP3nqx6f2+/XjU/v9+vGpn/vVd6NX6ud+9fgbtd+vH5/a79ePT33r1o9PfevWj09969aPT33r1o9PfevWj09969aPf+9bd7v3rbvf+9bdv//WfePL+qXsx2rW8dM3Pz59JGYf7y5guruAuLuA+e4ClrsLWO8uYOMR8DjSznakaUDclR/VeBypfPqa/tlnKsdjVXqJn7+j/DhUYTzU+N2HQr4BMA3TvY8f9z7+fO/jL/c+/nrv42/3Pv5+6+OX4d7HL/c+/r1v3XLvW7fc+9Yt9751y71v3XLvW7fc+9Yt9751x3vfuuO9b93x3rfueO9bd7z3rTve+9Yd733rjve+dcd737rjvW/d6d637kT93K99SniaqJ/79eNTP3lqn5ScJuonT/341E+e6vGD+slTPz61368fn9rv149P/dyvfeBnCurnfv341H6/fnxqv18/PvWtWz8+9a1bPz71rVs9/kx969aPT33r1o9PfevWj3/vWxcyBaTj8e99687ff+u+8/HCYXt+HGz4vCvi+DjYvN5dwHZ3AfvNBSzD3QWUuwsY7y5g4hZwJPcPAeUnAa9+8rGh5dNQ2rIfdwZkgshtxM5KYrndwE8fDn/93yG3G2gQwO0GGgRwu4G6gJXbDTQI4HYDDQK43UCDAG43UP+ODWRST1cB3Ld2gwCim/hxJKK79XEkyG25H7six3msHKkciyXLp02Xn4+00x0JMv3mrSNBP00CmX7T8fjjvY8/3fv4ce/jz/c+/nLv46/3Pv527+Pvtz7+fu9bd7/3rbvf+9bd733rQubedDz+vW/d/d637n7vW3e/96273/rWjeHWt24Mt751Y7j1rRvDrW/dGG5968Zw61s3hlvfujHc+taN4da3bgz3vnXLvW/dQv3cr33hLwr1c79+fOonT+1LT1Gonzz141M/earHH6mfPPXjU/v9+vGp/X79+NTP/dpn92Okfu7Xj0/t9+vHp/b79eNT37r141PfuvXjU9+61eNP1Ldu/fjUt279+NS3bv349751MdNh+h3/3rfudO9bd7r3rTvd+9ad7n3rxr1v3fj+W/eNz2Rvy/o4x7bs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tow/afidd3M/FLPf6njF7B4ArzjkFLP7C7xidjeCV8zuXfCK2Z0OXjG7L4Irpt/+hlcs57noN6nhFct5LvqtZHjFcp6LfsMXXrGc56LfloVXLOe56DdP4RXLeS76LU54xXKei34jEl6xnOei3y6EVyznueg39eAVy3ku+q03eMVynot+gwxesZznot/Gglcs57noN5vgFct5LvotIXjFcp6LfuMGXrGc56LfXoFXLOe56DdB4BXLeS76rQp4xXKei35DAV6xnOein/aPVyznuegn5+MVy3ku+in0eMVynot+ojtesZznop+Ojlcs57noJ43jFct5Lvqp3XjFcp6LfgI2XrGc56KfJo1XLOe56CdK4xXLeS76qdJ4xXKei36yNF6xnOeiny6NVyznuegnTOMVy3ku+inTeMVynot+gjVesZznop+OjVcs57noJ2/jFct5Lvqp3njFcp6LfmI4XrGc56KfRo5XLOe56Ced4xXLeS76Kep4xXKei35CO16xnOein/6OV6zmuQr9ZHm8YjXPVeTm0Be5OfQfr5BTrOa5itwc+iI3h77IzaEvcnPoi9wc+iI3h77IzaEvcnPoi9wc+iI3h77IzaEvcnPoi9wc+iI3h77IzaEvcnPoi9wc+iI3h77IzaEvcnPoi9wc+iI3h77IzaEvcnPoi9wc+iI3h77IzaEvcnPoi9wc+iI3h77IzaEvcnPoi9wc+iI3h77IzaEvcnPoi9wc+iI3h77IzaEvTHPojzMRuaLjTES+5TgTkbM4zkR09z/OxDSx/DgT0f15nInohjvORHQHHWciuiWOMxE+x5mmTx9nInyOM01wPs5E+BxnmoJ8nInwOc40Sfg4E+FznGka73Emwuc400Tb40yEz3GmqbDHmQif40yTVY8zET7HmaaTHmcifI4zTfg8zkT4HGeaknmcifA5zjRp8jjTxc/xx++5egLj8XvKN/2e8Zt+z/RNvye+6ffM3/R7lm/6Pes3/Z7tm37PNz0P9m96Huzf9DzYv+l5sH/T82D/pufB/k3Pg/2bngf7Nz0P9m96Huzf8zwYh+Gbfk/5pt8zftPvmb7p98Q3/Z75m37P8k2/Z/2m37N90+/5pudB+abnQfmm50H5pudB+abnQfmm50H5pudB+abnQfmm50H5pudB+abnwfhNz4Pxm54H4zc9D8Zveh5Avsk5rnH8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SM09D6m55yE19zyk5p6H1NzzkJp7HlJzz0Nq7nlIzT0PqbnnITX3PKTmnofU3POQmnseUnPPQ2rueUjNPQ+puechNfc8pOaeh9Tc85Caex5Sc89Dau55SM09D6m55yE19zyk5p6H1NzzkJp7HlJzz0Nq7nlIzT2PTLOxP049HKce98rPfucc41jmQ+Efr3icYx//7k8exseLx2H9zG599ZO3/fjJY+UnzzH+eO0c0+vaJ3Ifrv2btQ/XXrb2iZypa/9m7RP5dNf+zdonSi2u/Zu1T5ThXPs3a58o0br279U+0y4O1/7N2id658i1f7P27uvp1t59vay13x4w5n1+Xftw7WVr776ebu3d19Otvft6WWu/Pmu/vK69+3q6tXdfT7b2mfbCufZv1t59Pd3au6+nW3v39bLWfn58TndeXn9ON9M+Sdf+zdq7r6dbe/f1dGvvvp5u7d3X0629+3qqtZ8z7Sh27d+svft6urV3X0+39u7r6dY+XHvZ2ruvp1t79/V0a+++nm7t3dfTrb37erK1L+7r6dbefT3d2ruvp1t79/V0ax+uvWzt3dfTrb37erq1d19Pt/bu6+nW3n092dqP7uvp1t59Pd3au6+nW3v39XRrH669bO3d19Otvft6urV3X0+39u7r6dbefT3Z2k/u6+nW3n093dqHa9+z9mWPR4nKvk/I2tf2ZsyT871u7Z3vdWvvfK9be+d73do738vWPpzvdWvvfK9be39uR7f2/tyObu3DtZetvft6WWtf2404h/t6urV3X0+39u7r6dbefb2sta/tSJtn9/V0a+++nm7t3dfTrb37erq1D9detvbu62WtffVzurP7erq1d19Pt/bu6+nW3n092dov7uvp1t59Pd3au6+nW3v39XRrH669bO3d19Otvft6urV3X0+39u7r6dbefT3Z2q/u6+nW3n093dq7r6dbe/f1dGsfrr1s7d3X0629+3q6tXdfT7f27uvp1t59Pdnab+7r6dbefT3d2ruvp1t79/V0ax+uvWzt3dfTrb37erq1d19Pt/bu6+nW3n092drv7uvp1t59Pd3au6+nW3v39XRr73yPrz10u8XuFM5eIWdl9go50XJXaBmcO9kr5HTIXiFnOPYKOWmxVyhcIfIK+dMI7BVyT4G9Qu4p9K1QbcfZMrinwF4h9xTIK1TcU2CvkHsKfStU28Gz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"},{"name":"claim_public","is_unconstrained":true,"custom_attributes":["aztec(public)"],"abi":{"error_types":{},"parameters":[{"name":"inputs","type":{"fields":[{"name":"args_hash","type":{"kind":"field"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"aztec::context::inputs::public_context_inputs::PublicContextInputs"},"visibility":"private"},{"name":"to","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"},"visibility":"private"},{"name":"amount","type":{"kind":"field"},"visibility":"private"},{"name":"secret","type":{"kind":"field"},"visibility":"private"},{"name":"leaf_index","type":{"kind":"field"},"visibility":"private"}],"return_type":null},"bytecode":"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","debug_symbols":"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"},{"name":"mint_public","is_unconstrained":true,"custom_attributes":["aztec(public)"],"abi":{"error_types":{},"parameters":[{"name":"inputs","type":{"fields":[{"name":"args_hash","type":{"kind":"field"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"aztec::context::inputs::public_context_inputs::PublicContextInputs"},"visibility":"private"},{"name":"to","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"},"visibility":"private"},{"name":"amount","type":{"kind":"field"},"visibility":"private"}],"return_type":null},"bytecode":"H4sIAAAAAAAC/+2aWW/jNhDH5StOE6/XSRPftyXbm/jKOnZ3m6YPfS7Qh770sQV6Ar3Q8zv26/S5aDkzHP7lKPGCi1YIijWgiBr+fxxyKIkaImGQC4LDfGB+ncD+zNVhUA4OzClDx/uBlkwha45MOcioKaJKorKRlQU5LpEwzyXjISgMzZ/jTaDOuPmgYI6DMCj8fednzEVRFOkoclEvDwfUwAmVthntc5l6Le2Voc44L0XrycodR60IcOj6pleFkILDIz6KVG0qc7Z4RH9EQ+29FaIGnoKYx2PxdCxHzrqiZkpR1laU0GBJNEdSpHMSye9Hdrqkg3lyk49pqL0nyf7S76n09ykdBS6W7GU5lBCeFPhcthNSESfvmePMRewUETvbjdjb6N6ZafBjcz4X8akVV3mQ51QCVhXNmRQZ/QVmRWuMkqAGtAa0ZtEfYFa0zigJ6kDrQOsW/QlmRRuMkqABtAG0YdHPYFa0ySgJmkCbQJsW/QpmRVuMkqAFtAW0ZdEvYFa0zSgJ2kDbQNsW7cOsaIdREnSAdoB2LPozzIp2GSVBF2gXaNei38KsaI9REvSA9oD25JxEav5I1R9p70fMmFYwK9pnlAR9oH2g/aS3vvO2BzHevodZ0QGjJBgAHQAdJL0NXAQ9kao/0vZHGv5INxXkFREz8/M7zIoOGSXBEOgQ6DDpbeie4j2I8fY5zIqOGCXBCOgI6MiiC5gVDRklQQg0BBomOxq6KfZEzv2Rqj9S80fq/kjDH2n6I61U5qXjj3RTmZdqKmN5RcTMc/MdzIpGjJIgAhoBjSz6K8yKjhklwRjoGOg42dGxG5snUvVH2o+1Yw1/pP4YImbugi9hVnTCKAkmQCdAJ0lvEzcmT6Tmj4T+SHs/YsJwBbOiU0ZJMAU6BTpNepu6JWsPQktv5iPkM7cMBkhiNGshNT+MwoacjunvGbt6tuvqQuCpFLWGEqYLiGbIi+YHXJxb/cIEghTLDAuXZKKDe/yhXOlwiVlGKruEY6nIipEq1cOMzn3T0gexbt3pMKfcNNpb9Be5XvnBXK8yydr8kRPGGHzgUlZCLngon1BpG8vSc9I4yy4iG8mgVHZZaeX+bYSyKAgtyzZCxV6Ko093Hck2ArdXhjrjvBBY4UmmikOxqoOiYHlbG9vBsC2o6yK3ULQtVALXvN2pUIz0BexsxLpULDhRAfdpe2cuSg/OxUUYr8lZ5yS6dC/LS8gv8XhcPoRUU0Fa/ki4HzHP048wKzpzT8cs9lQCnSW9zdyYPJF2Kl5qqXSs4Y8MU0FeYyyD/Yi5cb6BWdE5o/weBToHOk96m7sp3YMYb1/DrOiC0bmsC4ougC6S3hYuHJ5IbT9iOvgbzIrKKkOCJdAl0GXS29I96J5I3R8Z+yNdf6Tmjwz2I1SdDfDe7zB4z/fJcuf7ZLn7fbJiV6tdV1cCL6WoNXS/XEG0xvpxLav3tdVv7PfJVr5PtmSig9fav+RKh0vMNlLZcziWiqwYqVI9rOncNy39GevWnQ6775MONrxXLjYFxGZ15/skjNfk7MK6clNyfO+UrKzre5H8fgT9W7oN+ZVtZCnrO13SdntettlJdSJPm36erd3QrjC09e7QnofxmpyNFAfTba1cQ34tmjWCnkSq/kjNH6n7Iw1/pOmPtPyRtj/S8Ue6qcxLNZXh91Lx0v8fRayRyg2Tzj02SOWpHPojo1Sm8s07+c07+b+e/U4qEQv9kSiVsVQf6w1TTeURqz/WiI1TGUstlTv5NYY/+deXJFpKcz3kDbcMBrspQWDVki6upcV4urhhV5tdV7HkbIsaSky2EL1A/vFS0sWXVv+uTRdvJF28IRMd3OO2XOlwibmJVPYOHEtFVoxUqR5e0Llvrk9j3brTYU4XabS3WfyDmaRauq1LQSjet9mdf3CDtZzYYM1bkUSRvGwg3yC/p/ieTTXZo/NqRA7rf9DxD/Dv8iGuJwAA","debug_symbols":"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"},{"name":"claim","is_unconstrained":false,"custom_attributes":["aztec(private)"],"abi":{"error_types":{},"parameters":[{"name":"inputs","type":{"fields":[{"name":"call_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"storage_contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"function_selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"is_delegate_call","type":{"kind":"boolean"}},{"name":"is_static_call","type":{"kind":"boolean"}},{"name":"side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::call_context::CallContext"}},{"name":"historical_header","type":{"fields":[{"name":"last_archive","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"content_commitment","type":{"fields":[{"name":"num_txs","type":{"kind":"field"}},{"name":"txs_effects_hash","type":{"kind":"field"}},{"name":"in_hash","type":{"kind":"field"}},{"name":"out_hash","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::content_commitment::ContentCommitment"}},{"name":"state","type":{"fields":[{"name":"l1_to_l2_message_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"partial","type":{"fields":[{"name":"note_hash_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"nullifier_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"public_data_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}}],"kind":"struct","path":"authwit::aztec::protocol_types::partial_state_reference::PartialStateReference"}}],"kind":"struct","path":"authwit::aztec::protocol_types::state_reference::StateReference"}},{"name":"global_variables","type":{"fields":[{"name":"chain_id","type":{"kind":"field"}},{"name":"version","type":{"kind":"field"}},{"name":"block_number","type":{"kind":"field"}},{"name":"timestamp","type":{"kind":"integer","sign":"unsigned","width":64}},{"name":"coinbase","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::eth_address::EthAddress"}},{"name":"fee_recipient","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"gas_fees","type":{"fields":[{"name":"fee_per_da_gas","type":{"kind":"field"}},{"name":"fee_per_l2_gas","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_fees::GasFees"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::global_variables::GlobalVariables"}},{"name":"total_fees","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::header::Header"}},{"name":"tx_context","type":{"fields":[{"name":"chain_id","type":{"kind":"field"}},{"name":"version","type":{"kind":"field"}},{"name":"gas_settings","type":{"fields":[{"name":"gas_limits","type":{"fields":[{"name":"da_gas","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"l2_gas","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas::Gas"}},{"name":"teardown_gas_limits","type":{"fields":[{"name":"da_gas","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"l2_gas","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas::Gas"}},{"name":"max_fees_per_gas","type":{"fields":[{"name":"fee_per_da_gas","type":{"kind":"field"}},{"name":"fee_per_l2_gas","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_fees::GasFees"}},{"name":"inclusion_fee","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_settings::GasSettings"}}],"kind":"struct","path":"authwit::aztec::protocol_types::transaction::tx_context::TxContext"}},{"name":"start_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"aztec::context::inputs::private_context_inputs::PrivateContextInputs"},"visibility":"private"},{"name":"to","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"},"visibility":"private"},{"name":"amount","type":{"kind":"field"},"visibility":"private"},{"name":"secret","type":{"kind":"field"},"visibility":"private"}],"return_type":{"abi_type":{"fields":[{"name":"call_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"storage_contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"function_selector","type":{"fields":[{"name":"inner","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_selector::FunctionSelector"}},{"name":"is_delegate_call","type":{"kind":"boolean"}},{"name":"is_static_call","type":{"kind":"boolean"}},{"name":"side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::call_context::CallContext"}},{"name":"args_hash","type":{"kind":"field"}},{"name":"returns_hash","type":{"kind":"field"}},{"name":"min_revertible_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"is_fee_payer","type":{"kind":"boolean"}},{"name":"max_block_number","type":{"fields":[{"name":"_opt","type":{"fields":[{"name":"_is_some","type":{"kind":"boolean"}},{"name":"_value","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"std::option::Option"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::max_block_number::MaxBlockNumber"}},{"name":"note_hash_read_requests","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::read_request::ReadRequest"}}},{"name":"nullifier_read_requests","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::read_request::ReadRequest"}}},{"name":"key_validation_requests_and_generators","type":{"kind":"array","length":16,"type":{"fields":[{"name":"request","type":{"fields":[{"name":"pk_m","type":{"fields":[{"name":"x","type":{"kind":"field"}},{"name":"y","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::grumpkin_point::GrumpkinPoint"}},{"name":"sk_app","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::validation_requests::key_validation_request::KeyValidationRequest"}},{"name":"sk_app_generator","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::validation_requests::key_validation_request_and_generator::KeyValidationRequestAndGenerator"}}},{"name":"note_hashes","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::note_hash::NoteHash"}}},{"name":"nullifiers","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"note_hash","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::nullifier::Nullifier"}}},{"name":"private_call_requests","type":{"kind":"array","length":4,"type":{"fields":[{"name":"hash","type":{"kind":"field"}},{"name":"caller_context","type":{"fields":[{"name":"msg_sender","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"storage_contract_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::caller_context::CallerContext"}},{"name":"start_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"end_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::private_call_request::PrivateCallRequest"}}},{"name":"public_call_stack_hashes","type":{"kind":"array","length":16,"type":{"kind":"field"}}},{"name":"public_teardown_function_hash","type":{"kind":"field"}},{"name":"l2_to_l1_msgs","type":{"kind":"array","length":2,"type":{"fields":[{"name":"recipient","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::eth_address::EthAddress"}},{"name":"content","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::messaging::l2_to_l1_message::L2ToL1Message"}}},{"name":"start_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"end_side_effect_counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"note_encrypted_logs_hashes","type":{"kind":"array","length":16,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"length","type":{"kind":"field"}},{"name":"note_hash_counter","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::log_hash::NoteLogHash"}}},{"name":"encrypted_logs_hashes","type":{"kind":"array","length":4,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"length","type":{"kind":"field"}},{"name":"randomness","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::log_hash::EncryptedLogHash"}}},{"name":"unencrypted_logs_hashes","type":{"kind":"array","length":4,"type":{"fields":[{"name":"value","type":{"kind":"field"}},{"name":"counter","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"length","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::log_hash::LogHash"}}},{"name":"historical_header","type":{"fields":[{"name":"last_archive","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"content_commitment","type":{"fields":[{"name":"num_txs","type":{"kind":"field"}},{"name":"txs_effects_hash","type":{"kind":"field"}},{"name":"in_hash","type":{"kind":"field"}},{"name":"out_hash","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::content_commitment::ContentCommitment"}},{"name":"state","type":{"fields":[{"name":"l1_to_l2_message_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"partial","type":{"fields":[{"name":"note_hash_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"nullifier_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}},{"name":"public_data_tree","type":{"fields":[{"name":"root","type":{"kind":"field"}},{"name":"next_available_leaf_index","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot"}}],"kind":"struct","path":"authwit::aztec::protocol_types::partial_state_reference::PartialStateReference"}}],"kind":"struct","path":"authwit::aztec::protocol_types::state_reference::StateReference"}},{"name":"global_variables","type":{"fields":[{"name":"chain_id","type":{"kind":"field"}},{"name":"version","type":{"kind":"field"}},{"name":"block_number","type":{"kind":"field"}},{"name":"timestamp","type":{"kind":"integer","sign":"unsigned","width":64}},{"name":"coinbase","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::eth_address::EthAddress"}},{"name":"fee_recipient","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"gas_fees","type":{"fields":[{"name":"fee_per_da_gas","type":{"kind":"field"}},{"name":"fee_per_l2_gas","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_fees::GasFees"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::global_variables::GlobalVariables"}},{"name":"total_fees","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::header::Header"}},{"name":"tx_context","type":{"fields":[{"name":"chain_id","type":{"kind":"field"}},{"name":"version","type":{"kind":"field"}},{"name":"gas_settings","type":{"fields":[{"name":"gas_limits","type":{"fields":[{"name":"da_gas","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"l2_gas","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas::Gas"}},{"name":"teardown_gas_limits","type":{"fields":[{"name":"da_gas","type":{"kind":"integer","sign":"unsigned","width":32}},{"name":"l2_gas","type":{"kind":"integer","sign":"unsigned","width":32}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas::Gas"}},{"name":"max_fees_per_gas","type":{"fields":[{"name":"fee_per_da_gas","type":{"kind":"field"}},{"name":"fee_per_l2_gas","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_fees::GasFees"}},{"name":"inclusion_fee","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::gas_settings::GasSettings"}}],"kind":"struct","path":"authwit::aztec::protocol_types::transaction::tx_context::TxContext"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::private_circuit_public_inputs::PrivateCircuitPublicInputs"},"visibility":"public"}},"bytecode":"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","debug_symbols":"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"},{"name":"check_balance","is_unconstrained":true,"custom_attributes":["aztec(public)","aztec(view)"],"abi":{"error_types":{},"parameters":[{"name":"inputs","type":{"fields":[{"name":"args_hash","type":{"kind":"field"}},{"name":"is_static_call","type":{"kind":"boolean"}}],"kind":"struct","path":"aztec::context::inputs::public_context_inputs::PublicContextInputs"},"visibility":"private"},{"name":"fee_limit","type":{"kind":"field"},"visibility":"private"}],"return_type":null},"bytecode":"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","debug_symbols":"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"}],"outputs":{"globals":{"storage":[{"fields":[{"name":"balances","value":{"fields":[{"name":"slot","value":{"kind":"integer","sign":false,"value":"0000000000000000000000000000000000000000000000000000000000000001"}}],"kind":"struct"}},{"name":"portal_address","value":{"fields":[{"name":"slot","value":{"kind":"integer","sign":false,"value":"0000000000000000000000000000000000000000000000000000000000000002"}}],"kind":"struct"}}],"kind":"struct"}]},"structs":{"functions":[{"fields":[{"name":"parameters","type":{"fields":[{"name":"to","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"amount","type":{"kind":"field"}}],"kind":"struct","path":"GasToken::_increase_public_balance_parameters"}}],"kind":"struct","path":"GasToken::_increase_public_balance_abi"},{"fields":[{"name":"parameters","type":{"fields":[{"name":"owner","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}}],"kind":"struct","path":"GasToken::balance_of_public_parameters"}},{"name":"return_type","type":{"kind":"field"}}],"kind":"struct","path":"GasToken::balance_of_public_abi"},{"fields":[{"name":"parameters","type":{"fields":[{"name":"fee_limit","type":{"kind":"field"}}],"kind":"struct","path":"GasToken::check_balance_parameters"}}],"kind":"struct","path":"GasToken::check_balance_abi"},{"fields":[{"name":"parameters","type":{"fields":[{"name":"to","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"amount","type":{"kind":"field"}},{"name":"secret","type":{"kind":"field"}},{"name":"leaf_index","type":{"kind":"field"}}],"kind":"struct","path":"GasToken::claim_public_parameters"}}],"kind":"struct","path":"GasToken::claim_public_abi"},{"fields":[{"name":"parameters","type":{"fields":[{"name":"portal_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::eth_address::EthAddress"}}],"kind":"struct","path":"GasToken::set_portal_parameters"}}],"kind":"struct","path":"GasToken::set_portal_abi"},{"fields":[{"name":"parameters","type":{"fields":[{"name":"to","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"amount","type":{"kind":"field"}},{"name":"secret","type":{"kind":"field"}}],"kind":"struct","path":"GasToken::claim_parameters"}}],"kind":"struct","path":"GasToken::claim_abi"},{"fields":[{"name":"parameters","type":{"fields":[{"name":"artifact_hash","type":{"kind":"field"}},{"name":"private_functions_root","type":{"kind":"field"}},{"name":"public_bytecode_commitment","type":{"kind":"field"}},{"name":"portal_address","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::eth_address::EthAddress"}}],"kind":"struct","path":"GasToken::deploy_parameters"}}],"kind":"struct","path":"GasToken::deploy_abi"},{"fields":[{"name":"parameters","type":{"fields":[{"name":"to","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"name":"amount","type":{"kind":"field"}}],"kind":"struct","path":"GasToken::mint_public_parameters"}}],"kind":"struct","path":"GasToken::mint_public_abi"}]}},"file_map":{"120":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/hash.nr","source":"use dep::protocol_types::{\n address::{AztecAddress, EthAddress},\n constants::{\n GENERATOR_INDEX__SECRET_HASH, GENERATOR_INDEX__MESSAGE_NULLIFIER, ARGS_HASH_CHUNK_COUNT,\n GENERATOR_INDEX__FUNCTION_ARGS, ARGS_HASH_CHUNK_LENGTH, MAX_ARGS_LENGTH\n},\n traits::Hash, hash::{pedersen_hash, compute_siloed_nullifier, sha256_to_field}\n};\nuse crate::oracle::logs_traits::{LensForEncryptedLog, ToBytesForUnencryptedLog};\n\npub fn compute_secret_hash(secret: Field) -> Field {\n pedersen_hash([secret], GENERATOR_INDEX__SECRET_HASH)\n}\n\npub fn compute_unencrypted_log_hash<T, N, M>(\n contract_address: AztecAddress,\n log: T\n) -> Field where T: ToBytesForUnencryptedLog<N, M> {\n let message_bytes: [u8; N] = log.to_be_bytes_arr();\n // can't use N - not in scope error\n let n = message_bytes.len();\n let mut hash_bytes = [0; M];\n // Address is converted to 32 bytes in ts\n let address_bytes = contract_address.to_be_bytes_arr();\n for i in 0..32 {\n hash_bytes[i] = address_bytes[i];\n }\n let len_bytes = (n as Field).to_be_bytes(4);\n for i in 0..4 {\n hash_bytes[32 + i] = len_bytes[i];\n }\n for i in 0..n {\n hash_bytes[36 + i] = message_bytes[i];\n }\n\n sha256_to_field(hash_bytes)\n}\n\npub fn compute_message_hash(\n sender: EthAddress,\n chain_id: Field,\n recipient: AztecAddress,\n version: Field,\n content: Field,\n secret_hash: Field\n) -> Field {\n let mut hash_bytes = [0 as u8; 192];\n let sender_bytes = sender.to_field().to_be_bytes(32);\n let chain_id_bytes = chain_id.to_be_bytes(32);\n let recipient_bytes = recipient.to_field().to_be_bytes(32);\n let version_bytes = version.to_be_bytes(32);\n let content_bytes = content.to_be_bytes(32);\n let secret_hash_bytes = secret_hash.to_be_bytes(32);\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 }\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 and index of the message hash\n// in the L1 to L2 message tree\npub fn compute_message_nullifier(message_hash: Field, secret: Field, leaf_index: Field) -> Field {\n pedersen_hash(\n [message_hash, secret, leaf_index],\n GENERATOR_INDEX__MESSAGE_NULLIFIER\n )\n}\n\nstruct ArgsHasher {\n fields: [Field],\n}\n\nimpl Hash for ArgsHasher {\n fn hash(self) -> Field {\n hash_args(self.fields)\n }\n}\n\nimpl ArgsHasher {\n pub fn new() -> Self {\n Self { fields: [] }\n }\n\n pub fn add(&mut self, field: Field) {\n self.fields = self.fields.push_back(field);\n }\n\n pub fn add_multiple<N>(&mut self, fields: [Field; N]) {\n for i in 0..N {\n self.fields = self.fields.push_back(fields[i]);\n }\n }\n}\n\npub fn hash_args_array<N>(args: [Field; N]) -> Field {\n hash_args(args.as_slice())\n}\n\npub fn hash_args(args: [Field]) -> Field {\n if args.len() == 0 {\n 0\n } else {\n assert(args.len() <= MAX_ARGS_LENGTH, \"Args length exceeds maximum\");\n let mut chunks_hashes = [0; ARGS_HASH_CHUNK_COUNT];\n let mut current_chunk_values = [0; ARGS_HASH_CHUNK_LENGTH];\n\n let mut current_chunk_index = 0;\n let mut index_inside_current_chunk = 0;\n for i in 0..args.len() {\n current_chunk_values[index_inside_current_chunk] = args[i];\n index_inside_current_chunk+=1;\n if index_inside_current_chunk == ARGS_HASH_CHUNK_LENGTH {\n chunks_hashes[current_chunk_index] = pedersen_hash(current_chunk_values, GENERATOR_INDEX__FUNCTION_ARGS);\n current_chunk_values = [0; ARGS_HASH_CHUNK_LENGTH];\n current_chunk_index+=1;\n index_inside_current_chunk = 0;\n }\n }\n if index_inside_current_chunk > 0 {\n chunks_hashes[current_chunk_index] = pedersen_hash(current_chunk_values, GENERATOR_INDEX__FUNCTION_ARGS);\n }\n pedersen_hash(chunks_hashes, GENERATOR_INDEX__FUNCTION_ARGS)\n }\n}\n\n#[test]\nfn compute_var_args_hash() {\n let mut input = ArgsHasher::new();\n for i in 0..MAX_ARGS_LENGTH {\n input.add(i as Field);\n }\n let hash = input.hash();\n assert(hash == 0x11e40f2a780822f7971803048c9a2100579de352e7dadd99981760964da65b57);\n}\n\n#[test]\nfn compute_unenc_log_hash_array() {\n let contract_address = AztecAddress::from_field(0x233a3e0df23b2b15b324194cb4a151f26c0b7333250781d34cc269d85dc334c6);\n let log = [\n 0x20660de09f35f876e3e69d227b2a35166ad05f09d82d06366ec9b6f65a51fec2,\n 0x1b52bfe3b8689761916f76dc3d38aa8810860db325cd39ca611eed980091f01c,\n 0x2e559c4045c378a56ad13b9edb1e8de4e7ad3b3aa35cc7ba9ec77f7a68fa43a4,\n 0x25d0f689c4a4178a29d59306f2675824d19be6d25e44fa03b03f49c263053dd2,\n 0x2d513a722d6f352dc0961f156afdc5e31495b9f0e35cb069261a8e55e2df67fd\n ];\n let hash = compute_unencrypted_log_hash(contract_address, log);\n assert(hash == 0x0095b2d17ab72f4b27a341f7ac63e49ec73935ae8c9181a0ac02023eb12f3284);\n}\n\n#[test]\nfn compute_unenc_log_hash_addr() {\n let contract_address = AztecAddress::from_field(0x233a3e0df23b2b15b324194cb4a151f26c0b7333250781d34cc269d85dc334c6);\n let log = AztecAddress::from_field(0x26aa302d4715fd8a687453cb26d616b0768027bd54bcae56b09d908ecd9f8303);\n let hash = compute_unencrypted_log_hash(contract_address, log);\n assert(hash == 0x0083ab647dfb26e7ddee90a0f4209d049d4660cab42000c544b986aaa84c55a3);\n}\n\n#[test]\nfn compute_unenc_log_hash_str() {\n let contract_address = AztecAddress::from_field(0x1b401e1146c5c507962287065c81f0ef7590adae3802c533d7549d6bf0a41bd8);\n let log = \"dummy\";\n let hash = compute_unencrypted_log_hash(contract_address, log);\n assert(hash == 0x00629e88ebd6374f44aa6cfe07e251ecf07213ebc7267e8f6b578ae57ffd6c20);\n}\n\n#[test]\nfn compute_unenc_log_hash_longer_str() {\n let contract_address = AztecAddress::from_field(0x1b401e1146c5c507962287065c81f0ef7590adae3802c533d7549d6bf0a41bd8);\n let log = \"Hello this is a string\";\n let hash = compute_unencrypted_log_hash(contract_address, log);\n assert(hash == 0x0098637962f7d34fa202b7ffad8a07a238c5d1fd897b82a108f7f467fa73b841);\n}\n"},"124":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/oracle/arguments.nr","source":"#[oracle(packArgumentsArray)]\nunconstrained fn pack_arguments_array_oracle<N>(_args: [Field; N]) -> Field {}\n\n#[oracle(packArguments)]\nunconstrained fn pack_arguments_oracle(_args: [Field]) -> Field {}\n\n/// - Pack arguments (array version) will notify the simulator that these arguments will be used later at\n/// some point in the call. \n/// - When the external call is made later, the simulator will know what the values unpack to.\n/// - This oracle will not be required in public vm functions, as the vm will keep track of arguments \n/// itself.\nunconstrained pub fn pack_arguments_array<N>(args: [Field; N]) -> Field {\n pack_arguments_array_oracle(args)\n}\n\n/// - Pack arguments (slice version) will notify the simulator that these arguments will be used later at\n/// some point in the call. \n/// - When the external call is made later, the simulator will know what the values unpack to.\n/// - This oracle will not be required in public vm functions, as the vm will keep track of arguments \n/// itself.\nunconstrained pub fn pack_arguments(args: [Field]) -> Field {\n pack_arguments_oracle(args)\n}\n\n"},"127":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/oracle/get_public_data_witness.nr","source":"use dep::protocol_types::{\n constants::PUBLIC_DATA_TREE_HEIGHT, hash::pedersen_hash,\n public_data_tree_leaf_preimage::PublicDataTreeLeafPreimage, traits::{Hash, Serialize},\n utils::arr_copy_slice\n};\n\nglobal LEAF_PREIMAGE_LENGTH: u32 = 4;\nglobal PUBLIC_DATA_WITNESS: Field = 45;\n\nstruct PublicDataWitness {\n index: Field,\n leaf_preimage: PublicDataTreeLeafPreimage,\n path: [Field; PUBLIC_DATA_TREE_HEIGHT],\n}\n\n#[oracle(getPublicDataTreeWitness)]\nunconstrained fn get_public_data_witness_oracle(\n _block_number: u32,\n _leaf_slot: Field\n) -> [Field; PUBLIC_DATA_WITNESS] {}\n\nunconstrained pub fn get_public_data_witness(block_number: u32, leaf_slot: Field) -> PublicDataWitness {\n let fields = get_public_data_witness_oracle(block_number, leaf_slot);\n PublicDataWitness {\n index: fields[0],\n leaf_preimage: PublicDataTreeLeafPreimage { slot: fields[1], value: fields[2], next_index: fields[3] as u32, next_slot: fields[4] },\n path: arr_copy_slice(fields, [0; PUBLIC_DATA_TREE_HEIGHT], 1 + LEAF_PREIMAGE_LENGTH)\n }\n}\n"},"134":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/oracle/call_private_function.nr","source":"use dep::protocol_types::{\n abis::{function_selector::FunctionSelector, private_call_stack_item::PrivateCallStackItem},\n address::AztecAddress, constants::PRIVATE_CALL_STACK_ITEM_LENGTH\n};\n\n#[oracle(callPrivateFunction)]\nunconstrained fn call_private_function_oracle(\n _contract_address: AztecAddress,\n _function_selector: FunctionSelector,\n _args_hash: Field,\n _start_side_effect_counter: u32,\n _is_static_call: bool,\n _is_delegate_call: bool\n) -> [Field; PRIVATE_CALL_STACK_ITEM_LENGTH] {}\n\nunconstrained pub fn call_private_function_internal(\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n start_side_effect_counter: u32,\n is_static_call: bool,\n is_delegate_call: bool\n) -> PrivateCallStackItem {\n let fields = call_private_function_oracle(\n contract_address,\n function_selector,\n args_hash,\n start_side_effect_counter,\n is_static_call,\n is_delegate_call\n );\n\n PrivateCallStackItem::deserialize(fields)\n}\n"},"138":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/oracle/get_contract_instance.nr","source":"use dep::protocol_types::{\n address::AztecAddress, contract_instance::ContractInstance, utils::arr_copy_slice,\n constants::CONTRACT_INSTANCE_LENGTH, utils::reader::Reader\n};\n\n#[oracle(getContractInstance)]\nunconstrained fn get_contract_instance_oracle(_address: AztecAddress) -> [Field; CONTRACT_INSTANCE_LENGTH] {}\n\n// Returns a ContractInstance plus a boolean indicating whether the instance was found.\n#[oracle(avmOpcodeGetContractInstance)]\nunconstrained fn get_contract_instance_oracle_avm(_address: AztecAddress) -> [Field; CONTRACT_INSTANCE_LENGTH + 1] {}\n\nunconstrained fn get_contract_instance_internal(address: AztecAddress) -> [Field; CONTRACT_INSTANCE_LENGTH] {\n get_contract_instance_oracle(address)\n}\n\nunconstrained pub fn get_contract_instance_internal_avm(address: AztecAddress) -> [Field; CONTRACT_INSTANCE_LENGTH + 1] {\n get_contract_instance_oracle_avm(address)\n}\n\npub fn get_contract_instance(address: AztecAddress) -> ContractInstance {\n let instance = ContractInstance::deserialize(get_contract_instance_internal(address));\n assert(instance.to_address().eq(address));\n instance\n}\n\npub fn get_contract_instance_avm(address: AztecAddress) -> Option<ContractInstance> {\n let mut reader = Reader::new(get_contract_instance_internal_avm(address));\n let found = reader.read();\n if found == 0 {\n Option::none()\n } else {\n Option::some(reader.read_struct(ContractInstance::deserialize))\n }\n}\n"},"139":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/oracle/enqueue_public_function_call.nr","source":"use dep::protocol_types::{\n abis::{\n function_selector::FunctionSelector, public_call_stack_item::PublicCallStackItem,\n function_data::FunctionData, public_circuit_public_inputs::PublicCircuitPublicInputs,\n call_context::CallContext, read_request::ReadRequest, note_hash::NoteHash, nullifier::Nullifier,\n log_hash::LogHash, global_variables::GlobalVariables, gas::Gas\n},\n contrakt::{storage_read::StorageRead, storage_update_request::StorageUpdateRequest},\n messaging::l2_to_l1_message::L2ToL1Message, header::Header, address::AztecAddress,\n utils::reader::Reader,\n constants::{\n MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_CALL, MAX_NOTE_HASH_READ_REQUESTS_PER_CALL,\n MAX_NOTE_HASHES_PER_CALL, MAX_L2_TO_L1_MSGS_PER_CALL, MAX_NULLIFIERS_PER_CALL,\n MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL, MAX_PUBLIC_DATA_READS_PER_CALL,\n MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL, MAX_NULLIFIER_READ_REQUESTS_PER_CALL,\n MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_CALL, MAX_UNENCRYPTED_LOGS_PER_CALL,\n ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_LENGTH\n}\n};\n\n#[oracle(enqueuePublicFunctionCall)]\nunconstrained fn enqueue_public_function_call_oracle(\n _contract_address: AztecAddress,\n _function_selector: FunctionSelector,\n _args_hash: Field,\n _side_effect_counter: u32,\n _is_static_call: bool,\n _is_delegate_call: bool\n) -> [Field; ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_LENGTH] {}\n\nunconstrained pub fn enqueue_public_function_call_internal(\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n side_effect_counter: u32,\n is_static_call: bool,\n is_delegate_call: bool\n) -> [Field; ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_LENGTH] {\n enqueue_public_function_call_oracle(\n contract_address,\n function_selector,\n args_hash,\n side_effect_counter,\n is_static_call,\n is_delegate_call\n )\n}\n\n#[oracle(setPublicTeardownFunctionCall)]\nunconstrained fn set_public_teardown_function_call_oracle(\n _contract_address: AztecAddress,\n _function_selector: FunctionSelector,\n _args_hash: Field,\n _side_effect_counter: u32,\n _is_static_call: bool,\n _is_delegate_call: bool\n) -> [Field; ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_LENGTH] {}\n\nunconstrained pub fn set_public_teardown_function_call_internal(\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n side_effect_counter: u32,\n is_static_call: bool,\n is_delegate_call: bool\n) -> [Field; ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_LENGTH] {\n set_public_teardown_function_call_oracle(\n contract_address,\n function_selector,\n args_hash,\n side_effect_counter,\n is_static_call,\n is_delegate_call\n )\n}\n\npub fn parse_public_call_stack_item_from_oracle(fields: [Field; ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_LENGTH]) -> PublicCallStackItem {\n let mut reader = Reader::new(fields);\n\n // Note: Not using PublicCirclePublicInputs::deserialize here, because everything below args_hash is 0 and\n // there is no more data in fields because there is only ENQUEUE_PUBLIC_FUNCTION_CALL_RETURN_SIZE fields!\n // WARNING: if updating, see comment in public_call_stack_item.ts's PublicCallStackItem.hash()\n let item = PublicCallStackItem {\n contract_address: AztecAddress::from_field(reader.read()),\n function_data: FunctionData { selector: FunctionSelector::from_field(reader.read()), is_private: false },\n public_inputs: PublicCircuitPublicInputs {\n call_context: reader.read_struct(CallContext::deserialize),\n args_hash: reader.read(),\n returns_hash: 0,\n note_hash_read_requests: [ReadRequest::empty(); MAX_NOTE_HASH_READ_REQUESTS_PER_CALL],\n nullifier_read_requests: [ReadRequest::empty(); MAX_NULLIFIER_READ_REQUESTS_PER_CALL],\n nullifier_non_existent_read_requests: [ReadRequest::empty(); MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_CALL],\n l1_to_l2_msg_read_requests: [ReadRequest::empty(); MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_CALL],\n contract_storage_update_requests: [StorageUpdateRequest::empty(); MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL],\n contract_storage_reads: [StorageRead::empty(); MAX_PUBLIC_DATA_READS_PER_CALL],\n public_call_stack_hashes: [0; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL],\n note_hashes: [NoteHash::empty(); MAX_NOTE_HASHES_PER_CALL],\n nullifiers: [Nullifier::empty(); MAX_NULLIFIERS_PER_CALL],\n l2_to_l1_msgs: [L2ToL1Message::empty(); MAX_L2_TO_L1_MSGS_PER_CALL],\n start_side_effect_counter: 0,\n end_side_effect_counter: 0,\n unencrypted_logs_hashes: [LogHash::empty(); MAX_UNENCRYPTED_LOGS_PER_CALL],\n historical_header: Header::empty(),\n global_variables: GlobalVariables::empty(),\n prover_address: AztecAddress::zero(),\n revert_code: 0,\n start_gas_left: Gas::empty(),\n end_gas_left: Gas::empty(),\n transaction_fee: 0\n },\n is_execution_request: true\n };\n reader.finish();\n\n item\n}\n"},"142":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/oracle/get_l1_to_l2_membership_witness.nr","source":"use dep::protocol_types::{address::AztecAddress};\n\nglobal L1_TO_L2_MESSAGE_ORACLE_CALL_LENGTH: u64 = 17;\n\n// Obtains membership witness (index and sibling path) for a message in the L1 to L2 message tree.\n#[oracle(getL1ToL2MembershipWitness)]\nunconstrained fn get_l1_to_l2_membership_witness_oracle(\n _contract_address: AztecAddress,\n _message_hash: Field,\n _secret: Field\n) -> [Field; L1_TO_L2_MESSAGE_ORACLE_CALL_LENGTH] {}\n\nunconstrained pub fn get_l1_to_l2_membership_witness(\n contract_address: AztecAddress,\n message_hash: Field,\n secret: Field\n) -> [Field; L1_TO_L2_MESSAGE_ORACLE_CALL_LENGTH] {\n get_l1_to_l2_membership_witness_oracle(contract_address, message_hash, secret)\n}\n"},"143":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/state_vars/map.nr","source":"use dep::protocol_types::{hash::pedersen_hash, storage::map::derive_storage_slot_in_map, traits::ToField};\nuse crate::state_vars::storage::Storage;\n\n// docs:start:map\nstruct Map<K, V, Context> {\n context: Context,\n storage_slot: Field,\n state_var_constructor: fn(Context, Field) -> V,\n}\n// docs:end:map\n\nimpl<K, T, Context> Storage<T> for Map<K, T, Context> {}\n\nimpl<K, V, Context> Map<K, V, Context> {\n // docs:start:new\n pub fn new(\n context: Context,\n storage_slot: Field,\n state_var_constructor: fn(Context, Field) -> V\n ) -> Self {\n assert(storage_slot != 0, \"Storage slot 0 not allowed. Storage slots must start from 1.\");\n Map { context, storage_slot, state_var_constructor }\n }\n // docs:end:new\n\n // docs:start:at\n pub fn at(self, key: K) -> V where K: ToField {\n // TODO(#1204): use a generator index for the storage slot\n let derived_storage_slot = derive_storage_slot_in_map(self.storage_slot, key);\n\n let state_var_constructor = self.state_var_constructor;\n state_var_constructor(self.context, derived_storage_slot)\n }\n // docs:end:at\n}\n"},"145":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/state_vars/public_mutable.nr","source":"use crate::context::{PublicContext, UnconstrainedContext};\nuse crate::oracle::storage::storage_read;\nuse dep::protocol_types::traits::{Deserialize, Serialize};\nuse crate::state_vars::storage::Storage;\n\n// docs:start:public_mutable_struct\nstruct PublicMutable<T, Context> {\n context: Context,\n storage_slot: Field,\n}\n// docs:end:public_mutable_struct\n\nimpl<T, Context> Storage<T> for PublicMutable<T, Context> {}\n\nimpl<T, Context> PublicMutable<T, Context> {\n // docs:start:public_mutable_struct_new\n pub fn new(\n // Note: Passing the contexts to new(...) just to have an interface compatible with a Map.\n context: Context,\n storage_slot: Field\n ) -> Self {\n assert(storage_slot != 0, \"Storage slot 0 not allowed. Storage slots must start from 1.\");\n PublicMutable { context, storage_slot }\n }\n // docs:end:public_mutable_struct_new\n}\n\nimpl<T> PublicMutable<T, &mut PublicContext> {\n // docs:start:public_mutable_struct_read\n pub fn read<T_SERIALIZED_LEN>(self) -> T where T: Deserialize<T_SERIALIZED_LEN> {\n self.context.storage_read(self.storage_slot)\n }\n // docs:end:public_mutable_struct_read\n\n // docs:start:public_mutable_struct_write\n pub fn write<T_SERIALIZED_LEN>(self, value: T) where T: Serialize<T_SERIALIZED_LEN> {\n self.context.storage_write(self.storage_slot, value);\n }\n // docs:end:public_mutable_struct_write\n}\n\nimpl<T> PublicMutable<T, UnconstrainedContext> {\n unconstrained pub fn read<T_SERIALIZED_LEN>(self) -> T where T: Deserialize<T_SERIALIZED_LEN> {\n self.context.storage_read(self.storage_slot)\n }\n}\n"},"148":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/state_vars/shared_immutable.nr","source":"use crate::{\n context::{PrivateContext, PublicContext, UnconstrainedContext}, oracle::storage::storage_read,\n state_vars::storage::Storage\n};\nuse dep::protocol_types::{constants::INITIALIZATION_SLOT_SEPARATOR, traits::{Deserialize, Serialize}};\n\n// Just like PublicImmutable but with the ability to read from private functions.\nstruct SharedImmutable<T, Context>{\n context: Context,\n storage_slot: Field,\n}\n\nimpl<T, Context> Storage<T> for SharedImmutable<T, Context> {}\n\nimpl<T, Context> SharedImmutable<T, Context> {\n pub fn new(\n // Note: Passing the contexts to new(...) just to have an interface compatible with a Map.\n context: Context,\n storage_slot: Field\n ) -> Self {\n assert(storage_slot != 0, \"Storage slot 0 not allowed. Storage slots must start from 1.\");\n Self { context, storage_slot }\n }\n}\n\nimpl<T> SharedImmutable<T, &mut PublicContext> {\n // Intended to be only called once. \n pub fn initialize<T_SERIALIZED_LEN>(self, value: T) where T: Serialize<T_SERIALIZED_LEN> {\n // We check that the struct is not yet initialized by checking if the initialization slot is 0\n let initialization_slot = INITIALIZATION_SLOT_SEPARATOR + self.storage_slot;\n let init_field: Field = self.context.storage_read(initialization_slot);\n assert(init_field == 0, \"SharedImmutable already initialized\");\n\n // We populate the initialization slot with a non-zero value to indicate that the struct is initialized\n self.context.storage_write(initialization_slot, 0xdead);\n self.context.storage_write(self.storage_slot, value);\n }\n\n pub fn read_public<T_SERIALIZED_LEN>(self) -> T where T: Deserialize<T_SERIALIZED_LEN> {\n self.context.storage_read(self.storage_slot)\n }\n}\n\nimpl<T> SharedImmutable<T, UnconstrainedContext> {\n unconstrained pub fn read_public<T_SERIALIZED_LEN>(self) -> T where T: Deserialize<T_SERIALIZED_LEN> {\n self.context.storage_read(self.storage_slot)\n }\n}\n\nimpl<T> SharedImmutable<T, &mut PrivateContext> {\n pub fn read_private<T_SERIALIZED_LEN>(self) -> T where T: Deserialize<T_SERIALIZED_LEN> {\n let header = self.context.get_header();\n let mut fields = [0; T_SERIALIZED_LEN];\n\n for i in 0..fields.len() {\n fields[i] =\n header.public_storage_historical_read(\n self.storage_slot + i as Field,\n (*self.context).this_address()\n );\n }\n T::deserialize(fields)\n }\n}\n"},"166":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/gas.nr","source":"use crate::{\n abis::function_selector::FunctionSelector, address::{EthAddress, AztecAddress},\n constants::{GAS_LENGTH, FIXED_DA_GAS, FIXED_L2_GAS}, hash::pedersen_hash,\n traits::{Deserialize, Hash, Serialize, Empty}, abis::side_effect::Ordered, utils::reader::Reader,\n abis::gas_fees::GasFees\n};\nuse std::ops::{Add, Sub};\n\nstruct Gas {\n da_gas: u32,\n l2_gas: u32,\n}\n\nimpl Gas {\n pub fn new(da_gas: u32, l2_gas: u32) -> Self {\n Self { da_gas, l2_gas }\n }\n\n pub fn tx_overhead() -> Self {\n Self { da_gas: FIXED_DA_GAS, l2_gas: FIXED_L2_GAS }\n }\n\n pub fn compute_fee(self, fees: GasFees) -> Field {\n (self.da_gas as Field) * fees.fee_per_da_gas + (self.l2_gas as Field) * fees.fee_per_l2_gas\n }\n\n pub fn is_empty(self) -> bool {\n (self.da_gas == 0) & (self.l2_gas == 0)\n }\n\n pub fn within(self, limits: Gas) -> bool {\n (self.da_gas <= limits.da_gas) & (self.l2_gas <= limits.l2_gas)\n }\n}\n\nimpl Add for Gas {\n fn add(self, other: Gas) -> Self {\n Gas::new(self.da_gas + other.da_gas, self.l2_gas + other.l2_gas)\n }\n}\n\nimpl Sub for Gas {\n fn sub(self, other: Gas) -> Self {\n Gas::new(self.da_gas - other.da_gas, self.l2_gas - other.l2_gas)\n }\n}\n\nimpl Serialize<GAS_LENGTH> for Gas {\n fn serialize(self) -> [Field; GAS_LENGTH] {\n [self.da_gas as Field, self.l2_gas as Field]\n }\n}\n\nimpl Deserialize<GAS_LENGTH> for Gas {\n fn deserialize(serialized: [Field; GAS_LENGTH]) -> Gas {\n Gas::new(serialized[0] as u32, serialized[1] as u32)\n }\n}\n\nimpl Eq for Gas {\n fn eq(self, other : Gas) -> bool {\n (self.da_gas == other.da_gas) & (self.l2_gas == other.l2_gas)\n }\n}\n\nimpl Empty for Gas {\n fn empty() -> Self {\n Gas::new(0, 0)\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let item = Gas::empty();\n let serialized = item.serialize();\n let deserialized = Gas::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n\n"},"168":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/note_hash.nr","source":"use crate::{\n abis::read_request::ScopedReadRequest, address::AztecAddress,\n abis::side_effect::{Ordered, OrderedValue, Readable, Scoped},\n constants::{NOTE_HASH_LENGTH, SCOPED_NOTE_HASH_LENGTH}, traits::{Empty, Serialize, Deserialize},\n utils::{arrays::array_concat, reader::Reader}\n};\n\nstruct NoteHash {\n value: Field,\n counter: u32,\n}\n\nimpl Ordered for NoteHash {\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl Eq for NoteHash {\n fn eq(self, other: NoteHash) -> bool {\n (self.value == other.value)\n & (self.counter == other.counter) \n }\n}\n\nimpl Empty for NoteHash {\n fn empty() -> Self {\n NoteHash {\n value: 0,\n counter: 0,\n }\n }\n}\n\nimpl Serialize<NOTE_HASH_LENGTH> for NoteHash {\n fn serialize(self) -> [Field; NOTE_HASH_LENGTH] {\n [self.value, self.counter as Field]\n }\n}\n\nimpl Deserialize<NOTE_HASH_LENGTH> for NoteHash {\n fn deserialize(values: [Field; NOTE_HASH_LENGTH]) -> Self {\n Self {\n value: values[0],\n counter: values[1] as u32,\n }\n }\n}\n\nimpl NoteHash {\n pub fn scope(self, contract_address: AztecAddress) -> ScopedNoteHash {\n ScopedNoteHash { note_hash: self, contract_address }\n }\n}\n\nstruct ScopedNoteHash {\n note_hash: NoteHash,\n contract_address: AztecAddress,\n}\n\nimpl Scoped<NoteHash> for ScopedNoteHash {\n fn inner(self) -> NoteHash {\n self.note_hash\n }\n fn contract_address(self) -> AztecAddress {\n self.contract_address\n }\n}\n\nimpl Ordered for ScopedNoteHash {\n fn counter(self) -> u32 {\n self.note_hash.counter\n }\n}\n\nimpl OrderedValue<Field> for ScopedNoteHash {\n fn value(self) -> Field {\n self.note_hash.value\n }\n fn counter(self) -> u32 {\n self.note_hash.counter\n }\n}\n\nimpl Eq for ScopedNoteHash {\n fn eq(self, other: ScopedNoteHash) -> bool {\n (self.note_hash == other.note_hash)\n & (self.contract_address == other.contract_address)\n }\n}\n\nimpl Empty for ScopedNoteHash {\n fn empty() -> Self {\n ScopedNoteHash {\n note_hash: NoteHash::empty(),\n contract_address: AztecAddress::zero(),\n }\n }\n}\n\nimpl Serialize<SCOPED_NOTE_HASH_LENGTH> for ScopedNoteHash {\n fn serialize(self) -> [Field; SCOPED_NOTE_HASH_LENGTH] {\n array_concat(self.note_hash.serialize(), [self.contract_address.to_field()])\n }\n}\n\nimpl Deserialize<SCOPED_NOTE_HASH_LENGTH> for ScopedNoteHash {\n fn deserialize(values: [Field; SCOPED_NOTE_HASH_LENGTH]) -> Self {\n let mut reader = Reader::new(values);\n let res = Self {\n note_hash: reader.read_struct(NoteHash::deserialize),\n contract_address: reader.read_struct(AztecAddress::deserialize),\n };\n reader.finish();\n res\n }\n}\n\nimpl Readable for ScopedNoteHash {\n fn assert_match_read_request(self, read_request: ScopedReadRequest) {\n assert_eq(self.note_hash.value, read_request.value(), \"Value of the note hash does not match read request\");\n assert_eq(self.contract_address, read_request.contract_address, \"Contract address of the note hash does not match read request\");\n assert(\n read_request.counter() > self.note_hash.counter, \"Read request counter must be greater than the counter of the note hash\"\n );\n }\n}\n\nimpl ScopedNoteHash {\n pub fn expose_to_public(self) -> NoteHash {\n // Hide the actual counter when exposing it to the public kernel.\n NoteHash { value: self.note_hash.value, counter: 0 }\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let item = NoteHash::empty();\n let serialized = item.serialize();\n let deserialized = NoteHash::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n\n#[test]\nfn serialization_of_empty_scoped() {\n let item = ScopedNoteHash::empty();\n let serialized = item.serialize();\n let deserialized = ScopedNoteHash::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n"},"169":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/gas_fees.nr","source":"use crate::{\n abis::function_selector::FunctionSelector, address::{EthAddress, AztecAddress},\n constants::GAS_FEES_LENGTH, hash::pedersen_hash, traits::{Deserialize, Hash, Serialize, Empty},\n abis::side_effect::Ordered, utils::reader::Reader\n};\n\nstruct GasFees {\n fee_per_da_gas: Field,\n fee_per_l2_gas: Field,\n}\n\nimpl GasFees {\n pub fn new(fee_per_da_gas: Field, fee_per_l2_gas: Field) -> Self {\n Self { fee_per_da_gas, fee_per_l2_gas }\n }\n\n pub fn default() -> Self {\n GasFees::new(1, 1)\n }\n\n pub fn is_empty(self) -> bool {\n (self.fee_per_da_gas == 0) & (self.fee_per_l2_gas == 0)\n }\n}\n\nimpl Serialize<GAS_FEES_LENGTH> for GasFees {\n fn serialize(self) -> [Field; GAS_FEES_LENGTH] {\n [self.fee_per_da_gas, self.fee_per_l2_gas]\n }\n}\n\nimpl Deserialize<GAS_FEES_LENGTH> for GasFees {\n fn deserialize(serialized: [Field; GAS_FEES_LENGTH]) -> GasFees {\n GasFees::new(serialized[0], serialized[1])\n }\n}\n\nimpl Eq for GasFees {\n fn eq(self, other : GasFees) -> bool {\n (self.fee_per_da_gas == other.fee_per_da_gas) & (self.fee_per_l2_gas == other.fee_per_l2_gas)\n }\n}\n\nimpl Empty for GasFees {\n fn empty() -> Self {\n GasFees::new(0, 0)\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let item = GasFees::empty();\n let serialized = item.serialize();\n let deserialized = GasFees::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n"},"170":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/public_call_stack_item.nr","source":"use crate::abis::{function_data::FunctionData, public_circuit_public_inputs::PublicCircuitPublicInputs};\nuse crate::address::AztecAddress;\nuse crate::constants::GENERATOR_INDEX__CALL_STACK_ITEM;\nuse crate::traits::Hash;\n\nstruct PublicCallStackItem {\n contract_address: AztecAddress,\n public_inputs: PublicCircuitPublicInputs,\n function_data: FunctionData,\n // True if this call stack item represents a request to execute a function rather than a\n // fulfilled execution. Used when enqueuing calls from private to public functions.\n is_execution_request: bool,\n}\n\nimpl Hash for PublicCallStackItem {\n fn hash(self) -> Field {\n let item = if self.is_execution_request {\n self.as_execution_request()\n } else {\n self\n };\n\n std::hash::pedersen_hash_with_separator([\n item.contract_address.to_field(),\n item.function_data.hash(),\n item.public_inputs.hash(),\n ], GENERATOR_INDEX__CALL_STACK_ITEM)\n }\n}\n\nimpl PublicCallStackItem {\n fn as_execution_request(self) -> Self {\n // WARNING: if updating, see comment in public_call_stack_item.ts's `PublicCallStackItem.hash()`\n let public_inputs = self.public_inputs;\n let mut request_public_inputs = PublicCircuitPublicInputs::empty();\n request_public_inputs.call_context = public_inputs.call_context;\n request_public_inputs.args_hash = public_inputs.args_hash;\n\n let call_stack_item = PublicCallStackItem {\n contract_address: self.contract_address,\n function_data: self.function_data,\n is_execution_request: true,\n public_inputs: request_public_inputs\n };\n call_stack_item\n }\n}\n\nmod tests {\n use crate::{\n abis::{\n function_data::FunctionData, function_selector::FunctionSelector, note_hash::NoteHash,\n public_circuit_public_inputs::PublicCircuitPublicInputs,\n public_call_stack_item::PublicCallStackItem\n },\n address::AztecAddress, constants::GENERATOR_INDEX__CALL_STACK_ITEM, traits::Hash\n };\n\n #[test]\n fn compute_call_stack_item_request_hash() {\n let contract_address = AztecAddress::from_field(1);\n let function_data = FunctionData { selector: FunctionSelector::from_u32(2), is_private: false };\n\n let mut public_inputs = PublicCircuitPublicInputs::empty();\n public_inputs.note_hashes[0] = NoteHash {\n value: 1,\n counter: 0,\n };\n\n let call_stack_item = PublicCallStackItem { contract_address, public_inputs, is_execution_request: true, function_data };\n\n // Value from public_call_stack_item.test.ts \"Computes a callstack item request hash\" test\n let test_data_call_stack_item_request_hash = 0x022a2b82af83606ae5a8d4955ef6215e54025193356318aefbde3b5026952953;\n assert_eq(call_stack_item.hash(), test_data_call_stack_item_request_hash);\n }\n\n #[test]\n fn compute_call_stack_item_hash() {\n let contract_address = AztecAddress::from_field(1);\n let function_data = FunctionData { selector: FunctionSelector::from_u32(2), is_private: false };\n\n let mut public_inputs = PublicCircuitPublicInputs::empty();\n public_inputs.note_hashes[0] = NoteHash {\n value: 1,\n counter: 0,\n };\n\n let call_stack_item = PublicCallStackItem { contract_address, public_inputs, is_execution_request: false, function_data };\n\n // Value from public_call_stack_item.test.ts \"Computes a callstack item hash\" test\n let test_data_call_stack_item_hash = 0x23a1d22e7bf37df7d68e8fcbfb7e016c060194b7915e3771e2dcd72cea26e427;\n assert_eq(call_stack_item.hash(), test_data_call_stack_item_hash);\n }\n}\n"},"171":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_circuit_public_inputs.nr","source":"use crate::{\n abis::{\n call_context::CallContext, max_block_number::MaxBlockNumber, gas_settings::GasSettings,\n validation_requests::KeyValidationRequestAndGenerator, note_hash::NoteHash, nullifier::Nullifier,\n private_call_request::PrivateCallRequest, read_request::ReadRequest,\n log_hash::{LogHash, NoteLogHash, EncryptedLogHash}\n},\n constants::{\n MAX_NOTE_HASH_READ_REQUESTS_PER_CALL, MAX_NULLIFIER_READ_REQUESTS_PER_CALL,\n MAX_KEY_VALIDATION_REQUESTS_PER_CALL, MAX_NOTE_HASHES_PER_CALL, MAX_NULLIFIERS_PER_CALL,\n MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL, MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL,\n MAX_L2_TO_L1_MSGS_PER_CALL, PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH,\n GENERATOR_INDEX__PRIVATE_CIRCUIT_PUBLIC_INPUTS, MAX_ENCRYPTED_LOGS_PER_CALL,\n MAX_UNENCRYPTED_LOGS_PER_CALL, MAX_NOTE_ENCRYPTED_LOGS_PER_CALL\n},\n header::Header, hash::pedersen_hash, messaging::l2_to_l1_message::L2ToL1Message,\n traits::{Deserialize, Hash, Serialize, Empty}, utils::reader::Reader,\n transaction::tx_context::TxContext, utils::arrays::validate_array\n};\n\nstruct PrivateCircuitPublicInputsArrayLengths {\n note_hash_read_requests: u32,\n nullifier_read_requests: u32,\n key_validation_requests_and_generators: u32,\n note_hashes: u32,\n nullifiers: u32,\n l2_to_l1_msgs: u32,\n private_call_requests: u32,\n public_call_stack_hashes: u32,\n note_encrypted_logs_hashes: u32,\n encrypted_logs_hashes: u32,\n unencrypted_logs_hashes: u32,\n}\n\nimpl PrivateCircuitPublicInputsArrayLengths {\n pub fn new(public_inputs: PrivateCircuitPublicInputs) -> Self {\n PrivateCircuitPublicInputsArrayLengths {\n note_hash_read_requests: validate_array(public_inputs.note_hash_read_requests),\n nullifier_read_requests: validate_array(public_inputs.nullifier_read_requests),\n key_validation_requests_and_generators: validate_array(public_inputs.key_validation_requests_and_generators),\n note_hashes: validate_array(public_inputs.note_hashes),\n nullifiers: validate_array(public_inputs.nullifiers),\n l2_to_l1_msgs: validate_array(public_inputs.l2_to_l1_msgs),\n private_call_requests: validate_array(public_inputs.private_call_requests),\n public_call_stack_hashes: validate_array(public_inputs.public_call_stack_hashes),\n note_encrypted_logs_hashes: validate_array(public_inputs.note_encrypted_logs_hashes),\n encrypted_logs_hashes: validate_array(public_inputs.encrypted_logs_hashes),\n unencrypted_logs_hashes: validate_array(public_inputs.unencrypted_logs_hashes)\n }\n }\n}\n\nstruct PrivateCircuitPublicInputs {\n call_context: CallContext,\n\n args_hash: Field,\n returns_hash: Field,\n\n min_revertible_side_effect_counter: u32,\n is_fee_payer: bool,\n\n max_block_number: MaxBlockNumber,\n\n note_hash_read_requests: [ReadRequest; MAX_NOTE_HASH_READ_REQUESTS_PER_CALL],\n nullifier_read_requests: [ReadRequest; MAX_NULLIFIER_READ_REQUESTS_PER_CALL],\n key_validation_requests_and_generators: [KeyValidationRequestAndGenerator; MAX_KEY_VALIDATION_REQUESTS_PER_CALL],\n\n note_hashes: [NoteHash; MAX_NOTE_HASHES_PER_CALL],\n nullifiers: [Nullifier; MAX_NULLIFIERS_PER_CALL],\n private_call_requests: [PrivateCallRequest; MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL],\n public_call_stack_hashes: [Field; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL],\n public_teardown_function_hash: Field,\n l2_to_l1_msgs: [L2ToL1Message; MAX_L2_TO_L1_MSGS_PER_CALL],\n\n start_side_effect_counter : u32,\n end_side_effect_counter : u32,\n note_encrypted_logs_hashes: [NoteLogHash; MAX_NOTE_ENCRYPTED_LOGS_PER_CALL],\n encrypted_logs_hashes: [EncryptedLogHash; MAX_ENCRYPTED_LOGS_PER_CALL],\n unencrypted_logs_hashes: [LogHash; MAX_UNENCRYPTED_LOGS_PER_CALL],\n\n // Header of a block whose state is used during private execution (not the block the transaction is included in).\n historical_header: Header,\n\n // Note: The chain_id and version here are not redundant to the values in self.historical_header.global_variables because\n // they can be different in case of a protocol upgrade. In such a situation we could be using header from a block\n // before the upgrade took place but be using the updated protocol to execute and prove the transaction.\n tx_context: TxContext,\n}\n\nimpl Eq for PrivateCircuitPublicInputs {\n fn eq(self, other: Self) -> bool {\n self.call_context.eq(other.call_context) &\n self.args_hash.eq(other.args_hash) &\n (self.returns_hash == other.returns_hash) &\n (self.min_revertible_side_effect_counter == other.min_revertible_side_effect_counter) &\n (self.is_fee_payer == other.is_fee_payer) &\n (self.max_block_number == other.max_block_number) &\n (self.note_hash_read_requests == other.note_hash_read_requests) &\n (self.nullifier_read_requests == other.nullifier_read_requests) &\n (self.key_validation_requests_and_generators == other.key_validation_requests_and_generators) &\n (self.note_hashes == other.note_hashes) &\n (self.nullifiers == other.nullifiers) &\n (self.private_call_requests == other.private_call_requests) &\n (self.public_call_stack_hashes == other.public_call_stack_hashes) &\n (self.l2_to_l1_msgs == other.l2_to_l1_msgs) &\n (self.start_side_effect_counter == other.start_side_effect_counter) &\n (self.end_side_effect_counter == other.end_side_effect_counter) &\n (self.note_encrypted_logs_hashes == other.note_encrypted_logs_hashes) &\n (self.encrypted_logs_hashes == other.encrypted_logs_hashes) &\n (self.unencrypted_logs_hashes == other.unencrypted_logs_hashes) &\n self.historical_header.eq(other.historical_header) &\n self.tx_context.eq(other.tx_context)\n }\n}\n\nimpl Serialize<PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH> for PrivateCircuitPublicInputs {\n fn serialize(self) -> [Field; PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH] {\n let mut fields: BoundedVec<Field, PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH> = BoundedVec::new();\n fields.extend_from_array(self.call_context.serialize());\n fields.push(self.args_hash);\n fields.push(self.returns_hash);\n\n fields.push(self.min_revertible_side_effect_counter as Field);\n fields.push(if self.is_fee_payer { 1 } else { 0 } as Field);\n\n fields.extend_from_array(self.max_block_number.serialize());\n\n for i in 0..self.note_hash_read_requests.len() {\n fields.extend_from_array(self.note_hash_read_requests[i].serialize());\n }\n for i in 0..self.nullifier_read_requests.len() {\n fields.extend_from_array(self.nullifier_read_requests[i].serialize());\n }\n for i in 0..self.key_validation_requests_and_generators.len() {\n fields.extend_from_array(self.key_validation_requests_and_generators[i].serialize());\n }\n for i in 0..self.note_hashes.len() {\n fields.extend_from_array(self.note_hashes[i].serialize());\n }\n for i in 0..self.nullifiers.len() {\n fields.extend_from_array(self.nullifiers[i].serialize());\n }\n for i in 0..self.private_call_requests.len() {\n fields.extend_from_array(self.private_call_requests[i].serialize());\n }\n fields.extend_from_array(self.public_call_stack_hashes);\n fields.push(self.public_teardown_function_hash);\n for i in 0..self.l2_to_l1_msgs.len() {\n fields.extend_from_array(self.l2_to_l1_msgs[i].serialize());\n }\n fields.push(self.start_side_effect_counter as Field);\n fields.push(self.end_side_effect_counter as Field);\n for i in 0..self.note_encrypted_logs_hashes.len() {\n fields.extend_from_array(self.note_encrypted_logs_hashes[i].serialize());\n }\n for i in 0..self.encrypted_logs_hashes.len() {\n fields.extend_from_array(self.encrypted_logs_hashes[i].serialize());\n }\n for i in 0..self.unencrypted_logs_hashes.len() {\n fields.extend_from_array(self.unencrypted_logs_hashes[i].serialize());\n }\n fields.extend_from_array(self.historical_header.serialize());\n fields.extend_from_array(self.tx_context.serialize());\n\n assert_eq(fields.len(), PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH);\n\n fields.storage\n }\n}\n\nimpl Deserialize<PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH> for PrivateCircuitPublicInputs {\n fn deserialize(serialized: [Field; PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH]) -> Self {\n // TODO(#4390): This should accept a reader ^ to avoid copying data.\n let mut reader = Reader::new(serialized);\n let inputs = Self {\n call_context: reader.read_struct(CallContext::deserialize),\n args_hash: reader.read(),\n returns_hash: reader.read(),\n min_revertible_side_effect_counter: reader.read() as u32,\n is_fee_payer: reader.read() == 1,\n max_block_number: reader.read_struct(MaxBlockNumber::deserialize),\n note_hash_read_requests: reader.read_struct_array(ReadRequest::deserialize, [ReadRequest::empty(); MAX_NOTE_HASH_READ_REQUESTS_PER_CALL]),\n nullifier_read_requests: reader.read_struct_array(ReadRequest::deserialize, [ReadRequest::empty(); MAX_NULLIFIER_READ_REQUESTS_PER_CALL]),\n key_validation_requests_and_generators: reader.read_struct_array(KeyValidationRequestAndGenerator::deserialize, [KeyValidationRequestAndGenerator::empty(); MAX_KEY_VALIDATION_REQUESTS_PER_CALL]),\n note_hashes: reader.read_struct_array(NoteHash::deserialize, [NoteHash::empty(); MAX_NOTE_HASHES_PER_CALL]),\n nullifiers: reader.read_struct_array(Nullifier::deserialize, [Nullifier::empty(); MAX_NULLIFIERS_PER_CALL]),\n private_call_requests: reader.read_struct_array(PrivateCallRequest::deserialize, [PrivateCallRequest::empty(); MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL]),\n public_call_stack_hashes: reader.read_array([0; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL]),\n public_teardown_function_hash: reader.read(),\n l2_to_l1_msgs: reader.read_struct_array(L2ToL1Message::deserialize, [L2ToL1Message::empty(); MAX_L2_TO_L1_MSGS_PER_CALL]),\n start_side_effect_counter: reader.read() as u32,\n end_side_effect_counter: reader.read() as u32,\n note_encrypted_logs_hashes: reader.read_struct_array(NoteLogHash::deserialize, [NoteLogHash::empty(); MAX_NOTE_ENCRYPTED_LOGS_PER_CALL]),\n encrypted_logs_hashes: reader.read_struct_array(EncryptedLogHash::deserialize, [EncryptedLogHash::empty(); MAX_ENCRYPTED_LOGS_PER_CALL]),\n unencrypted_logs_hashes: reader.read_struct_array(LogHash::deserialize, [LogHash::empty(); MAX_UNENCRYPTED_LOGS_PER_CALL]),\n historical_header: reader.read_struct(Header::deserialize),\n tx_context: reader.read_struct(TxContext::deserialize),\n };\n\n reader.finish();\n inputs\n }\n}\n\nimpl Hash for PrivateCircuitPublicInputs {\n fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__PRIVATE_CIRCUIT_PUBLIC_INPUTS)\n }\n}\n\nimpl Empty for PrivateCircuitPublicInputs {\n fn empty() -> Self {\n PrivateCircuitPublicInputs {\n call_context: CallContext::empty(),\n args_hash: 0,\n returns_hash: 0,\n min_revertible_side_effect_counter: 0 as u32,\n is_fee_payer: false,\n max_block_number: MaxBlockNumber::empty(),\n note_hash_read_requests: [ReadRequest::empty(); MAX_NOTE_HASH_READ_REQUESTS_PER_CALL],\n nullifier_read_requests: [ReadRequest::empty(); MAX_NULLIFIER_READ_REQUESTS_PER_CALL],\n key_validation_requests_and_generators: [KeyValidationRequestAndGenerator::empty(); MAX_KEY_VALIDATION_REQUESTS_PER_CALL],\n note_hashes: [NoteHash::empty(); MAX_NOTE_HASHES_PER_CALL],\n nullifiers: [Nullifier::empty(); MAX_NULLIFIERS_PER_CALL],\n private_call_requests: [PrivateCallRequest::empty(); MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL],\n public_call_stack_hashes: [0; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL],\n public_teardown_function_hash: 0,\n l2_to_l1_msgs: [L2ToL1Message::empty(); MAX_L2_TO_L1_MSGS_PER_CALL],\n start_side_effect_counter : 0 as u32,\n end_side_effect_counter : 0 as u32,\n note_encrypted_logs_hashes: [NoteLogHash::empty(); MAX_NOTE_ENCRYPTED_LOGS_PER_CALL],\n encrypted_logs_hashes: [EncryptedLogHash::empty(); MAX_ENCRYPTED_LOGS_PER_CALL],\n unencrypted_logs_hashes: [LogHash::empty(); MAX_UNENCRYPTED_LOGS_PER_CALL],\n historical_header: Header::empty(),\n tx_context: TxContext::empty(),\n }\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let pcpi = PrivateCircuitPublicInputs::empty();\n let serialized = pcpi.serialize();\n let deserialized = PrivateCircuitPublicInputs::deserialize(serialized);\n assert(pcpi.eq(deserialized));\n}\n\n#[test]\nfn empty_hash() {\n let inputs = PrivateCircuitPublicInputs::empty();\n let hash = inputs.hash();\n // Value from private_circuit_public_inputs.test.ts \"computes empty item hash\" test\n let test_data_empty_hash = 0x1eb5048b5bdcea5ba66519ecd1cbdb9e18fd957d52830b2bcb309f4ce9bcfbd3;\n assert_eq(hash, test_data_empty_hash);\n}\n"},"173":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/global_variables.nr","source":"use crate::{\n address::{AztecAddress, EthAddress}, abis::gas_fees::GasFees,\n constants::{GENERATOR_INDEX__GLOBAL_VARIABLES, GLOBAL_VARIABLES_LENGTH},\n traits::{Deserialize, Empty, Hash, Serialize}, utils::reader::Reader\n};\n\n// docs:start:global-variables\nstruct GlobalVariables {\n chain_id : Field,\n version : Field,\n block_number : Field,\n timestamp : u64,\n coinbase : EthAddress,\n fee_recipient : AztecAddress,\n gas_fees : GasFees\n}\n// docs:end:global-variables\n\nimpl GlobalVariables {\n fn is_empty(self) -> bool {\n (self.chain_id == 0)\n & (self.version == 0)\n & (self.block_number == 0)\n & (self.timestamp == 0)\n & (self.coinbase.is_zero())\n & (self.fee_recipient.is_zero())\n & (self.gas_fees.is_empty())\n }\n}\n\nimpl Serialize<GLOBAL_VARIABLES_LENGTH> for GlobalVariables {\n fn serialize(self) -> [Field; GLOBAL_VARIABLES_LENGTH] {\n let mut serialized: BoundedVec<Field, GLOBAL_VARIABLES_LENGTH> = BoundedVec::new();\n\n serialized.push(self.chain_id);\n serialized.push(self.version);\n serialized.push(self.block_number);\n serialized.push(self.timestamp as Field);\n serialized.push(self.coinbase.to_field());\n serialized.push(self.fee_recipient.to_field());\n serialized.extend_from_array(self.gas_fees.serialize());\n\n serialized.storage\n }\n}\n\nimpl Deserialize<GLOBAL_VARIABLES_LENGTH> for GlobalVariables {\n fn deserialize(serialized: [Field; GLOBAL_VARIABLES_LENGTH]) -> GlobalVariables {\n let mut reader = Reader::new(serialized);\n GlobalVariables {\n chain_id: reader.read(),\n version: reader.read(),\n block_number: reader.read(),\n timestamp: reader.read() as u64,\n coinbase: EthAddress::from_field(reader.read()),\n fee_recipient: AztecAddress::from_field(reader.read()),\n gas_fees: reader.read_struct(GasFees::deserialize)\n }\n }\n}\n\nimpl Eq for GlobalVariables {\n fn eq(self, other : GlobalVariables) -> bool {\n (self.chain_id == other.chain_id) &\n (self.version == other.version) &\n (self.block_number == other.block_number) &\n (self.timestamp == other.timestamp) &\n (self.coinbase == other.coinbase) &\n (self.fee_recipient == other.fee_recipient) &\n (self.gas_fees == other.gas_fees) \n }\n}\n\nimpl Empty for GlobalVariables {\n fn empty() -> Self {\n Self {\n chain_id: 0,\n version: 0,\n block_number: 0,\n timestamp: 0,\n coinbase: EthAddress::empty(),\n fee_recipient: AztecAddress::empty(),\n gas_fees: GasFees::empty()\n }\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let vars = GlobalVariables::empty();\n let _serialized = vars.serialize();\n let _deserialized = GlobalVariables::deserialize(_serialized);\n}\n"},"174":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/read_request.nr","source":"use crate::{\n abis::side_effect::{Ordered, Scoped}, traits::{Empty, Serialize, Deserialize},\n address::AztecAddress, constants::{READ_REQUEST_LENGTH, SCOPED_READ_REQUEST_LEN},\n utils::{arrays::array_concat, reader::Reader}\n};\n\nstruct ReadRequest {\n value: Field,\n counter: u32,\n}\n\nimpl Ordered for ReadRequest {\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl Eq for ReadRequest {\n fn eq(self, read_request: ReadRequest) -> bool {\n (self.value == read_request.value)\n & (self.counter == read_request.counter)\n }\n}\n\nimpl Empty for ReadRequest {\n fn empty() -> Self {\n ReadRequest {\n value: 0,\n counter: 0,\n }\n }\n}\n\nimpl Serialize<READ_REQUEST_LENGTH> for ReadRequest {\n fn serialize(self) -> [Field; READ_REQUEST_LENGTH] {\n [self.value, self.counter as Field]\n }\n}\n\nimpl Deserialize<READ_REQUEST_LENGTH> for ReadRequest {\n fn deserialize(values: [Field; READ_REQUEST_LENGTH]) -> Self {\n Self {\n value: values[0],\n counter: values[1] as u32,\n }\n }\n}\n\nimpl ReadRequest {\n pub fn scope(self, contract_address: AztecAddress) -> ScopedReadRequest {\n ScopedReadRequest { read_request: self, contract_address }\n }\n}\n\nstruct ScopedReadRequest {\n read_request: ReadRequest,\n contract_address: AztecAddress,\n}\n\nimpl Scoped<ReadRequest> for ScopedReadRequest {\n fn inner(self) -> ReadRequest {\n self.read_request\n }\n fn contract_address(self) -> AztecAddress {\n self.contract_address\n }\n}\n\nimpl Eq for ScopedReadRequest {\n fn eq(self, other: ScopedReadRequest) -> bool {\n (self.read_request == other.read_request)\n & (self.contract_address.eq(other.contract_address))\n }\n}\n\nimpl Empty for ScopedReadRequest {\n fn empty() -> Self {\n ScopedReadRequest {\n read_request: ReadRequest::empty(),\n contract_address: AztecAddress::empty(),\n }\n }\n}\n\nimpl Serialize<SCOPED_READ_REQUEST_LEN> for ScopedReadRequest {\n fn serialize(self) -> [Field; SCOPED_READ_REQUEST_LEN] {\n array_concat(self.read_request.serialize(), [self.contract_address.to_field()])\n }\n}\n\nimpl Deserialize<SCOPED_READ_REQUEST_LEN> for ScopedReadRequest {\n fn deserialize(values: [Field; SCOPED_READ_REQUEST_LEN]) -> Self {\n let mut reader = Reader::new(values);\n let res = Self {\n read_request: reader.read_struct(ReadRequest::deserialize),\n contract_address: reader.read_struct(AztecAddress::deserialize),\n };\n reader.finish();\n res\n }\n}\n\nimpl ScopedReadRequest {\n pub fn value(self) -> Field {\n self.read_request.value\n }\n pub fn counter(self) -> u32 {\n self.read_request.counter\n }\n}\n\n#[test]\nfn serialization_of_empty_read() {\n let item = ReadRequest::empty();\n let serialized = item.serialize();\n let deserialized = ReadRequest::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n\n#[test]\nfn serialization_of_empty_scoped() {\n let item = ScopedReadRequest::empty();\n let serialized = item.serialize();\n let deserialized = ScopedReadRequest::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n"},"177":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/validation_requests/key_validation_request_and_generator.nr","source":"use crate::{\n address::AztecAddress,\n abis::validation_requests::{\n key_validation_request::KeyValidationRequest,\n scoped_key_validation_request_and_generator::ScopedKeyValidationRequestAndGenerator\n},\n constants::KEY_VALIDATION_REQUEST_AND_GENERATOR_LENGTH, traits::{Empty, Serialize, Deserialize},\n utils::{arrays::array_concat, reader::Reader}\n};\n\nstruct KeyValidationRequestAndGenerator {\n request: KeyValidationRequest,\n sk_app_generator: Field,\n}\n\nimpl Eq for KeyValidationRequestAndGenerator {\n fn eq(self, other: KeyValidationRequestAndGenerator) -> bool {\n (self.request == other.request) & (self.sk_app_generator == other.sk_app_generator)\n }\n}\n\nimpl Empty for KeyValidationRequestAndGenerator {\n fn empty() -> Self {\n KeyValidationRequestAndGenerator {\n request: KeyValidationRequest::empty(),\n sk_app_generator: 0,\n }\n }\n}\n\nimpl Serialize<KEY_VALIDATION_REQUEST_AND_GENERATOR_LENGTH> for KeyValidationRequestAndGenerator {\n fn serialize(self) -> [Field; KEY_VALIDATION_REQUEST_AND_GENERATOR_LENGTH] {\n array_concat(self.request.serialize(), [self.sk_app_generator])\n }\n}\n\nimpl Deserialize<KEY_VALIDATION_REQUEST_AND_GENERATOR_LENGTH> for KeyValidationRequestAndGenerator {\n fn deserialize(fields: [Field; KEY_VALIDATION_REQUEST_AND_GENERATOR_LENGTH]) -> Self {\n let mut reader = Reader::new(fields);\n let res = Self {\n request: reader.read_struct(KeyValidationRequest::deserialize),\n sk_app_generator: reader.read(),\n };\n reader.finish();\n res\n }\n}\n\nimpl KeyValidationRequestAndGenerator {\n pub fn scope(self, contract_address: AztecAddress) -> ScopedKeyValidationRequestAndGenerator {\n ScopedKeyValidationRequestAndGenerator { request: self, contract_address }\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let item = KeyValidationRequestAndGenerator::empty();\n let serialized = item.serialize();\n let deserialized = KeyValidationRequestAndGenerator::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n"},"178":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/validation_requests/key_validation_request.nr","source":"use crate::{\n constants::KEY_VALIDATION_REQUEST_LENGTH, traits::{Empty, Serialize, Deserialize},\n grumpkin_point::GrumpkinPoint\n};\n\nstruct KeyValidationRequest {\n pk_m: GrumpkinPoint,\n sk_app: Field, // not a grumpkin scalar because it's output of poseidon2\n}\n\nimpl Eq for KeyValidationRequest {\n fn eq(self, request: KeyValidationRequest) -> bool {\n (request.pk_m.eq(self.pk_m))\n & (request.sk_app.eq(self.sk_app))\n }\n}\n\nimpl Empty for KeyValidationRequest {\n fn empty() -> Self {\n KeyValidationRequest {\n pk_m: GrumpkinPoint::zero(),\n sk_app: 0,\n }\n }\n}\n\nimpl Serialize<KEY_VALIDATION_REQUEST_LENGTH> for KeyValidationRequest {\n fn serialize(self) -> [Field; KEY_VALIDATION_REQUEST_LENGTH] {\n [\n self.pk_m.x,\n self.pk_m.y,\n self.sk_app,\n ]\n }\n}\n\nimpl Deserialize<KEY_VALIDATION_REQUEST_LENGTH> for KeyValidationRequest {\n fn deserialize(fields: [Field; KEY_VALIDATION_REQUEST_LENGTH]) -> Self {\n Self {\n pk_m: GrumpkinPoint::new(fields[0], fields[1]),\n sk_app: fields[2],\n }\n }\n}\n\n"},"182":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/nullifier.nr","source":"use crate::{\n abis::{side_effect::{Ordered, OrderedValue, Readable, Scoped}, read_request::ScopedReadRequest},\n address::AztecAddress, constants::{NULLIFIER_LENGTH, SCOPED_NULLIFIER_LENGTH},\n hash::compute_siloed_nullifier, traits::{Empty, Hash, Serialize, Deserialize},\n utils::{arrays::array_concat, reader::Reader}\n};\n\nstruct Nullifier {\n value: Field,\n counter: u32,\n note_hash: Field,\n}\n\nimpl Ordered for Nullifier {\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl OrderedValue<Field> for Nullifier {\n fn value(self) -> Field {\n self.value\n }\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl Eq for Nullifier {\n fn eq(self, other: Nullifier) -> bool {\n (self.value == other.value)\n & (self.counter == other.counter)\n & (self.note_hash == other.note_hash) \n }\n}\n\nimpl Empty for Nullifier {\n fn empty() -> Self {\n Nullifier {\n value: 0,\n counter: 0,\n note_hash: 0,\n }\n }\n}\n\nimpl Serialize<NULLIFIER_LENGTH> for Nullifier {\n fn serialize(self) -> [Field; NULLIFIER_LENGTH] {\n [self.value, self.counter as Field, self.note_hash]\n }\n}\n\nimpl Deserialize<NULLIFIER_LENGTH> for Nullifier {\n fn deserialize(values: [Field; NULLIFIER_LENGTH]) -> Self {\n Self {\n value: values[0],\n counter: values[1] as u32,\n note_hash: values[2],\n }\n }\n}\n\nimpl Readable for Nullifier {\n fn assert_match_read_request(self, read_request: ScopedReadRequest) {\n // Public kernels output Nullifier instead of ScopedNullifier.\n // The nullifier value has been siloed.\n let siloed_request_value = compute_siloed_nullifier(read_request.contract_address, read_request.value());\n assert_eq(self.value, siloed_request_value, \"Value of the nullifier does not match read request\");\n assert(\n read_request.counter() > self.counter, \"Read request counter must be greater than the counter of the nullifier\"\n );\n }\n}\n\nimpl Nullifier {\n pub fn scope(self, contract_address: AztecAddress) -> ScopedNullifier {\n ScopedNullifier { nullifier: self, contract_address }\n }\n}\n\nstruct ScopedNullifier {\n nullifier: Nullifier,\n contract_address: AztecAddress,\n}\n\nimpl Scoped<Nullifier> for ScopedNullifier {\n fn inner(self) -> Nullifier {\n self.nullifier\n }\n fn contract_address(self) -> AztecAddress {\n self.contract_address\n }\n}\n\nimpl Ordered for ScopedNullifier {\n fn counter(self) -> u32 {\n self.nullifier.counter\n }\n}\n\nimpl OrderedValue<Field> for ScopedNullifier {\n fn value(self) -> Field {\n self.nullifier.value\n }\n fn counter(self) -> u32 {\n self.nullifier.counter\n }\n}\n\nimpl Eq for ScopedNullifier {\n fn eq(self, other: ScopedNullifier) -> bool {\n (self.nullifier == other.nullifier)\n & (self.contract_address == other.contract_address) \n }\n}\n\nimpl Empty for ScopedNullifier {\n fn empty() -> Self {\n ScopedNullifier {\n nullifier: Nullifier::empty(),\n contract_address: AztecAddress::empty(),\n }\n }\n}\n\nimpl Serialize<SCOPED_NULLIFIER_LENGTH> for ScopedNullifier {\n fn serialize(self) -> [Field; SCOPED_NULLIFIER_LENGTH] {\n array_concat(self.nullifier.serialize(), [self.contract_address.to_field()])\n }\n}\n\nimpl Deserialize<SCOPED_NULLIFIER_LENGTH> for ScopedNullifier {\n fn deserialize(values: [Field; SCOPED_NULLIFIER_LENGTH]) -> Self {\n let mut reader = Reader::new(values);\n let res = Self {\n nullifier: reader.read_struct(Nullifier::deserialize),\n contract_address: reader.read_struct(AztecAddress::deserialize),\n };\n reader.finish();\n res\n }\n}\n\nimpl Readable for ScopedNullifier {\n fn assert_match_read_request(self, read_request: ScopedReadRequest) {\n assert_eq(self.nullifier.value, read_request.value(), \"Value of the nullifier does not match read request\");\n assert_eq(self.contract_address, read_request.contract_address, \"Contract address of the nullifier does not match read request\");\n assert(\n read_request.counter() > self.nullifier.counter, \"Read request counter must be greater than the counter of the nullifier\"\n );\n }\n}\n\nimpl ScopedNullifier {\n pub fn nullified_note_hash(self) -> Field {\n self.nullifier.note_hash\n }\n\n pub fn expose_to_public(self) -> Nullifier {\n // Hide the actual counter and note hash when exposing it to the public kernel.\n Nullifier { value: self.nullifier.value, counter: 0, note_hash: 0 }\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let item = Nullifier::empty();\n let serialized = item.serialize();\n let deserialized = Nullifier::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n\n#[test]\nfn serialization_of_empty_scoped() {\n let item = ScopedNullifier::empty();\n let serialized = item.serialize();\n let deserialized = ScopedNullifier::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n"},"191":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/function_selector.nr","source":"use crate::utils::field::field_from_bytes;\nuse crate::traits::{Serialize, Deserialize, FromField, ToField, Empty};\n\nglobal SELECTOR_SIZE = 4;\n\nstruct FunctionSelector {\n // 1st 4-bytes of abi-encoding of function.\n inner: u32,\n}\n\nimpl Eq for FunctionSelector {\n fn eq(self, function_selector: FunctionSelector) -> bool {\n function_selector.inner == self.inner\n }\n}\n\nimpl Serialize<1> for FunctionSelector {\n fn serialize(self: Self) -> [Field; 1] {\n [self.inner as Field]\n }\n}\n\nimpl Deserialize<1> for FunctionSelector {\n fn deserialize(fields: [Field; 1]) -> Self {\n Self {\n inner: fields[0] as u32\n }\n }\n}\n\nimpl FromField for FunctionSelector {\n fn from_field(field: Field) -> Self {\n Self { inner: field as u32 }\n }\n}\n\nimpl ToField for FunctionSelector {\n fn to_field(self) -> Field {\n self.inner as Field\n }\n}\n\nimpl Empty for FunctionSelector {\n fn empty() -> Self {\n Self { inner: 0 as u32 }\n }\n}\n\nimpl FunctionSelector {\n pub fn from_u32(value: u32) -> Self {\n Self { inner: value }\n }\n\n pub fn from_signature<N>(signature: str<N>) -> Self {\n let bytes = signature.as_bytes();\n let hash = std::hash::keccak256(bytes, bytes.len() as u32);\n\n let mut selector_be_bytes = [0; SELECTOR_SIZE];\n for i in 0..SELECTOR_SIZE {\n selector_be_bytes[i] = hash[i];\n }\n\n FunctionSelector::from_field(field_from_bytes(selector_be_bytes, true))\n }\n\n pub fn zero() -> Self {\n Self { inner: 0 }\n }\n}\n"},"192":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_call_request.nr","source":"use crate::{\n abis::{caller_context::CallerContext, side_effect::{Ordered, RangeOrdered, Scoped}},\n address::AztecAddress, constants::{PRIVATE_CALL_REQUEST_LENGTH, SCOPED_PRIVATE_CALL_REQUEST_LENGTH},\n traits::{Empty, Serialize, Deserialize}, utils::reader::Reader\n};\n\nstruct PrivateCallRequest {\n hash: Field,\n caller_context: CallerContext,\n start_side_effect_counter: u32,\n end_side_effect_counter: u32,\n}\n\nimpl Ordered for PrivateCallRequest {\n fn counter(self) -> u32 {\n self.start_side_effect_counter\n }\n}\n\nimpl RangeOrdered for PrivateCallRequest {\n fn counter_start(self) -> u32 {\n self.start_side_effect_counter\n }\n fn counter_end(self) -> u32 {\n self.end_side_effect_counter\n }\n}\n\nimpl Eq for PrivateCallRequest {\n fn eq(self, other: PrivateCallRequest) -> bool {\n (self.hash == other.hash)\n & (self.caller_context == other.caller_context)\n & (self.start_side_effect_counter == other.start_side_effect_counter)\n & (self.end_side_effect_counter == other.end_side_effect_counter)\n }\n}\n\nimpl Empty for PrivateCallRequest {\n fn empty() -> Self {\n PrivateCallRequest {\n hash: 0,\n caller_context: CallerContext::empty(),\n start_side_effect_counter: 0,\n end_side_effect_counter: 0,\n }\n }\n}\n\nimpl Serialize<PRIVATE_CALL_REQUEST_LENGTH> for PrivateCallRequest {\n fn serialize(self) -> [Field; PRIVATE_CALL_REQUEST_LENGTH] {\n let mut fields: BoundedVec<Field, PRIVATE_CALL_REQUEST_LENGTH> = BoundedVec::new();\n\n fields.push(self.hash);\n fields.extend_from_array(self.caller_context.serialize());\n fields.push(self.start_side_effect_counter as Field);\n fields.push(self.end_side_effect_counter as Field);\n\n assert_eq(fields.len(), PRIVATE_CALL_REQUEST_LENGTH);\n\n fields.storage\n }\n}\n\nimpl Deserialize<PRIVATE_CALL_REQUEST_LENGTH> for PrivateCallRequest {\n fn deserialize(fields: [Field; PRIVATE_CALL_REQUEST_LENGTH]) -> PrivateCallRequest {\n let mut reader = Reader::new(fields);\n let item = PrivateCallRequest {\n hash: reader.read(),\n caller_context: reader.read_struct(CallerContext::deserialize),\n start_side_effect_counter: reader.read_u32(),\n end_side_effect_counter: reader.read_u32(),\n };\n reader.finish();\n item\n }\n}\n\nimpl PrivateCallRequest {\n pub fn scope(self, contract_address: AztecAddress) -> ScopedPrivateCallRequest {\n ScopedPrivateCallRequest { call_request: self, contract_address }\n }\n}\n\nstruct ScopedPrivateCallRequest {\n call_request: PrivateCallRequest,\n contract_address: AztecAddress,\n}\n\nimpl Scoped<PrivateCallRequest> for ScopedPrivateCallRequest {\n fn inner(self) -> PrivateCallRequest {\n self.call_request\n }\n fn contract_address(self) -> AztecAddress {\n self.contract_address\n }\n}\n\nimpl Ordered for ScopedPrivateCallRequest {\n fn counter(self) -> u32 {\n self.call_request.counter_start()\n }\n}\n\nimpl RangeOrdered for ScopedPrivateCallRequest {\n fn counter_start(self) -> u32 {\n self.call_request.counter_start()\n }\n fn counter_end(self) -> u32 {\n self.call_request.counter_end()\n }\n}\n\nimpl Eq for ScopedPrivateCallRequest {\n fn eq(self, other: ScopedPrivateCallRequest) -> bool {\n (self.call_request == other.call_request)\n & (self.contract_address == other.contract_address)\n }\n}\n\nimpl Empty for ScopedPrivateCallRequest {\n fn empty() -> Self {\n ScopedPrivateCallRequest {\n call_request: PrivateCallRequest::empty(),\n contract_address: AztecAddress::zero(),\n }\n }\n}\n\nimpl Serialize<SCOPED_PRIVATE_CALL_REQUEST_LENGTH> for ScopedPrivateCallRequest {\n fn serialize(self) -> [Field; SCOPED_PRIVATE_CALL_REQUEST_LENGTH] {\n let mut fields: BoundedVec<Field, SCOPED_PRIVATE_CALL_REQUEST_LENGTH> = BoundedVec::new();\n\n fields.extend_from_array(self.call_request.serialize());\n fields.extend_from_array(self.contract_address.serialize());\n\n assert_eq(fields.len(), SCOPED_PRIVATE_CALL_REQUEST_LENGTH);\n\n fields.storage\n }\n}\n\nimpl Deserialize<SCOPED_PRIVATE_CALL_REQUEST_LENGTH> for ScopedPrivateCallRequest {\n fn deserialize(fields: [Field; SCOPED_PRIVATE_CALL_REQUEST_LENGTH]) -> ScopedPrivateCallRequest {\n let mut reader = Reader::new(fields);\n let item = ScopedPrivateCallRequest {\n call_request: reader.read_struct(PrivateCallRequest::deserialize),\n contract_address: reader.read_struct(AztecAddress::deserialize),\n };\n reader.finish();\n item\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let item = ScopedPrivateCallRequest::empty();\n let serialized = item.serialize();\n let deserialized = ScopedPrivateCallRequest::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n"},"197":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/gas_settings.nr","source":"use crate::{\n abis::function_selector::FunctionSelector, address::{EthAddress, AztecAddress}, abis::gas::Gas,\n abis::gas_fees::GasFees,\n constants::{\n GAS_SETTINGS_LENGTH, DEFAULT_GAS_LIMIT, DEFAULT_TEARDOWN_GAS_LIMIT, DEFAULT_MAX_FEE_PER_GAS,\n DEFAULT_INCLUSION_FEE\n},\n hash::pedersen_hash, traits::{Deserialize, Hash, Serialize, Empty}, abis::side_effect::Ordered,\n utils::reader::Reader\n};\n\nstruct GasSettings {\n gas_limits: Gas,\n teardown_gas_limits: Gas,\n max_fees_per_gas: GasFees,\n inclusion_fee: Field,\n}\n\nimpl GasSettings {\n pub fn new(\n gas_limits: Gas,\n teardown_gas_limits: Gas,\n max_fees_per_gas: GasFees,\n inclusion_fee: Field\n ) -> Self {\n Self { gas_limits, teardown_gas_limits, max_fees_per_gas, inclusion_fee }\n }\n\n pub fn default() -> Self {\n GasSettings::new(\n Gas::new(DEFAULT_GAS_LIMIT, DEFAULT_GAS_LIMIT),\n Gas::new(DEFAULT_TEARDOWN_GAS_LIMIT, DEFAULT_TEARDOWN_GAS_LIMIT),\n GasFees::new(DEFAULT_MAX_FEE_PER_GAS, DEFAULT_MAX_FEE_PER_GAS),\n DEFAULT_INCLUSION_FEE\n )\n }\n}\n\nimpl Eq for GasSettings {\n fn eq(self, other: Self) -> bool {\n (self.gas_limits == other.gas_limits) & (self.teardown_gas_limits == other.teardown_gas_limits) & (self.max_fees_per_gas == other.max_fees_per_gas) & (self.inclusion_fee == other.inclusion_fee)\n }\n}\n\nimpl Empty for GasSettings {\n fn empty() -> Self {\n GasSettings::new(\n Gas::empty(), Gas::empty(), GasFees::empty(), 0\n )\n }\n}\n\nimpl Serialize<GAS_SETTINGS_LENGTH> for GasSettings {\n fn serialize(self) -> [Field; GAS_SETTINGS_LENGTH] {\n let mut serialized: BoundedVec<Field, GAS_SETTINGS_LENGTH> = BoundedVec::new();\n\n serialized.extend_from_array(self.gas_limits.serialize());\n serialized.extend_from_array(self.teardown_gas_limits.serialize());\n serialized.extend_from_array(self.max_fees_per_gas.serialize());\n serialized.push(self.inclusion_fee);\n \n serialized.storage\n }\n}\n\nimpl Deserialize<GAS_SETTINGS_LENGTH> for GasSettings {\n fn deserialize(serialized: [Field; GAS_SETTINGS_LENGTH]) -> GasSettings {\n let mut reader = Reader::new(serialized);\n GasSettings::new(reader.read_struct(Gas::deserialize), reader.read_struct(Gas::deserialize), reader.read_struct(GasFees::deserialize), reader.read())\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let item = GasSettings::empty();\n let serialized = item.serialize();\n let deserialized = GasSettings::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n"},"206":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_call_stack_item.nr","source":"use crate::{\n abis::{function_data::FunctionData, private_circuit_public_inputs::PrivateCircuitPublicInputs},\n address::AztecAddress,\n constants::{GENERATOR_INDEX__CALL_STACK_ITEM, PRIVATE_CALL_STACK_ITEM_LENGTH}, hash::pedersen_hash,\n traits::{Deserialize, Hash, Serialize, Empty}, utils::reader::Reader\n};\n\nstruct PrivateCallStackItem {\n // This is the _actual_ contract address relating to where this function's code resides in the\n // contract tree. Regardless of whether this is a call or delegatecall, this\n // `contract_address` _does not change_. Amongst other things, it's used as a lookup for\n // getting the correct code from the tree. There is a separate `storage_contract_address`\n // within a CallStackItem which varies depending on whether this is a call or delegatecall.\n contract_address: AztecAddress,\n function_data: FunctionData,\n public_inputs: PrivateCircuitPublicInputs,\n}\n\nimpl Eq for PrivateCallStackItem {\n fn eq(self, other: Self) -> bool {\n self.contract_address.eq(other.contract_address) &\n self.function_data.eq(other.function_data) &\n self.public_inputs.eq(other.public_inputs)\n }\n}\n\nimpl Serialize<PRIVATE_CALL_STACK_ITEM_LENGTH> for PrivateCallStackItem {\n fn serialize(self) -> [Field; PRIVATE_CALL_STACK_ITEM_LENGTH] {\n let mut fields: BoundedVec<Field, PRIVATE_CALL_STACK_ITEM_LENGTH> = BoundedVec::new();\n\n fields.push(self.contract_address.to_field());\n fields.extend_from_array(self.function_data.serialize());\n fields.extend_from_array(self.public_inputs.serialize());\n\n assert_eq(fields.len(), PRIVATE_CALL_STACK_ITEM_LENGTH);\n\n fields.storage\n }\n}\n\nimpl Deserialize<PRIVATE_CALL_STACK_ITEM_LENGTH> for PrivateCallStackItem {\n fn deserialize(serialized: [Field; PRIVATE_CALL_STACK_ITEM_LENGTH]) -> Self {\n // TODO(#4390): This should accept a reader ^ to avoid copying data.\n let mut reader = Reader::new(serialized);\n\n let item = Self {\n contract_address: reader.read_struct(AztecAddress::deserialize),\n function_data: reader.read_struct(FunctionData::deserialize),\n public_inputs: reader.read_struct(PrivateCircuitPublicInputs::deserialize),\n };\n\n reader.finish();\n item\n }\n}\n\nimpl Hash for PrivateCallStackItem {\n fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__CALL_STACK_ITEM)\n }\n}\n\nimpl Empty for PrivateCallStackItem {\n fn empty() -> Self {\n PrivateCallStackItem {\n contract_address: AztecAddress::empty(),\n function_data: FunctionData::empty(),\n public_inputs: PrivateCircuitPublicInputs::empty(),\n }\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let item = PrivateCallStackItem::empty();\n let serialized = item.serialize();\n let deserialized = PrivateCallStackItem::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n\n#[test]\nfn empty_hash() {\n let mut item = PrivateCallStackItem::empty();\n item.function_data.is_private = true;\n let hash = item.hash();\n\n // Value from private_call_stack_item.test.ts \"computes empty item hash\" test\n let test_data_empty_hash = 0x157022d579f892f06461fb895cdf5550b24329e15e7a41df14f9dad582fa1bc5;\n assert_eq(hash, test_data_empty_hash);\n}\n"},"207":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/caller_context.nr","source":"use crate::address::AztecAddress;\nuse crate::traits::{Empty, Serialize, Deserialize};\nuse crate::constants::CALLER_CONTEXT_LENGTH;\nuse crate::utils::reader::Reader;\n\nstruct CallerContext {\n msg_sender: AztecAddress,\n storage_contract_address: AztecAddress,\n is_static_call: bool,\n}\n\nimpl Eq for CallerContext {\n fn eq(self, other: CallerContext) -> bool {\n other.msg_sender.eq(self.msg_sender)\n & other.storage_contract_address.eq(self.storage_contract_address)\n & other.is_static_call == self.is_static_call\n }\n}\n\nimpl Empty for CallerContext {\n fn empty() -> Self {\n CallerContext {\n msg_sender: AztecAddress::zero(),\n storage_contract_address: AztecAddress::zero(),\n is_static_call: false,\n }\n }\n}\n\nimpl CallerContext {\n pub fn is_empty(self) -> bool {\n self.msg_sender.is_zero() & self.storage_contract_address.is_zero() & !self.is_static_call\n }\n\n // Different to an empty context, a hidden context won't reveal the caller's msg_sender and storage_contract_address,\n // but will still propagate the is_static_call flag.\n pub fn is_hidden(self) -> bool {\n self.msg_sender.is_zero() & self.storage_contract_address.is_zero()\n }\n}\n\nimpl Serialize<CALLER_CONTEXT_LENGTH> for CallerContext {\n fn serialize(self) -> [Field; CALLER_CONTEXT_LENGTH] {\n let mut fields: BoundedVec<Field, CALLER_CONTEXT_LENGTH> = BoundedVec::new();\n\n fields.extend_from_array(self.msg_sender.serialize());\n fields.extend_from_array(self.storage_contract_address.serialize());\n fields.push(self.is_static_call as Field);\n\n assert_eq(fields.len(), CALLER_CONTEXT_LENGTH);\n\n fields.storage\n }\n}\n\nimpl Deserialize<CALLER_CONTEXT_LENGTH> for CallerContext {\n fn deserialize(fields: [Field; CALLER_CONTEXT_LENGTH]) -> CallerContext {\n let mut reader = Reader::new(fields);\n\n let item = CallerContext {\n msg_sender: reader.read_struct(AztecAddress::deserialize),\n storage_contract_address: reader.read_struct(AztecAddress::deserialize),\n is_static_call: reader.read_bool(),\n };\n reader.finish();\n item\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let item = CallerContext::empty();\n let serialized = item.serialize();\n let deserialized = CallerContext::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n"},"209":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/log_hash.nr","source":"use crate::{\n abis::side_effect::{Ordered, OrderedValue, Scoped}, address::AztecAddress,\n constants::{\n LOG_HASH_LENGTH, NOTE_LOG_HASH_LENGTH, ENCRYPTED_LOG_HASH_LENGTH, SCOPED_LOG_HASH_LENGTH,\n SCOPED_ENCRYPTED_LOG_HASH_LENGTH\n},\n traits::{Empty, Serialize, Deserialize}, utils::{arrays::array_concat, reader::Reader}\n};\n\nstruct LogHash {\n value: Field,\n counter: u32,\n length: Field,\n}\n\nimpl Ordered for LogHash {\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl OrderedValue<Field> for LogHash {\n fn value(self) -> Field {\n self.value\n }\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl Eq for LogHash {\n fn eq(self, other: LogHash) -> bool {\n (self.value == other.value)\n & (self.counter == other.counter)\n & (self.length == other.length) \n }\n}\n\nimpl Empty for LogHash {\n fn empty() -> Self {\n LogHash {\n value: 0,\n counter: 0,\n length: 0,\n }\n }\n}\n\nimpl Serialize<LOG_HASH_LENGTH> for LogHash {\n fn serialize(self) -> [Field; LOG_HASH_LENGTH] {\n [self.value, self.counter as Field, self.length]\n }\n}\n\nimpl Deserialize<LOG_HASH_LENGTH> for LogHash {\n fn deserialize(values: [Field; LOG_HASH_LENGTH]) -> Self {\n Self {\n value: values[0],\n counter: values[1] as u32,\n length: values[2],\n }\n }\n}\n\nimpl LogHash {\n pub fn scope(self, contract_address: AztecAddress) -> ScopedLogHash {\n ScopedLogHash { log_hash: self, contract_address }\n }\n}\n\nstruct ScopedLogHash {\n log_hash: LogHash,\n contract_address: AztecAddress,\n}\n\nimpl Scoped<LogHash> for ScopedLogHash {\n fn inner(self) -> LogHash {\n self.log_hash\n }\n fn contract_address(self) -> AztecAddress {\n self.contract_address\n }\n}\n\nimpl Ordered for ScopedLogHash {\n fn counter(self) -> u32 {\n self.log_hash.counter\n }\n}\n\nimpl OrderedValue<Field> for ScopedLogHash {\n fn value(self) -> Field {\n self.log_hash.value\n }\n fn counter(self) -> u32 {\n self.log_hash.counter\n }\n}\n\nimpl Eq for ScopedLogHash {\n fn eq(self, other: ScopedLogHash) -> bool {\n (self.log_hash == other.log_hash)\n & (self.contract_address == other.contract_address) \n }\n}\n\nimpl Empty for ScopedLogHash {\n fn empty() -> Self {\n ScopedLogHash {\n log_hash: LogHash::empty(),\n contract_address: AztecAddress::empty(),\n }\n }\n}\n\nimpl Serialize<SCOPED_LOG_HASH_LENGTH> for ScopedLogHash {\n fn serialize(self) -> [Field; SCOPED_LOG_HASH_LENGTH] {\n array_concat(self.log_hash.serialize(), [self.contract_address.to_field()])\n }\n}\n\nimpl Deserialize<SCOPED_LOG_HASH_LENGTH> for ScopedLogHash {\n fn deserialize(values: [Field; SCOPED_LOG_HASH_LENGTH]) -> Self {\n let mut reader = Reader::new(values);\n let res = Self {\n log_hash: reader.read_struct(LogHash::deserialize),\n contract_address: reader.read_struct(AztecAddress::deserialize),\n };\n reader.finish();\n res\n }\n}\n\nimpl ScopedLogHash {\n pub fn expose_to_public(self) -> LogHash {\n // Hide the counter when exposing to public.\n // The log hash must already be siloed when we call this.\n LogHash { value: self.log_hash.value, counter: 0, length: self.log_hash.length }\n }\n}\n\nstruct EncryptedLogHash {\n value: Field,\n counter: u32,\n length: Field,\n randomness: Field,\n}\n\nimpl Ordered for EncryptedLogHash {\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl OrderedValue<Field> for EncryptedLogHash {\n fn value(self) -> Field {\n self.value\n }\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl Eq for EncryptedLogHash {\n fn eq(self, other: EncryptedLogHash) -> bool {\n (self.value == other.value)\n & (self.counter == other.counter)\n & (self.length == other.length) \n & (self.randomness == other.randomness) \n }\n}\n\nimpl Empty for EncryptedLogHash {\n fn empty() -> Self {\n EncryptedLogHash {\n value: 0,\n counter: 0,\n length: 0,\n randomness: 0,\n }\n }\n}\n\nimpl Serialize<ENCRYPTED_LOG_HASH_LENGTH> for EncryptedLogHash {\n fn serialize(self) -> [Field; ENCRYPTED_LOG_HASH_LENGTH] {\n [self.value, self.counter as Field, self.length, self.randomness]\n }\n}\n\nimpl Deserialize<ENCRYPTED_LOG_HASH_LENGTH> for EncryptedLogHash {\n fn deserialize(values: [Field; ENCRYPTED_LOG_HASH_LENGTH]) -> Self {\n Self {\n value: values[0],\n counter: values[1] as u32,\n length: values[2],\n randomness: values[3],\n }\n }\n}\n\nimpl EncryptedLogHash {\n pub fn scope(self, contract_address: AztecAddress) -> ScopedEncryptedLogHash {\n ScopedEncryptedLogHash { log_hash: self, contract_address }\n }\n}\n\nstruct ScopedEncryptedLogHash {\n log_hash: EncryptedLogHash,\n contract_address: AztecAddress,\n}\n\nimpl Scoped<EncryptedLogHash> for ScopedEncryptedLogHash {\n fn inner(self) -> EncryptedLogHash {\n self.log_hash\n }\n fn contract_address(self) -> AztecAddress {\n self.contract_address\n }\n}\n\nimpl ScopedEncryptedLogHash {\n pub fn expose_to_public(self) -> LogHash {\n // Hide the secret randomness and counter when exposing to public\n // Expose as a LogHash rather than EncryptedLogHash to avoid bringing an unnec. 0 value around\n // The log hash will already be silo'd when we call this\n LogHash { value: self.log_hash.value, counter: 0, length: self.log_hash.length }\n }\n}\n\nimpl Ordered for ScopedEncryptedLogHash {\n fn counter(self) -> u32 {\n self.log_hash.counter\n }\n}\n\nimpl OrderedValue<Field> for ScopedEncryptedLogHash {\n fn value(self) -> Field {\n self.log_hash.value\n }\n fn counter(self) -> u32 {\n self.log_hash.counter\n }\n}\n\nimpl Eq for ScopedEncryptedLogHash {\n fn eq(self, other: ScopedEncryptedLogHash) -> bool {\n (self.log_hash == other.log_hash)\n & (self.contract_address == other.contract_address) \n }\n}\n\nimpl Empty for ScopedEncryptedLogHash {\n fn empty() -> Self {\n ScopedEncryptedLogHash {\n log_hash: EncryptedLogHash::empty(),\n contract_address: AztecAddress::empty(),\n }\n }\n}\n\nimpl Serialize<SCOPED_ENCRYPTED_LOG_HASH_LENGTH> for ScopedEncryptedLogHash {\n fn serialize(self) -> [Field; SCOPED_ENCRYPTED_LOG_HASH_LENGTH] {\n array_concat(self.log_hash.serialize(), [self.contract_address.to_field()])\n }\n}\n\nimpl Deserialize<SCOPED_ENCRYPTED_LOG_HASH_LENGTH> for ScopedEncryptedLogHash {\n fn deserialize(values: [Field; SCOPED_ENCRYPTED_LOG_HASH_LENGTH]) -> Self {\n let mut reader = Reader::new(values);\n let res = Self {\n log_hash: reader.read_struct(EncryptedLogHash::deserialize),\n contract_address: reader.read_struct(AztecAddress::deserialize),\n };\n reader.finish();\n res\n }\n}\n\nstruct NoteLogHash {\n value: Field,\n counter: u32,\n length: Field,\n note_hash_counter: u32,\n}\n\nimpl NoteLogHash {\n pub fn expose_to_public(self) -> LogHash {\n // Hide the actual counter and note hash counter when exposing it to the public kernel.\n // The counter is usually note_hash.counter + 1, so it can be revealing.\n // Expose as a LogHash rather than NoteLogHash to avoid bringing an unnec. 0 value around\n LogHash { value: self.value, counter: 0, length: self.length }\n }\n}\n\nimpl Ordered for NoteLogHash {\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl OrderedValue<Field> for NoteLogHash {\n fn value(self) -> Field {\n self.value\n }\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl Eq for NoteLogHash {\n fn eq(self, other: NoteLogHash) -> bool {\n (self.value == other.value)\n & (self.counter == other.counter)\n & (self.length == other.length) \n & (self.note_hash_counter == other.note_hash_counter) \n }\n}\n\nimpl Empty for NoteLogHash {\n fn empty() -> Self {\n NoteLogHash {\n value: 0,\n counter: 0,\n length: 0,\n note_hash_counter: 0,\n }\n }\n}\n\nimpl Serialize<NOTE_LOG_HASH_LENGTH> for NoteLogHash {\n fn serialize(self) -> [Field; NOTE_LOG_HASH_LENGTH] {\n [self.value, self.counter as Field, self.length, self.note_hash_counter as Field]\n }\n}\n\nimpl Deserialize<NOTE_LOG_HASH_LENGTH> for NoteLogHash {\n fn deserialize(values: [Field; NOTE_LOG_HASH_LENGTH]) -> Self {\n Self {\n value: values[0],\n counter: values[1] as u32,\n length: values[2],\n note_hash_counter: values[3] as u32,\n }\n }\n}\n"},"21":{"path":"std/field/bn254.nr","source":"use crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\nglobal TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n let x_bytes = x.to_le_bytes(32);\n\n let mut low: Field = 0;\n let mut high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n low += (x_bytes[i] as Field) * offset;\n high += (x_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n\n (low, high)\n}\n\nunconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nfn compute_lt(x: Field, y: Field, num_bytes: u32) -> bool {\n let x_bytes = x.to_le_radix(256, num_bytes);\n let y_bytes = y.to_le_radix(256, num_bytes);\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..num_bytes {\n if (!done) {\n let x_byte = x_bytes[num_bytes - 1 - i];\n let y_byte = y_bytes[num_bytes - 1 - i];\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n}\n\nfn compute_lte(x: Field, y: Field, num_bytes: u32) -> bool {\n if x == y {\n true\n } else {\n compute_lt(x, y, num_bytes)\n }\n}\n\nunconstrained fn lt_32_hint(x: Field, y: Field) -> bool {\n compute_lt(x, y, 32)\n}\n\nunconstrained fn lte_16_hint(x: Field, y: Field) -> bool {\n compute_lte(x, y, 16)\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n let borrow = lte_16_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size(128);\n rhi.assert_max_bit_size(128);\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size(128);\n xhi.assert_max_bit_size(128);\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(compute_lt(b, a, 32));\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n compute_lt(b, a, 32)\n } else if a == b {\n false\n } else {\n // Take a hint of the comparison and verify it\n if lt_32_hint(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{decompose_hint, decompose, compute_lt, assert_gt, gt, lt, TWO_POW_128, compute_lte, PLO, PHI};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n fn check_compute_lt() {\n assert(compute_lt(0, 1, 16));\n assert(compute_lt(0, 0x100, 16));\n assert(compute_lt(0x100, TWO_POW_128 - 1, 16));\n assert(!compute_lt(0, TWO_POW_128, 16));\n }\n\n #[test]\n fn check_compute_lte() {\n assert(compute_lte(0, 1, 16));\n assert(compute_lte(0, 0x100, 16));\n assert(compute_lte(0x100, TWO_POW_128 - 1, 16));\n assert(!compute_lte(0, TWO_POW_128, 16));\n\n assert(compute_lte(0, 0, 16));\n assert(compute_lte(0x100, 0x100, 16));\n assert(compute_lte(TWO_POW_128 - 1, TWO_POW_128 - 1, 16));\n assert(compute_lte(TWO_POW_128, TWO_POW_128, 16));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n"},"213":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/append_only_tree_snapshot.nr","source":"struct AppendOnlyTreeSnapshot {\n root : Field,\n // TODO(Alvaro) change this to a u64\n next_available_leaf_index : u32\n}\n\nglobal APPEND_ONLY_TREE_SNAPSHOT_LENGTH: u32 = 2;\n\nimpl AppendOnlyTreeSnapshot {\n pub fn serialize(self) -> [Field; APPEND_ONLY_TREE_SNAPSHOT_LENGTH] {\n [self.root, self.next_available_leaf_index as Field]\n }\n\n pub fn deserialize(serialized: [Field; APPEND_ONLY_TREE_SNAPSHOT_LENGTH]) -> AppendOnlyTreeSnapshot {\n AppendOnlyTreeSnapshot { root: serialized[0], next_available_leaf_index: serialized[1] as u32 }\n }\n\n pub fn zero() -> Self {\n Self { root: 0, next_available_leaf_index: 0 }\n }\n}\n\nimpl Eq for AppendOnlyTreeSnapshot {\n fn eq(self, other : AppendOnlyTreeSnapshot) -> bool {\n (self.root == other.root) & (self.next_available_leaf_index == other.next_available_leaf_index)\n }\n}\n"},"214":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/call_context.nr","source":"use crate::{\n abis::function_selector::FunctionSelector, address::{EthAddress, AztecAddress},\n constants::{CALL_CONTEXT_LENGTH, GENERATOR_INDEX__CALL_CONTEXT}, hash::pedersen_hash,\n traits::{Deserialize, Hash, Serialize, Empty}, abis::side_effect::Ordered,\n abis::{gas_settings::GasSettings, gas::Gas}, utils::reader::Reader\n};\n\n// docs:start:call-context\nstruct CallContext {\n msg_sender : AztecAddress,\n storage_contract_address : AztecAddress,\n function_selector : FunctionSelector,\n\n is_delegate_call : bool,\n is_static_call : bool,\n\n side_effect_counter : u32,\n}\n// docs:end:call-context\n\nimpl CallContext {\n fn assert_is_zero(self) {\n let serialized: [Field; CALL_CONTEXT_LENGTH] = self.serialize();\n\n for i in 0..CALL_CONTEXT_LENGTH {\n assert(serialized[i] == 0);\n }\n }\n}\n\nimpl Eq for CallContext {\n fn eq(self, other: CallContext) -> bool {\n self.serialize() == other.serialize()\n }\n}\n\nimpl Hash for CallContext {\n fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__CALL_CONTEXT)\n }\n}\n\nimpl Serialize<CALL_CONTEXT_LENGTH> for CallContext {\n fn serialize(self) -> [Field; CALL_CONTEXT_LENGTH] {\n let mut serialized: BoundedVec<Field, CALL_CONTEXT_LENGTH> = BoundedVec::new();\n\n serialized.push(self.msg_sender.to_field());\n serialized.push(self.storage_contract_address.to_field());\n serialized.push(self.function_selector.to_field());\n serialized.push(self.is_delegate_call as Field);\n serialized.push(self.is_static_call as Field);\n serialized.push(self.side_effect_counter as Field);\n \n serialized.storage\n }\n}\n\nimpl Deserialize<CALL_CONTEXT_LENGTH> for CallContext {\n fn deserialize(serialized: [Field; CALL_CONTEXT_LENGTH]) -> CallContext {\n let mut reader = Reader::new(serialized);\n CallContext {\n msg_sender: AztecAddress::from_field(reader.read()),\n storage_contract_address: AztecAddress::from_field(reader.read()),\n function_selector: FunctionSelector::from_field(reader.read()),\n is_delegate_call: reader.read() as bool,\n is_static_call: reader.read() as bool,\n side_effect_counter: reader.read() as u32,\n }\n }\n}\n\nimpl Empty for CallContext {\n fn empty() -> Self {\n CallContext {\n msg_sender: AztecAddress::empty(),\n storage_contract_address: AztecAddress::empty(),\n function_selector: FunctionSelector::empty(),\n is_delegate_call: false,\n is_static_call: false,\n side_effect_counter: 0,\n }\n }\n}\n\n#[test]\nfn serialize_deserialize_of_empty() {\n let context = CallContext::empty();\n let serialized = context.serialize();\n let deserialized = CallContext::deserialize(serialized);\n assert(context.eq(deserialized));\n}\n\n#[test]\nfn assert_is_zero() {\n let context = CallContext::empty();\n context.assert_is_zero();\n}\n\n#[test(should_fail)]\nfn not_zero_assert_is_zero() {\n let mut context = CallContext::empty();\n context.is_delegate_call = true;\n context.assert_is_zero();\n}\n\n#[test]\nfn test_eq() {\n let mut context1 = CallContext::empty();\n let mut context2 = CallContext::empty();\n\n context1.is_delegate_call = true;\n context2.is_delegate_call = true;\n\n let address: AztecAddress = AztecAddress::from_field(69420);\n context1.msg_sender = address;\n context2.msg_sender = address;\n\n assert(context1.eq(context2));\n}\n\n#[test(should_fail)]\nfn not_eq_test_eq() {\n let mut context1 = CallContext::empty();\n let mut context2 = CallContext::empty();\n\n context1.is_delegate_call = true;\n context2.is_delegate_call = false;\n\n let address1: AztecAddress = AztecAddress::from_field(69420);\n let address2: AztecAddress = AztecAddress::from_field(42069);\n\n context1.msg_sender = address1;\n context2.msg_sender = address2;\n\n assert(context1.eq(context2));\n}\n\n#[test]\nfn hash_smoke() {\n let context = CallContext::empty();\n let _hashed = context.hash();\n}\n"},"215":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/max_block_number.nr","source":"use crate::{constants::MAX_BLOCK_NUMBER_LENGTH, traits::{Deserialize, Serialize, Empty}};\n\nstruct MaxBlockNumber {\n _opt: Option<u32>\n}\n\nimpl Empty for MaxBlockNumber {\n fn empty() -> Self {\n Self { _opt: Option::none() }\n }\n}\n\nimpl Eq for MaxBlockNumber {\n fn eq(self, other: Self) -> bool {\n self._opt == other._opt\n }\n}\n\nimpl Serialize<MAX_BLOCK_NUMBER_LENGTH> for MaxBlockNumber {\n fn serialize(self) -> [Field; MAX_BLOCK_NUMBER_LENGTH] {\n [self._opt._is_some as Field, self._opt._value as Field]\n }\n}\n\nimpl Deserialize<MAX_BLOCK_NUMBER_LENGTH> for MaxBlockNumber {\n fn deserialize(serialized: [Field; MAX_BLOCK_NUMBER_LENGTH]) -> MaxBlockNumber {\n MaxBlockNumber {\n _opt: Option {\n _is_some: serialized[0] as bool,\n _value: serialized[1] as u32,\n }\n }\n }\n}\n\nimpl MaxBlockNumber {\n pub fn new(max_block_number: u32) -> Self {\n Self { _opt: Option::some(max_block_number) }\n }\n\n pub fn is_none(self) -> bool {\n self._opt.is_none()\n }\n\n pub fn is_some(self) -> bool {\n self._opt.is_some()\n }\n\n pub fn unwrap(self) -> u32 {\n self._opt.unwrap()\n }\n\n pub fn unwrap_unchecked(self) -> u32 {\n self._opt.unwrap_unchecked()\n }\n\n pub fn min(lhs: MaxBlockNumber, rhs: MaxBlockNumber) -> MaxBlockNumber {\n if rhs.is_none() {\n lhs // lhs might also be none, but in that case both would be\n } else {\n MaxBlockNumber::min_with_u32(lhs, rhs.unwrap_unchecked())\n }\n }\n\n pub fn min_with_u32(lhs: MaxBlockNumber, rhs: u32) -> MaxBlockNumber {\n if lhs._opt.is_none() {\n MaxBlockNumber::new(rhs)\n } else {\n let lhs_value = lhs._opt.unwrap_unchecked();\n\n MaxBlockNumber::new(if lhs_value < rhs { lhs_value } else { rhs })\n }\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let item = MaxBlockNumber::empty();\n let serialized = item.serialize();\n let deserialized = MaxBlockNumber::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n\n#[test]\nfn zeroed_is_none() {\n // Large parts of the kernel rely on zeroed to initialize structs. This conveniently matches what `default` does,\n // and though we should eventually move everything to use `default`, it's good to check for now that both are\n // equivalent.\n let a = MaxBlockNumber::empty();\n assert(a.is_none());\n}\n\n#[test]\nfn serde_default() {\n let a = MaxBlockNumber::empty();\n let b = MaxBlockNumber::deserialize(a.serialize());\n assert(b.is_none());\n}\n\n#[test]\nfn serde_some() {\n let a = MaxBlockNumber::new(13);\n let b = MaxBlockNumber::deserialize(a.serialize());\n assert_eq(b.unwrap(), 13);\n}\n\n#[test(should_fail)]\nfn default_unwrap_panics() {\n let a = MaxBlockNumber::empty();\n let _ = a.unwrap();\n}\n\n#[test]\nfn min_default_default() {\n let a = MaxBlockNumber::empty();\n let b = MaxBlockNumber::empty();\n\n assert(MaxBlockNumber::min(a, b).is_none());\n}\n\n#[test]\nfn min_default_some() {\n let a = MaxBlockNumber::empty();\n let b = MaxBlockNumber::new(13);\n\n assert_eq(MaxBlockNumber::min(a, b).unwrap(), 13);\n assert_eq(MaxBlockNumber::min(b, a).unwrap(), 13);\n}\n\n#[test]\nfn min_some_some() {\n let a = MaxBlockNumber::new(13);\n let b = MaxBlockNumber::new(42);\n\n assert_eq(MaxBlockNumber::min(a, b).unwrap(), 13);\n assert_eq(MaxBlockNumber::min(b, a).unwrap(), 13);\n}\n\n#[test]\nfn min_with_u32_default() {\n let a = MaxBlockNumber::empty();\n let b = 42;\n\n assert_eq(MaxBlockNumber::min_with_u32(a, b).unwrap(), 42);\n}\n\n#[test]\nfn min_with_u32_some() {\n let a = MaxBlockNumber::new(13);\n let b = 42;\n let c = 8;\n\n assert_eq(MaxBlockNumber::min_with_u32(a, b).unwrap(), 13);\n assert_eq(MaxBlockNumber::min_with_u32(a, c).unwrap(), 8);\n}\n"},"216":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/public_circuit_public_inputs.nr","source":"use crate::{\n abis::{\n call_context::CallContext, note_hash::NoteHash, nullifier::Nullifier, read_request::ReadRequest,\n gas::Gas, global_variables::GlobalVariables, log_hash::LogHash\n},\n address::AztecAddress,\n constants::{\n MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_CALL, MAX_L2_TO_L1_MSGS_PER_CALL, MAX_NULLIFIERS_PER_CALL,\n MAX_NOTE_HASHES_PER_CALL, MAX_NOTE_HASH_READ_REQUESTS_PER_CALL,\n MAX_NULLIFIER_READ_REQUESTS_PER_CALL, MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_CALL,\n MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL, MAX_PUBLIC_DATA_READS_PER_CALL,\n MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL, GENERATOR_INDEX__PUBLIC_CIRCUIT_PUBLIC_INPUTS,\n PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH, MAX_UNENCRYPTED_LOGS_PER_CALL\n},\n contrakt::{storage_read::StorageRead, storage_update_request::StorageUpdateRequest},\n hash::pedersen_hash, header::Header, messaging::l2_to_l1_message::L2ToL1Message,\n traits::{Hash, Serialize, Deserialize, Empty}, utils::reader::Reader\n};\n\nstruct PublicCircuitPublicInputs {\n call_context: CallContext,\n\n args_hash: Field,\n returns_hash: Field,\n\n note_hash_read_requests: [ReadRequest; MAX_NOTE_HASH_READ_REQUESTS_PER_CALL],\n nullifier_read_requests: [ReadRequest; MAX_NULLIFIER_READ_REQUESTS_PER_CALL],\n nullifier_non_existent_read_requests: [ReadRequest; MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_CALL],\n l1_to_l2_msg_read_requests: [ReadRequest; MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_CALL],\n contract_storage_update_requests: [StorageUpdateRequest; MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL],\n contract_storage_reads: [StorageRead; MAX_PUBLIC_DATA_READS_PER_CALL],\n\n // todo: add sideeffect ranges for the input to these hashes\n public_call_stack_hashes: [Field; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL],\n note_hashes: [NoteHash; MAX_NOTE_HASHES_PER_CALL],\n nullifiers: [Nullifier; MAX_NULLIFIERS_PER_CALL],\n l2_to_l1_msgs: [L2ToL1Message; MAX_L2_TO_L1_MSGS_PER_CALL],\n\n start_side_effect_counter: u32,\n end_side_effect_counter: u32,\n\n unencrypted_logs_hashes: [LogHash; MAX_UNENCRYPTED_LOGS_PER_CALL],\n\n // Header of a block whose state is used during public execution. Set by sequencer to be a header of a block\n // previous to the one in which the tx is included.\n historical_header: Header,\n\n // Global variables injected into this circuit\n global_variables: GlobalVariables,\n\n prover_address: AztecAddress,\n\n revert_code: u8,\n \n start_gas_left: Gas,\n end_gas_left: Gas,\n transaction_fee: Field,\n}\n\nimpl Eq for PublicCircuitPublicInputs {\n fn eq(self, other: Self) -> bool {\n self.serialize() == other.serialize()\n }\n}\n\nimpl Serialize<PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH> for PublicCircuitPublicInputs {\n fn serialize(self) -> [Field; PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH] {\n let mut fields: BoundedVec<Field, PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH> = BoundedVec::new();\n fields.extend_from_array(self.call_context.serialize());\n fields.push(self.args_hash);\n fields.push(self.returns_hash);\n for i in 0..MAX_NOTE_HASH_READ_REQUESTS_PER_CALL {\n fields.extend_from_array(self.note_hash_read_requests[i].serialize());\n }\n for i in 0..MAX_NULLIFIER_READ_REQUESTS_PER_CALL {\n fields.extend_from_array(self.nullifier_read_requests[i].serialize());\n }\n for i in 0..MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_CALL {\n fields.extend_from_array(self.nullifier_non_existent_read_requests[i].serialize());\n }\n for i in 0..MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_CALL {\n fields.extend_from_array(self.l1_to_l2_msg_read_requests[i].serialize());\n }\n for i in 0..MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL {\n fields.extend_from_array(self.contract_storage_update_requests[i].serialize());\n }\n for i in 0..MAX_PUBLIC_DATA_READS_PER_CALL {\n fields.extend_from_array(self.contract_storage_reads[i].serialize());\n }\n fields.extend_from_array(self.public_call_stack_hashes);\n\n for i in 0..MAX_NOTE_HASHES_PER_CALL {\n fields.extend_from_array(self.note_hashes[i].serialize());\n }\n for i in 0..MAX_NULLIFIERS_PER_CALL {\n fields.extend_from_array(self.nullifiers[i].serialize());\n }\n for i in 0..MAX_L2_TO_L1_MSGS_PER_CALL {\n fields.extend_from_array(self.l2_to_l1_msgs[i].serialize());\n }\n\n fields.push(self.start_side_effect_counter as Field);\n fields.push(self.end_side_effect_counter as Field);\n\n for i in 0..MAX_UNENCRYPTED_LOGS_PER_CALL{\n fields.extend_from_array(self.unencrypted_logs_hashes[i].serialize());\n }\n fields.extend_from_array(self.historical_header.serialize());\n fields.extend_from_array(self.global_variables.serialize());\n fields.push(self.prover_address.to_field());\n fields.push(self.revert_code as Field);\n fields.extend_from_array(self.start_gas_left.serialize());\n fields.extend_from_array(self.end_gas_left.serialize());\n fields.push(self.transaction_fee);\n fields.storage\n }\n}\n\nimpl Deserialize<PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH> for PublicCircuitPublicInputs {\n fn deserialize(serialized: [Field; PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH]) -> Self {\n // TODO(#4390): This should accept a reader ^ to avoid copying data.\n let mut reader = Reader::new(serialized);\n let inputs = PublicCircuitPublicInputs {\n call_context: reader.read_struct(CallContext::deserialize),\n args_hash: reader.read(),\n returns_hash: reader.read(),\n note_hash_read_requests: reader.read_struct_array(ReadRequest::deserialize, [ReadRequest::empty(); MAX_NOTE_HASH_READ_REQUESTS_PER_CALL]),\n nullifier_read_requests: reader.read_struct_array(ReadRequest::deserialize, [ReadRequest::empty(); MAX_NULLIFIER_READ_REQUESTS_PER_CALL]),\n nullifier_non_existent_read_requests: reader.read_struct_array(ReadRequest::deserialize, [ReadRequest::empty(); MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_CALL]),\n l1_to_l2_msg_read_requests: reader.read_struct_array(ReadRequest::deserialize, [ReadRequest::empty(); MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_CALL]),\n contract_storage_update_requests: reader.read_struct_array(StorageUpdateRequest::deserialize, [StorageUpdateRequest::empty(); MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL]),\n contract_storage_reads: reader.read_struct_array(StorageRead::deserialize, [StorageRead::empty(); MAX_PUBLIC_DATA_READS_PER_CALL]),\n public_call_stack_hashes: reader.read_array([0; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL]),\n note_hashes: reader.read_struct_array(NoteHash::deserialize, [NoteHash::empty(); MAX_NOTE_HASHES_PER_CALL]),\n nullifiers: reader.read_struct_array(Nullifier::deserialize, [Nullifier::empty(); MAX_NULLIFIERS_PER_CALL]),\n l2_to_l1_msgs: reader.read_struct_array(L2ToL1Message::deserialize, [L2ToL1Message::empty(); MAX_L2_TO_L1_MSGS_PER_CALL]),\n start_side_effect_counter: reader.read() as u32,\n end_side_effect_counter: reader.read() as u32,\n unencrypted_logs_hashes: reader.read_struct_array(LogHash::deserialize, [LogHash::empty(); MAX_UNENCRYPTED_LOGS_PER_CALL]),\n historical_header: reader.read_struct(Header::deserialize),\n global_variables: reader.read_struct(GlobalVariables::deserialize),\n prover_address: reader.read_struct(AztecAddress::deserialize),\n revert_code: reader.read() as u8,\n start_gas_left: reader.read_struct(Gas::deserialize),\n end_gas_left: reader.read_struct(Gas::deserialize),\n transaction_fee: reader.read(),\n };\n\n reader.finish();\n inputs\n }\n}\n\nimpl Hash for PublicCircuitPublicInputs {\n fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__PUBLIC_CIRCUIT_PUBLIC_INPUTS)\n }\n}\n\nimpl Empty for PublicCircuitPublicInputs {\n fn empty() -> Self {\n PublicCircuitPublicInputs {\n call_context: CallContext::empty(),\n args_hash: 0,\n returns_hash: 0,\n note_hash_read_requests: [ReadRequest::empty(); MAX_NOTE_HASH_READ_REQUESTS_PER_CALL],\n nullifier_read_requests: [ReadRequest::empty(); MAX_NULLIFIER_READ_REQUESTS_PER_CALL],\n nullifier_non_existent_read_requests: [ReadRequest::empty(); MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_CALL],\n l1_to_l2_msg_read_requests: [ReadRequest::empty(); MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_CALL],\n contract_storage_update_requests: [StorageUpdateRequest::empty(); MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL],\n contract_storage_reads: [StorageRead::empty(); MAX_PUBLIC_DATA_READS_PER_CALL],\n public_call_stack_hashes: [0; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL],\n note_hashes: [NoteHash::empty(); MAX_NOTE_HASHES_PER_CALL],\n nullifiers: [Nullifier::empty(); MAX_NULLIFIERS_PER_CALL],\n l2_to_l1_msgs: [L2ToL1Message::empty(); MAX_L2_TO_L1_MSGS_PER_CALL],\n start_side_effect_counter: 0 as u32,\n end_side_effect_counter: 0 as u32,\n unencrypted_logs_hashes: [LogHash::empty(); MAX_UNENCRYPTED_LOGS_PER_CALL],\n historical_header: Header::empty(),\n global_variables: GlobalVariables::empty(),\n prover_address: AztecAddress::zero(),\n revert_code: 0 as u8,\n start_gas_left: Gas::empty(),\n end_gas_left: Gas::empty(),\n transaction_fee: 0,\n }\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let pcpi = PublicCircuitPublicInputs::empty();\n let serialized = pcpi.serialize();\n let deserialized = PublicCircuitPublicInputs::deserialize(serialized);\n assert(pcpi.eq(deserialized));\n}\n\n#[test]\nfn empty_hash() {\n let inputs = PublicCircuitPublicInputs::empty();\n let hash = inputs.hash();\n\n // Value from public_circuit_public_inputs.test.ts \"computes empty item hash\" test\n let test_data_empty_hash = 0x2e08158f3f0d9a94e3f17338aadc3733a15bf5d163f94cef1afd8a47b446d789;\n assert_eq(hash, test_data_empty_hash);\n}\n"},"218":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/function_data.nr","source":"use crate::{\n abis::function_selector::FunctionSelector,\n constants::{GENERATOR_INDEX__FUNCTION_DATA, FUNCTION_DATA_LENGTH}, hash::pedersen_hash,\n traits::{Serialize, Hash, Deserialize, Empty}\n};\n\nstruct FunctionData {\n selector : FunctionSelector,\n is_private : bool,\n}\n\nimpl Eq for FunctionData {\n fn eq(self, other: Self) -> bool {\n self.selector.eq(other.selector) &\n (self.is_private == other.is_private)\n }\n}\n\nimpl Serialize<FUNCTION_DATA_LENGTH> for FunctionData {\n // A field is ~256 bits\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/3057): Since, function data can fit into a Field,\n // This method will simply return a bit packed Field instead of hashing\n fn serialize(self) -> [Field; FUNCTION_DATA_LENGTH] {\n [\n self.selector.to_field(),\n self.is_private as Field,\n ]\n }\n}\n\nimpl Deserialize<FUNCTION_DATA_LENGTH> for FunctionData {\n fn deserialize(serialized: [Field; FUNCTION_DATA_LENGTH]) -> Self {\n Self {\n selector: FunctionSelector::from_field(serialized[0]),\n is_private: serialized[1] as bool,\n }\n }\n}\n\nimpl Hash for FunctionData {\n fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__FUNCTION_DATA)\n }\n}\n\nimpl Empty for FunctionData {\n fn empty() -> Self {\n FunctionData {\n selector: FunctionSelector::empty(),\n is_private: false\n }\n }\n\n}\n\n#[test]\nfn serialization_of_empty() {\n let data = FunctionData::empty();\n let serialized = data.serialize();\n let deserialized = FunctionData::deserialize(serialized);\n assert(data.eq(deserialized));\n}\n\n#[test]\nfn empty_hash() {\n let data = FunctionData::empty();\n let hash = data.hash();\n\n // Value from function_data.test.ts \"computes empty function data hash\" test\n let test_data_empty_hash = 0x27b1d0839a5b23baf12a8d195b18ac288fcf401afb2f70b8a4b529ede5fa9fed;\n assert_eq(hash, test_data_empty_hash);\n}\n"},"22":{"path":"std/field/mod.nr","source":"mod bn254;\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n pub fn to_le_bits(self: Self, bit_size: u32) -> [u1] {\n crate::assert_constant(bit_size);\n self.__to_le_bits(bit_size)\n }\n\n pub fn to_be_bits(self: Self, bit_size: u32) -> [u1] {\n crate::assert_constant(bit_size);\n self.__to_be_bits(bit_size)\n }\n\n #[builtin(to_le_bits)]\n fn __to_le_bits(self, _bit_size: u32) -> [u1] {}\n\n #[builtin(to_be_bits)]\n fn __to_be_bits(self, bit_size: u32) -> [u1] {}\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(self, bit_size: u32) {}\n\n pub fn assert_max_bit_size(self: Self, bit_size: u32) {\n crate::assert_constant(bit_size);\n assert(bit_size < modulus_num_bits() as u32);\n self.__assert_max_bit_size(bit_size);\n }\n\n pub fn to_le_bytes(self: Self, byte_size: u32) -> [u8] {\n self.to_le_radix(256, byte_size)\n }\n\n pub fn to_be_bytes(self: Self, byte_size: u32) -> [u8] {\n self.to_be_radix(256, byte_size)\n }\n\n pub fn to_le_radix(self: Self, radix: u32, result_len: u32) -> [u8] {\n crate::assert_constant(radix);\n crate::assert_constant(result_len);\n self.__to_le_radix(radix, result_len)\n }\n\n pub fn to_be_radix(self: Self, radix: u32, result_len: u32) -> [u8] {\n crate::assert_constant(radix);\n crate::assert_constant(result_len);\n self.__to_be_radix(radix, result_len)\n }\n\n // decompose `_self` into a `_result_len` vector over the `_radix` basis\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(self, radix: u32, result_len: u32) -> [u8] {}\n\n #[builtin(to_be_radix)]\n fn __to_be_radix(self, radix: u32, result_len: u32) -> [u8] {}\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b = exponent.to_le_bits(32);\n\n for i in 1..33 {\n r *= r;\n r = (b[32-i] as Field) * (r * self) + (1 - b[32-i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x ∈ {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n}\n\n#[builtin(modulus_num_bits)]\npub fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub fn modulus_le_bytes() -> [u8] {}\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n let num_bytes = (modulus_num_bits() as u32 + 7) / 8;\n let x_bytes = x.to_le_bytes(num_bytes);\n let y_bytes = y.to_le_bytes(num_bytes);\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..num_bytes {\n if (!done) {\n let x_byte = x_bytes[num_bytes - 1 - i] as u8;\n let y_byte = y_bytes[num_bytes - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n}\n\n"},"226":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/messaging/l2_to_l1_message.nr","source":"use crate::{\n address::{AztecAddress, EthAddress},\n constants::{L2_TO_L1_MESSAGE_LENGTH, SCOPED_L2_TO_L1_MESSAGE_LENGTH},\n abis::side_effect::{Ordered, Scoped}, traits::{Deserialize, Empty, Serialize},\n utils::{arrays::array_concat, reader::Reader}\n};\n\n// Note: Not to be confused with L2ToL1Msg in Solidity\nstruct L2ToL1Message {\n recipient: EthAddress,\n content: Field,\n counter: u32,\n}\n\nimpl Ordered for L2ToL1Message {\n fn counter(self) -> u32 {\n self.counter\n }\n}\n\nimpl Empty for L2ToL1Message {\n fn empty() -> Self {\n Self {\n recipient: EthAddress::empty(),\n content: 0,\n counter: 0,\n }\n }\n}\n\nimpl Eq for L2ToL1Message {\n fn eq(self, other: Self) -> bool {\n (self.recipient == other.recipient) & (self.content == other.content) & (self.counter == other.counter)\n }\n}\n\nimpl Serialize<L2_TO_L1_MESSAGE_LENGTH> for L2ToL1Message {\n fn serialize(self) -> [Field; L2_TO_L1_MESSAGE_LENGTH] {\n [self.recipient.to_field(), self.content, self.counter as Field]\n }\n}\n\nimpl Deserialize<L2_TO_L1_MESSAGE_LENGTH> for L2ToL1Message {\n fn deserialize(values: [Field; L2_TO_L1_MESSAGE_LENGTH]) -> Self {\n Self {\n recipient: EthAddress::from_field(values[0]),\n content: values[1],\n counter: values[2] as u32,\n }\n }\n}\n\nimpl L2ToL1Message {\n pub fn scope(self, contract_address: AztecAddress) -> ScopedL2ToL1Message {\n ScopedL2ToL1Message { message: self, contract_address }\n }\n}\n\nstruct ScopedL2ToL1Message {\n message: L2ToL1Message,\n contract_address: AztecAddress,\n}\n\nimpl Scoped<L2ToL1Message> for ScopedL2ToL1Message {\n fn inner(self) -> L2ToL1Message {\n self.message\n }\n fn contract_address(self) -> AztecAddress {\n self.contract_address\n }\n}\n\nimpl Ordered for ScopedL2ToL1Message {\n fn counter(self) -> u32 {\n self.message.counter\n }\n}\n\nimpl Eq for ScopedL2ToL1Message {\n fn eq(self, other: ScopedL2ToL1Message) -> bool {\n (self.message == other.message)\n & (self.contract_address == other.contract_address) \n }\n}\n\nimpl Empty for ScopedL2ToL1Message {\n fn empty() -> Self {\n ScopedL2ToL1Message {\n message: L2ToL1Message::empty(),\n contract_address: AztecAddress::empty(),\n }\n }\n}\n\nimpl Serialize<SCOPED_L2_TO_L1_MESSAGE_LENGTH> for ScopedL2ToL1Message {\n fn serialize(self) -> [Field; SCOPED_L2_TO_L1_MESSAGE_LENGTH] {\n array_concat(self.message.serialize(), [self.contract_address.to_field()])\n }\n}\n\nimpl Deserialize<SCOPED_L2_TO_L1_MESSAGE_LENGTH> for ScopedL2ToL1Message {\n fn deserialize(values: [Field; SCOPED_L2_TO_L1_MESSAGE_LENGTH]) -> Self {\n let mut reader = Reader::new(values);\n let res = Self {\n message: reader.read_struct(L2ToL1Message::deserialize),\n contract_address: reader.read_struct(AztecAddress::deserialize),\n };\n reader.finish();\n res\n }\n}\n\n#[test]\nfn serialization_of_empty_l2() {\n let item = L2ToL1Message::empty();\n let serialized = item.serialize();\n let deserialized = L2ToL1Message::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n\n#[test]\nfn serialization_of_empty_scoped_l2() {\n let item = ScopedL2ToL1Message::empty();\n let serialized = item.serialize();\n let deserialized = ScopedL2ToL1Message::deserialize(serialized);\n assert(item.eq(deserialized));\n}\n"},"228":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/storage/map.nr","source":"use crate::{hash::pedersen_hash, traits::ToField};\n\npub fn derive_storage_slot_in_map<K>(storage_slot: Field, key: K) -> Field where K: ToField {\n pedersen_hash([storage_slot, key.to_field()], 0)\n}\n"},"234":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/type_serialization.nr","source":"use crate::traits::{Serialize, Deserialize};\n\nglobal BOOL_SERIALIZED_LEN: Field = 1;\nglobal U8_SERIALIZED_LEN: Field = 1;\nglobal U32_SERIALIZED_LEN: Field = 1;\nglobal U64_SERIALIZED_LEN: Field = 1;\nglobal U128_SERIALIZED_LEN: Field = 1;\nglobal FIELD_SERIALIZED_LEN: Field = 1;\n\nimpl Serialize<BOOL_SERIALIZED_LEN> for bool {\n fn serialize(self) -> [Field; BOOL_SERIALIZED_LEN] {\n [self as Field]\n }\n}\n\nimpl Deserialize<BOOL_SERIALIZED_LEN> for bool {\n fn deserialize(fields: [Field; BOOL_SERIALIZED_LEN]) -> bool {\n fields[0] as bool\n }\n}\n\nimpl Serialize<U8_SERIALIZED_LEN> for u8 {\n fn serialize(self) -> [Field; U32_SERIALIZED_LEN] {\n [self as Field]\n }\n}\n\nimpl Deserialize<U8_SERIALIZED_LEN> for u8 {\n fn deserialize(fields: [Field; U8_SERIALIZED_LEN]) -> Self {\n fields[0] as u8\n }\n}\n\nimpl Serialize<U32_SERIALIZED_LEN> for u32 {\n fn serialize(self) -> [Field; U32_SERIALIZED_LEN] {\n [self as Field]\n }\n}\n\nimpl Deserialize<U32_SERIALIZED_LEN> for u32 {\n fn deserialize(fields: [Field; U32_SERIALIZED_LEN]) -> Self {\n fields[0] as u32\n }\n}\n\nimpl Serialize<U64_SERIALIZED_LEN> for u64 {\n fn serialize(self) -> [Field; U64_SERIALIZED_LEN] {\n [self as Field]\n }\n}\n\nimpl Deserialize<U64_SERIALIZED_LEN> for u64 {\n fn deserialize(fields: [Field; U64_SERIALIZED_LEN]) -> Self {\n fields[0] as u64\n }\n}\n\nimpl Serialize<U128_SERIALIZED_LEN> for U128 {\n fn serialize(self) -> [Field; 1] {\n [self.to_integer()]\n }\n\n}\n\nimpl Deserialize<U128_SERIALIZED_LEN> for U128 {\n fn deserialize(fields: [Field; U128_SERIALIZED_LEN]) -> Self {\n U128::from_integer(fields[0])\n }\n}\n\nimpl Serialize<FIELD_SERIALIZED_LEN> for Field {\n fn serialize(self) -> [Field; U32_SERIALIZED_LEN] {\n [self]\n }\n}\n\nimpl Deserialize<FIELD_SERIALIZED_LEN> for Field {\n fn deserialize(fields: [Field; FIELD_SERIALIZED_LEN]) -> Self {\n fields[0]\n }\n}\n"},"235":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/traits.nr","source":"use crate::utils::field::field_from_bytes;\n\n// Trait: is_empty\n//\n// The general is_empty trait checks if a data type is is empty,\n// and it defines empty for the basic data types as 0.\n//\n// If a Field is equal to zero, then it is regarded as zero.\n// We will go with this definition for now, however it can be problematic \n// if a value can actually be zero. In a future refactor, we can \n// use the optional type for safety. Doing it now would lead to a worse devex\n// and would make it harder to sync up with the cpp code.\n// Preferred over Default trait to convey intent, as default doesn't necessarily mean empty.\ntrait Empty {\n fn empty() -> Self;\n}\n\nimpl Empty for Field { fn empty() -> Self {0} }\n\nimpl Empty for u1 { fn empty() -> Self {0} }\nimpl Empty for u8 { fn empty() -> Self {0} }\nimpl Empty for u32 { fn empty() -> Self {0} }\nimpl Empty for u64 { fn empty() -> Self {0} }\nimpl Empty for U128 { fn empty() -> Self {U128::from_integer(0)} }\n\npub fn is_empty<T>(item: T) -> bool where T: Empty + Eq {\n item.eq(T::empty())\n}\n\npub fn is_empty_array<T, N>(array: [T; N]) -> bool where T: Empty + Eq {\n array.all(|elem| is_empty(elem))\n}\n\ntrait Hash {\n fn hash(self) -> Field;\n}\n\ntrait ToField {\n fn to_field(self) -> Field;\n}\n\nimpl ToField for Field {\n fn to_field(self) -> Field {\n self\n }\n}\n\nimpl ToField for bool { fn to_field(self) -> Field { self as Field } }\nimpl ToField for u1 { fn to_field(self) -> Field { self as Field } }\nimpl ToField for u8 { fn to_field(self) -> Field { self as Field } }\nimpl ToField for u32 { fn to_field(self) -> Field { self as Field } }\nimpl ToField for u64 { fn to_field(self) -> Field { self as Field } }\nimpl ToField for U128 {\n fn to_field(self) -> Field {\n self.to_integer()\n }\n}\nimpl<N> ToField for str<N> {\n fn to_field(self) -> Field {\n assert(N < 32, \"String doesn't fit in a field, consider using Serialize instead\");\n field_from_bytes(self.as_bytes(), true)\n }\n}\n\ntrait FromField {\n fn from_field(value: Field) -> Self;\n}\n\nimpl FromField for Field {\n fn from_field(value: Field) -> Self {\n value\n }\n}\n\nimpl FromField for bool { fn from_field(value: Field) -> Self { value as bool } }\nimpl FromField for u1 { fn from_field(value: Field) -> Self { value as u1 } }\nimpl FromField for u8 { fn from_field(value: Field) -> Self { value as u8 } }\nimpl FromField for u32 { fn from_field(value: Field) -> Self { value as u32 } }\nimpl FromField for u64 { fn from_field(value: Field) -> Self { value as u64 } }\nimpl FromField for U128 {\n fn from_field(value: Field) -> Self {\n U128::from_integer(value)\n }\n}\n\n// docs:start:serialize\ntrait Serialize<N> {\n fn serialize(self) -> [Field; N];\n}\n// docs:end:serialize\n\nimpl<N> Serialize<N> for [Field; N] {\n fn serialize(self) -> [Field; N] {\n self\n }\n}\nimpl<N> Serialize<N> for str<N> {\n fn serialize(self) -> [Field; N] {\n let mut result = [0; N];\n let bytes: [u8; N] = self.as_bytes();\n for i in 0..N {\n result[i] = field_from_bytes([bytes[i];1], true);\n }\n result\n }\n}\n\n// docs:start:deserialize\ntrait Deserialize<N> {\n fn deserialize(fields: [Field; N]) -> Self;\n}\n// docs:end:deserialize\n\nimpl<N> Deserialize<N> for [Field; N] {\n fn deserialize(fields: [Field; N]) -> Self {\n fields\n }\n}\n"},"236":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/debug_log.nr","source":"// Utility function to console.log data in the acir simulator\n// WARNING: sometimes when using debug logs the ACVM errors with: `thrown: \"solver opcode resolution error: cannot solve opcode: expression has too many unknowns x155\"`\n\n#[oracle(debugLog)]\nunconstrained fn debug_log_oracle<M, N>(_msg: str<M>, args: [Field]) {}\n\n/// NOTE: call this with a str<N> msg of form\n/// \"some string with {0} and {1} ... {N}\"\n/// and an array of N field which will be formatted\n/// into the string in the simulator.\n/// Example:\n/// debug_log_format(\"get_2(slot:{0}) =>\\n\\t0:{1}\\n\\t1:{2}\", [storage_slot, note0_hash, note1_hash]);\n/// debug_log_format(\"whole array: {}\", [e1, e2, e3, e4]);\nunconstrained pub fn debug_log_format<M, N>(msg: str<M>, args: [Field; N]) {\n debug_log_oracle(msg, args.as_slice());\n}\n\n/// NOTE: call this with a str<N> msg of length > 1\n/// Example:\n/// `debug_log(\"blah blah this is a debug string\");`\nunconstrained pub fn debug_log<N>(msg: str<N>) {\n debug_log_format(msg, []);\n}\n"},"237":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/content_commitment.nr","source":"use crate::{\n constants::CONTENT_COMMITMENT_LENGTH, traits::{Deserialize, Empty, Hash, Serialize},\n utils::arr_copy_slice\n};\n\nstruct ContentCommitment {\n num_txs: Field,\n txs_effects_hash: Field,\n in_hash: Field,\n out_hash: Field,\n}\n\nimpl Serialize<CONTENT_COMMITMENT_LENGTH> for ContentCommitment {\n fn serialize(self) -> [Field; CONTENT_COMMITMENT_LENGTH] {\n let mut fields: BoundedVec<Field, CONTENT_COMMITMENT_LENGTH> = BoundedVec::new();\n\n fields.push(self.num_txs);\n fields.push(self.txs_effects_hash);\n fields.push(self.in_hash);\n fields.push(self.out_hash);\n\n fields.storage\n }\n}\n\nimpl Deserialize<CONTENT_COMMITMENT_LENGTH> for ContentCommitment {\n fn deserialize(serialized: [Field; CONTENT_COMMITMENT_LENGTH]) -> Self {\n let num_txs = serialized[0];\n\n let txs_effects_hash = serialized[1];\n\n let in_hash = serialized[2];\n\n let out_hash = serialized[3];\n\n Self {\n num_txs,\n txs_effects_hash,\n in_hash,\n out_hash,\n }\n }\n}\n\nimpl Empty for ContentCommitment {\n fn empty() -> Self {\n Self {\n num_txs: 0,\n txs_effects_hash: 0,\n in_hash: 0,\n out_hash: 0,\n }\n }\n}\n\nimpl Eq for ContentCommitment {\n fn eq(self, other: Self) -> bool {\n (self.num_txs == other.num_txs)\n & (self.txs_effects_hash == other.txs_effects_hash)\n & (self.in_hash == other.in_hash)\n & (self.out_hash == other.out_hash)\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let empty = ContentCommitment::empty();\n let serialized = empty.serialize();\n let deserialized = ContentCommitment::deserialize(serialized);\n\n assert(empty.eq(deserialized));\n}\n"},"238":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/public_data_tree_leaf_preimage.nr","source":"use crate::{merkle_tree::leaf_preimage::IndexedTreeLeafPreimage, traits::{Empty, Hash}};\n\nstruct PublicDataTreeLeafPreimage {\n slot : Field,\n value: Field,\n next_slot :Field,\n next_index : u32,\n}\n\nimpl Empty for PublicDataTreeLeafPreimage {\n fn empty() -> Self {\n Self {\n slot: 0,\n value: 0,\n next_slot: 0,\n next_index: 0,\n }\n }\n}\n\nimpl Hash for PublicDataTreeLeafPreimage {\n fn hash(self) -> Field {\n if self.is_empty() {\n 0\n } else {\n std::hash::pedersen_hash([self.slot, self.value, (self.next_index as Field), self.next_slot])\n }\n }\n}\n\nimpl IndexedTreeLeafPreimage for PublicDataTreeLeafPreimage {\n fn get_key(self) -> Field {\n self.slot\n }\n\n fn get_next_key(self) -> Field {\n self.next_slot\n }\n\n fn as_leaf(self) -> Field {\n self.hash()\n }\n}\n\nimpl PublicDataTreeLeafPreimage {\n pub fn is_empty(self) -> bool {\n (self.slot == 0) & (self.value == 0) & (self.next_slot == 0) & (self.next_index == 0)\n }\n}\n"},"239":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/header.nr","source":"use crate::{\n abis::{\n append_only_tree_snapshot::{AppendOnlyTreeSnapshot, APPEND_ONLY_TREE_SNAPSHOT_LENGTH},\n global_variables::{GlobalVariables, GLOBAL_VARIABLES_LENGTH}\n},\n constants::{GENERATOR_INDEX__BLOCK_HASH, HEADER_LENGTH, STATE_REFERENCE_LENGTH, CONTENT_COMMITMENT_LENGTH},\n hash::pedersen_hash, state_reference::StateReference, traits::{Deserialize, Empty, Hash, Serialize},\n utils::arr_copy_slice, content_commitment::ContentCommitment\n};\n\n// docs:start:header\nstruct Header {\n last_archive: AppendOnlyTreeSnapshot,\n content_commitment: ContentCommitment,\n state: StateReference,\n global_variables: GlobalVariables,\n total_fees: Field\n}\n// docs:end:header\n\nimpl Eq for Header {\n fn eq(self, other: Self) -> bool {\n self.last_archive.eq(other.last_archive) &\n self.content_commitment.eq(other.content_commitment) &\n self.state.eq(other.state) &\n self.global_variables.eq(other.global_variables) &\n self.total_fees.eq(other.total_fees)\n }\n}\n\nimpl Serialize<HEADER_LENGTH> for Header {\n fn serialize(self) -> [Field; HEADER_LENGTH] {\n let mut fields: BoundedVec<Field, HEADER_LENGTH> = BoundedVec::new();\n\n fields.extend_from_array(self.last_archive.serialize());\n fields.extend_from_array(self.content_commitment.serialize());\n fields.extend_from_array(self.state.serialize());\n fields.extend_from_array(self.global_variables.serialize());\n fields.push(self.total_fees);\n\n fields.storage\n }\n}\n\nimpl Deserialize<HEADER_LENGTH> for Header {\n fn deserialize(serialized: [Field; HEADER_LENGTH]) -> Self {\n let mut offset = 0;\n\n let last_archive_fields = arr_copy_slice(serialized, [0; APPEND_ONLY_TREE_SNAPSHOT_LENGTH], offset);\n offset = offset + APPEND_ONLY_TREE_SNAPSHOT_LENGTH;\n\n let content_commitment_fields = arr_copy_slice(serialized, [0; CONTENT_COMMITMENT_LENGTH], offset);\n offset = offset + CONTENT_COMMITMENT_LENGTH;\n\n let state_fields = arr_copy_slice(serialized, [0; STATE_REFERENCE_LENGTH], offset);\n offset = offset + STATE_REFERENCE_LENGTH;\n\n let global_variables_fields = arr_copy_slice(serialized, [0; GLOBAL_VARIABLES_LENGTH], offset);\n offset = offset + GLOBAL_VARIABLES_LENGTH;\n\n let total_fees = serialized[offset];\n\n Header {\n last_archive: AppendOnlyTreeSnapshot::deserialize(last_archive_fields),\n content_commitment: ContentCommitment::deserialize(content_commitment_fields),\n state: StateReference::deserialize(state_fields),\n global_variables: GlobalVariables::deserialize(global_variables_fields),\n total_fees\n }\n }\n}\n\nimpl Empty for Header {\n fn empty() -> Self {\n Self {\n last_archive: AppendOnlyTreeSnapshot::zero(),\n content_commitment: ContentCommitment::empty(),\n state: StateReference::empty(),\n global_variables: GlobalVariables::empty(),\n total_fees: 0\n }\n }\n}\n\nimpl Hash for Header {\n fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__BLOCK_HASH)\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let header = Header::empty();\n let serialized = header.serialize();\n let deserialized = Header::deserialize(serialized);\n assert(header.eq(deserialized));\n}\n\n#[test]\nfn hash_smoke() {\n let header = Header::empty();\n let _hashed = header.hash();\n}\n\n#[test]\nfn empty_hash_is_zero() {\n let header = Header::empty();\n let hash = header.hash();\n\n // Value from new_contract_data.test.ts \"computes empty hash\" test\n let test_data_empty_hash = 0x124e8c40a6eca2e3ad10c04050b01a3fad00df3cea47b13592c7571b6914c7a7;\n assert_eq(hash, test_data_empty_hash);\n}\n"},"24":{"path":"std/hash/mod.nr","source":"mod poseidon;\nmod mimc;\nmod poseidon2;\n\nuse crate::default::Default;\nuse crate::uint128::U128;\nuse crate::sha256::{digest, sha256_var};\nuse crate::embedded_curve_ops::{EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul};\n\n#[foreign(sha256)]\n// docs:start:sha256\npub fn sha256<let N: u32>(input: [u8; N]) -> [u8; 32]\n// docs:end:sha256\n{}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s<let N: u32>(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n#[foreign(blake3)]\n// docs:start:blake3\npub fn blake3<let N: u32>(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment<let N: u32>(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n let value = pedersen_commitment_with_separator(input, 0);\n if (value.x == 0) & (value.y == 0) {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n } else {\n EmbeddedCurvePoint { x: value.x, y: value.y, is_infinite: false }\n }\n}\n\nfn pedersen_commitment_with_separator_noir<let N: u32>(input: [Field; N], separator: u32) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n points[i] = EmbeddedCurveScalar::from_field(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n let values = multi_scalar_mul(generators, points);\n EmbeddedCurvePoint { x: values[0], y: values[1], is_infinite: values[2] as bool }\n}\n\npub fn pedersen_commitment_with_separator<let N: u32>(input: [Field; N], separator: u32) -> EmbeddedCurvePoint {\n let values = __pedersen_commitment_with_separator(input, separator);\n EmbeddedCurvePoint { x: values[0], y: values[1], is_infinite: false }\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash<let N: u32>(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[field(bn254)]\nfn derive_generators<let N: u32, let M: u32>(\n domain_separator_bytes: [u8; M],\n starting_index: u32\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n crate::assert_constant(starting_index);\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators<let N: u32, let M: u32>(domain_separator_bytes: [u8; M], starting_index: u32) -> [EmbeddedCurvePoint; N] {}\n\nfn pedersen_hash_with_separator_noir<let N: u32>(input: [Field; N], separator: u32) -> Field {\n let v1 = pedersen_commitment_with_separator(input, separator);\n let length_generator : [EmbeddedCurvePoint; 1] = derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n multi_scalar_mul(\n [length_generator[0], v1],\n [EmbeddedCurveScalar { lo: N as Field, hi: 0 }, EmbeddedCurveScalar { lo: 1, hi: 0 }]\n )[0]\n}\n\n#[foreign(pedersen_hash)]\npub fn pedersen_hash_with_separator<let N: u32>(input: [Field; N], separator: u32) -> Field {}\n\n#[foreign(pedersen_commitment)]\nfn __pedersen_commitment_with_separator<let N: u32>(input: [Field; N], separator: u32) -> [Field; 2] {}\n\npub fn hash_to_field(inputs: [Field]) -> Field {\n let mut sum = 0;\n\n for input in inputs {\n let input_bytes: [u8; 32] = input.to_le_bytes(32).as_array();\n sum += crate::field::bytes32_to_field(blake2s(input_bytes));\n }\n\n sum\n}\n\n#[foreign(keccak256)]\n// docs:start:keccak256\npub fn keccak256<let N: u32>(input: [u8; N], message_size: u32) -> [u8; 32]\n// docs:end:keccak256\n{}\n\n#[foreign(poseidon2_permutation)]\npub fn poseidon2_permutation<let N: u32>(_input: [Field; N], _state_length: u32) -> [Field; N] {}\n\n#[foreign(sha256_compression)]\npub fn sha256_compression(_input: [u32; 16], _state: [u32; 8]) -> [u32; 8] {}\n\n// Generic hashing support. \n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\ntrait Hash{\n fn hash<H>(self, state: &mut H) where H: Hasher;\n}\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\ntrait Hasher{\n fn finish(self) -> Field;\n \n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\ntrait BuildHasher<H> where H: Hasher{\n fn build_hasher(self) -> H;\n}\n\nstruct BuildHasherDefault<H>;\n\nimpl<H> BuildHasher<H> for BuildHasherDefault<H>\nwhere \n H: Hasher + Default\n{\n fn build_hasher(_self: Self) -> H{\n H::default()\n }\n}\n\nimpl<H> Default for BuildHasherDefault<H>\nwhere \n H: Hasher + Default\n{\n fn default() -> Self{\n BuildHasherDefault{}\n } \n}\n\nimpl Hash for Field {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n H::write(state, self);\n }\n}\n\nimpl Hash for u8 {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash<H>(_self: Self, _state: &mut H) where H: Hasher {}\n}\n\nimpl Hash for U128 {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n H::write(state, self.lo as Field);\n H::write(state, self.hi as Field);\n }\n}\n\nimpl<T, let N: u32> Hash for [T; N] where T: Hash {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl<T> Hash for [T] where T: Hash {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl<A, B> Hash for (A, B) where A: Hash, B: Hash {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl<A, B, C> Hash for (A, B, C) where A: Hash, B: Hash, C: Hash {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl<A, B, C, D> Hash for (A, B, C, D) where A: Hash, B: Hash, C: Hash, D: Hash {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl<A, B, C, D, E> Hash for (A, B, C, D, E) where A: Hash, B: Hash, C: Hash, D: Hash, E: Hash {\n fn hash<H>(self, state: &mut H) where H: Hasher{\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n#[test]\nfn assert_pedersen_noir() {\n // TODO: make this a fuzzer test once fuzzer supports curve-specific blackbox functions.\n let input = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\n assert_eq(pedersen_hash_with_separator(input, 4), pedersen_hash_with_separator_noir(input, 4));\n assert_eq(pedersen_commitment_with_separator(input, 4), pedersen_commitment_with_separator_noir(input, 4));\n}\n"},"240":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/hash.nr","source":"use crate::{\n abis::{\n contract_class_function_leaf_preimage::ContractClassFunctionLeafPreimage,\n function_selector::FunctionSelector, log_hash::{LogHash, ScopedLogHash, ScopedEncryptedLogHash},\n note_hash::ScopedNoteHash, nullifier::ScopedNullifier\n},\n address::{AztecAddress, EthAddress},\n constants::{\n FUNCTION_TREE_HEIGHT, GENERATOR_INDEX__SILOED_NOTE_HASH, GENERATOR_INDEX__OUTER_NULLIFIER,\n GENERATOR_INDEX__VK, GENERATOR_INDEX__NOTE_HASH_NONCE, GENERATOR_INDEX__UNIQUE_NOTE_HASH,\n MAX_ENCRYPTED_LOGS_PER_TX, MAX_NOTE_ENCRYPTED_LOGS_PER_TX\n},\n merkle_tree::root::root_from_sibling_path, messaging::l2_to_l1_message::ScopedL2ToL1Message,\n recursion::verification_key::VerificationKey, traits::is_empty,\n utils::field::field_from_bytes_32_trunc\n};\nuse std::hash::{pedersen_hash_with_separator, sha256};\n\npub fn sha256_to_field<N>(bytes_to_hash: [u8; N]) -> Field {\n let sha256_hashed = sha256(bytes_to_hash);\n 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(function_leaf, function_leaf_index, function_leaf_sibling_path)\n}\n\nfn compute_note_hash_nonce(tx_hash: Field, note_index_in_tx: u32) -> Field {\n // Hashing tx hash with note index in tx is guaranteed to be unique\n pedersen_hash(\n [\n tx_hash,\n note_index_in_tx as Field\n ],\n GENERATOR_INDEX__NOTE_HASH_NONCE\n )\n}\n\npub fn compute_unique_note_hash(nonce: Field, inner_note_hash: Field) -> Field {\n let inputs = [nonce, inner_note_hash];\n pedersen_hash(inputs, GENERATOR_INDEX__UNIQUE_NOTE_HASH)\n}\n\npub fn compute_siloed_note_hash(app: AztecAddress, unique_note_hash: Field) -> Field {\n pedersen_hash(\n [\n app.to_field(),\n unique_note_hash\n ],\n GENERATOR_INDEX__SILOED_NOTE_HASH\n )\n}\n\npub fn silo_note_hash(note_hash: ScopedNoteHash, tx_hash: Field, note_index_in_tx: u32) -> Field {\n if note_hash.contract_address.is_zero() {\n 0\n } else {\n let nonce = compute_note_hash_nonce(tx_hash, note_index_in_tx);\n let unique_note_hash = compute_unique_note_hash(nonce, note_hash.value());\n compute_siloed_note_hash(note_hash.contract_address, unique_note_hash)\n }\n}\n\npub fn compute_siloed_nullifier(app: AztecAddress, nullifier: Field) -> Field {\n pedersen_hash(\n [\n app.to_field(),\n nullifier\n ],\n GENERATOR_INDEX__OUTER_NULLIFIER\n )\n}\n\npub fn silo_nullifier(nullifier: ScopedNullifier) -> Field {\n if nullifier.contract_address.is_zero() {\n nullifier.value() // Return value instead of 0 because the first nullifier's contract address is zero.\n } else {\n compute_siloed_nullifier(nullifier.contract_address, nullifier.value())\n }\n}\n\npub fn compute_siloed_encrypted_log_hash(address: AztecAddress, randomness: Field, log_hash: Field) -> Field {\n // TODO: Using 0 GENERATOR_INDEX here as interim before we move to posiedon\n // NB: A unique separator will be needed for masked_contract_address\n let mut masked_contract_address = pedersen_hash([address.to_field(), randomness], 0);\n if randomness == 0 {\n // In some cases, we actually want to reveal the contract address we are siloing with:\n // e.g. 'handshaking' contract w/ known address\n // An app providing randomness = 0 signals to not mask the address.\n masked_contract_address = address.to_field();\n }\n accumulate_sha256([masked_contract_address, log_hash])\n}\n\npub fn silo_encrypted_log_hash(log_hash: ScopedEncryptedLogHash) -> Field {\n if log_hash.contract_address.is_zero() {\n 0\n } else {\n compute_siloed_encrypted_log_hash(\n log_hash.contract_address,\n log_hash.log_hash.randomness,\n log_hash.log_hash.value\n )\n }\n}\n\npub fn compute_siloed_unencrypted_log_hash(address: AztecAddress, log_hash: Field) -> Field {\n accumulate_sha256([address.to_field(), log_hash])\n}\n\npub fn silo_unencrypted_log_hash(log_hash: ScopedLogHash) -> Field {\n if log_hash.contract_address.is_zero() {\n 0\n } else {\n compute_siloed_unencrypted_log_hash(log_hash.contract_address, log_hash.value())\n }\n}\n\npub fn merkle_hash(left: Field, right: Field) -> Field {\n pedersen_hash([left, right], 0)\n}\n\npub fn stdlib_recursion_verification_key_compress_native_vk(_vk: VerificationKey) -> Field {\n // Original cpp code\n // stdlib::recursion::verification_key<CT::bn254>::compress_native(private_call.vk, GeneratorIndex::VK);\n // The above cpp method is only ever called on verification key, so it has been special cased here\n let _hash_index = GENERATOR_INDEX__VK;\n 0\n}\n\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 mut bytes: BoundedVec<u8, 160> = BoundedVec::new();\n\n let inputs = [contract_address.to_field(), rollup_version_id, recipient.to_field(), chain_id, content];\n for i in 0..inputs.len() {\n // TODO are bytes be in fr.to_buffer() ?\n let item_bytes = inputs[i].to_be_bytes(32);\n for j in 0..32 {\n bytes.push(item_bytes[j]);\n }\n }\n\n sha256_to_field(bytes.storage)\n}\n\npub fn silo_l2_to_l1_message(msg: ScopedL2ToL1Message, rollup_version_id: Field, chain_id: Field) -> Field {\n if msg.contract_address.is_zero() {\n 0\n } else {\n compute_l2_to_l1_hash(\n msg.contract_address,\n msg.message.recipient,\n msg.message.content,\n rollup_version_id,\n chain_id\n )\n }\n}\n\n// Computes sha256 hash of 2 input hashes.\n//\n// NB: This method now takes in two 31 byte fields - it assumes that any input\n// is the result of a sha_to_field hash and => is truncated\n//\n// TODO(Jan and David): This is used for the encrypted_log hashes.\n// Can we check to see if we can just use hash_to_field or pedersen_compress here?\n//\npub fn accumulate_sha256(input: [Field; 2]) -> Field {\n // This is a note about the cpp code, since it takes an array of Fields\n // instead of a U128.\n // 4 Field elements when converted to bytes will usually \n // occupy 4 * 32 = 128 bytes.\n // However, this function is making the assumption that each Field \n // only occupies 128 bits.\n //\n // TODO(David): This does not seem to be getting guaranteed anywhere in the code?\n\n // Concatentate two fields into 32x2 = 64 bytes\n // accumulate_sha256 assumes that the inputs are pre-truncated 31 byte numbers\n let mut hash_input_flattened = [0; 64];\n for offset in 0..input.len() {\n let input_as_bytes = input[offset].to_be_bytes(32);\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n\n sha256_to_field(hash_input_flattened)\n}\n\n// Computes the final logs hash for a tx.\n// NB: this assumes MAX_ENCRYPTED_LOGS_PER_TX == MAX_UNENCRYPTED_LOGS_PER_TX\n// to avoid doubling code, since we can't define the byte len to be 32*N directly. \npub fn compute_tx_logs_hash(logs: [LogHash; MAX_ENCRYPTED_LOGS_PER_TX]) -> Field {\n // Convert each field element into a byte array and append the bytes to `hash_input_flattened`\n let mut hash_input_flattened = [0; MAX_ENCRYPTED_LOGS_PER_TX * 32];\n for offset in 0..MAX_ENCRYPTED_LOGS_PER_TX {\n let input_as_bytes = logs[offset].value.to_be_bytes(32);\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n // Ideally we would push to a slice then hash, but there is no sha_slice\n // Hardcode to 256 bytes for now\n let mut hash = sha256_to_field(hash_input_flattened);\n // Not having a 0 value hash for empty logs causes issues with empty txs\n // used for padding. Returning early is currently unsupported.\n // We always provide sorted logs here, so 0 being empty means all are empty.\n if is_empty(logs[0]) {\n hash = 0;\n }\n hash\n}\n\npub fn compute_tx_note_logs_hash(logs: [LogHash; MAX_NOTE_ENCRYPTED_LOGS_PER_TX]) -> Field {\n // Convert each field element into a byte array and append the bytes to `hash_input_flattened`\n let mut hash_input_flattened = [0; MAX_NOTE_ENCRYPTED_LOGS_PER_TX * 32];\n for offset in 0..MAX_NOTE_ENCRYPTED_LOGS_PER_TX {\n let input_as_bytes = logs[offset].value.to_be_bytes(32);\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n // Ideally we would push to a slice then hash, but there is no sha_slice\n // Hardcode to 256 bytes for now\n let mut hash = sha256_to_field(hash_input_flattened);\n // Not having a 0 value hash for empty logs causes issues with empty txs\n // used for padding. Returning early is currently unsupported.\n // We always provide sorted logs here, so 0 being empty means all are empty.\n if is_empty(logs[0]) {\n hash = 0;\n }\n hash\n}\n\npub fn pedersen_hash<N>(inputs: [Field; N], hash_index: u32) -> Field {\n std::hash::pedersen_hash_with_separator(inputs, hash_index)\n}\n\npub fn poseidon2_hash<N>(inputs: [Field; N]) -> Field {\n std::hash::poseidon2::Poseidon2::hash(inputs, N)\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,\n 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,\n 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,\n 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,\n 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,\n 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,\n 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139,\n 140, 141, 142, 143, 144, 145, 146, 147, 148, 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(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 = compute_l2_to_l1_hash(AztecAddress::from_field(0), EthAddress::zero(), 0, 0, 0);\n assert(hash_result == 0xb393978842a0fa3d3e1470196f098f473f9678e72463cb65ec4ab5581856c2);\n\n // Non-zero case\n let hash_result = compute_l2_to_l1_hash(AztecAddress::from_field(1), EthAddress::from_field(3), 5, 2, 4);\n assert(hash_result == 0x3f88c1044a05e5340ed20466276500f6d45ca5603913b9091e957161734e16);\n}\n"},"241":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/partial_state_reference.nr","source":"use crate::{\n abis::append_only_tree_snapshot::AppendOnlyTreeSnapshot, constants::PARTIAL_STATE_REFERENCE_LENGTH,\n traits::{Deserialize, Empty, Serialize}\n};\n\nstruct PartialStateReference {\n note_hash_tree: AppendOnlyTreeSnapshot,\n nullifier_tree: AppendOnlyTreeSnapshot,\n public_data_tree: AppendOnlyTreeSnapshot,\n}\n\nimpl Eq for PartialStateReference {\n fn eq(self, other: PartialStateReference) -> bool {\n self.note_hash_tree.eq(other.note_hash_tree) &\n self.nullifier_tree.eq(other.nullifier_tree) &\n self.public_data_tree.eq(other.public_data_tree)\n }\n}\n\nimpl Serialize<PARTIAL_STATE_REFERENCE_LENGTH> for PartialStateReference {\n fn serialize(self) -> [Field; PARTIAL_STATE_REFERENCE_LENGTH] {\n let serialized_note_hash_tree = self.note_hash_tree.serialize();\n let serialized_nullifier_tree = self.nullifier_tree.serialize();\n let serialized_public_data_tree = self.public_data_tree.serialize();\n\n [\n serialized_note_hash_tree[0], \n serialized_note_hash_tree[1],\n serialized_nullifier_tree[0],\n serialized_nullifier_tree[1],\n serialized_public_data_tree[0],\n serialized_public_data_tree[1],\n ]\n }\n}\n\nimpl Deserialize<PARTIAL_STATE_REFERENCE_LENGTH> for PartialStateReference {\n fn deserialize(serialized: [Field; PARTIAL_STATE_REFERENCE_LENGTH]) -> PartialStateReference {\n PartialStateReference {\n note_hash_tree: AppendOnlyTreeSnapshot::deserialize(\n [serialized[0], serialized[1]]\n ),\n nullifier_tree: AppendOnlyTreeSnapshot::deserialize(\n [serialized[2], serialized[3]]\n ),\n public_data_tree: AppendOnlyTreeSnapshot::deserialize(\n [serialized[4], serialized[5]]\n ),\n }\n }\n}\n\nimpl Empty for PartialStateReference {\n fn empty() -> Self {\n Self {\n note_hash_tree: AppendOnlyTreeSnapshot::zero(),\n nullifier_tree: AppendOnlyTreeSnapshot::zero(),\n public_data_tree: AppendOnlyTreeSnapshot::zero(),\n }\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let partial = PartialStateReference::empty();\n let _serialized = partial.serialize();\n let _deserialized = PartialStateReference::deserialize(_serialized);\n}\n"},"243":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/transaction/tx_context.nr","source":"use crate::{\n constants::{GENERATOR_INDEX__TX_CONTEXT, TX_CONTEXT_LENGTH}, hash::pedersen_hash,\n traits::{Deserialize, Hash, Serialize, Empty}, utils::reader::Reader,\n abis::gas_settings::GasSettings\n};\n\n// docs:start:tx-context\nstruct TxContext {\n chain_id : Field,\n version : Field,\n gas_settings: GasSettings,\n}\n// docs:end:tx-context\n\nimpl TxContext {\n pub fn new(chain_id: Field, version: Field, gas_settings: GasSettings) -> Self {\n TxContext { chain_id, version, gas_settings }\n }\n}\n\nimpl Eq for TxContext {\n fn eq(self, other: Self) -> bool {\n (self.chain_id == other.chain_id) &\n (self.version == other.version) &\n (self.gas_settings.eq(other.gas_settings))\n }\n}\n\nimpl Empty for TxContext {\n fn empty() -> Self {\n TxContext {\n chain_id: 0,\n version: 0,\n gas_settings: GasSettings::empty(),\n }\n }\n}\n\nimpl Serialize<TX_CONTEXT_LENGTH> for TxContext {\n fn serialize(self) -> [Field; TX_CONTEXT_LENGTH] {\n let mut fields: BoundedVec<Field, TX_CONTEXT_LENGTH> = BoundedVec::new();\n\n fields.push(self.chain_id);\n fields.push(self.version);\n fields.extend_from_array(self.gas_settings.serialize());\n\n assert_eq(fields.len(), TX_CONTEXT_LENGTH);\n\n fields.storage\n }\n}\n\nimpl Deserialize<TX_CONTEXT_LENGTH> for TxContext {\n fn deserialize(serialized: [Field; TX_CONTEXT_LENGTH]) -> Self {\n // TODO(#4390): This should accept a reader ^ to avoid copying data.\n let mut reader = Reader::new(serialized);\n\n let context = Self {\n chain_id: reader.read(),\n version: reader.read(),\n gas_settings: reader.read_struct(GasSettings::deserialize),\n };\n\n reader.finish();\n context\n }\n}\n\nimpl Hash for TxContext {\n fn hash(self) -> Field {\n pedersen_hash(self.serialize(), GENERATOR_INDEX__TX_CONTEXT)\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let context = TxContext::empty();\n let serialized = context.serialize();\n let deserialized = TxContext::deserialize(serialized);\n assert(context.eq(deserialized));\n}\n\n#[test]\nfn empty_hash() {\n let context = TxContext::empty();\n let hash = context.hash();\n\n // Value from tx_context.test.ts \"computes empty item hash\" test\n let test_data_empty_hash = 0x17e4357684c5a4349b4587c95b0b6161dcb4a3c5b02d4eb2ecc3b02c80193261;\n assert_eq(hash, test_data_empty_hash);\n}\n"},"245":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/contract_instance.nr","source":"use crate::{\n address::{\n aztec_address::AztecAddress, eth_address::EthAddress, partial_address::PartialAddress,\n public_keys_hash::PublicKeysHash\n},\n contract_class_id::ContractClassId,\n constants::{GENERATOR_INDEX__CONTRACT_DEPLOYMENT_DATA, CONTRACT_INSTANCE_LENGTH},\n traits::{Deserialize, Hash, Serialize}\n};\n\nstruct ContractInstance {\n salt : Field,\n deployer: AztecAddress,\n contract_class_id : ContractClassId,\n initialization_hash : Field,\n public_keys_hash : PublicKeysHash,\n}\n\nimpl Eq for ContractInstance {\n fn eq(self, other: Self) -> bool {\n self.public_keys_hash.eq(other.public_keys_hash) &\n self.initialization_hash.eq(other.initialization_hash) &\n self.contract_class_id.eq(other.contract_class_id) &\n self.salt.eq(other.salt)\n }\n}\n\nimpl Serialize<CONTRACT_INSTANCE_LENGTH> for ContractInstance {\n fn serialize(self) -> [Field; CONTRACT_INSTANCE_LENGTH] {\n [\n self.salt,\n self.deployer.to_field(),\n self.contract_class_id.to_field(),\n self.initialization_hash,\n self.public_keys_hash.to_field()\n ]\n }\n}\n\nimpl Deserialize<CONTRACT_INSTANCE_LENGTH> for ContractInstance {\n fn deserialize(serialized: [Field; CONTRACT_INSTANCE_LENGTH]) -> Self {\n Self {\n salt: serialized[0],\n deployer: AztecAddress::from_field(serialized[1]),\n contract_class_id: ContractClassId::from_field(serialized[2]),\n initialization_hash: serialized[3],\n public_keys_hash: PublicKeysHash::from_field(serialized[4]),\n }\n }\n}\n\nimpl Hash for ContractInstance {\n fn hash(self) -> Field {\n self.to_address().to_field()\n }\n}\n\nimpl ContractInstance {\n fn to_address(self) -> AztecAddress {\n AztecAddress::compute(\n self.public_keys_hash,\n PartialAddress::compute(\n self.contract_class_id,\n self.salt,\n self.initialization_hash,\n self.deployer\n )\n )\n }\n}\n"},"246":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/contract_class_id.nr","source":"use crate::constants::GENERATOR_INDEX__CONTRACT_LEAF;\nuse crate::traits::{ToField, FromField, Hash, Serialize, Deserialize};\n\nstruct ContractClassId {\n inner: Field\n}\n\nimpl Eq for ContractClassId {\n fn eq(self, other: ContractClassId) -> bool {\n other.inner == self.inner\n }\n}\n\nimpl ToField for ContractClassId {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl FromField for ContractClassId {\n fn from_field(value: Field) -> Self {\n Self { inner: value }\n }\n}\n\nimpl Serialize<1> for ContractClassId {\n fn serialize(self: Self) -> [Field; 1] {\n [self.inner]\n }\n}\n\nimpl Deserialize<1> for ContractClassId {\n fn deserialize(fields: [Field; 1]) -> Self {\n Self { inner: fields[0] }\n }\n}\n\nimpl ContractClassId {\n pub fn compute(\n artifact_hash: Field,\n private_functions_root: Field,\n public_bytecode_commitment: Field\n ) -> Self {\n let hash = std::hash::pedersen_hash_with_separator(\n [\n artifact_hash,\n private_functions_root,\n public_bytecode_commitment\n ],\n GENERATOR_INDEX__CONTRACT_LEAF\n ); // TODO(@spalladino): Update generator index\n\n ContractClassId::from_field(hash)\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n}\n"},"247":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/state_reference.nr","source":"use crate::{\n abis::append_only_tree_snapshot::{AppendOnlyTreeSnapshot, APPEND_ONLY_TREE_SNAPSHOT_LENGTH},\n constants::{PARTIAL_STATE_REFERENCE_LENGTH, STATE_REFERENCE_LENGTH},\n partial_state_reference::PartialStateReference, traits::{Deserialize, Empty, Hash, Serialize},\n utils::arr_copy_slice\n};\n\nstruct StateReference {\n l1_to_l2_message_tree: AppendOnlyTreeSnapshot,\n partial: PartialStateReference,\n}\n\nimpl Eq for StateReference {\n fn eq(self, other: StateReference) -> bool {\n self.l1_to_l2_message_tree.eq(other.l1_to_l2_message_tree) &\n self.partial.eq(other.partial)\n }\n}\n\nimpl Serialize<STATE_REFERENCE_LENGTH> for StateReference {\n fn serialize(self) -> [Field; STATE_REFERENCE_LENGTH] {\n let mut fields: BoundedVec<Field, STATE_REFERENCE_LENGTH> = BoundedVec::new();\n\n fields.extend_from_array(self.l1_to_l2_message_tree.serialize());\n fields.extend_from_array(self.partial.serialize());\n\n fields.storage\n }\n}\n\nimpl Deserialize<STATE_REFERENCE_LENGTH> for StateReference {\n fn deserialize(serialized: [Field; STATE_REFERENCE_LENGTH]) -> StateReference {\n let mut offset = 0;\n\n let l1_to_l2_message_tree_fields = arr_copy_slice(serialized, [0; APPEND_ONLY_TREE_SNAPSHOT_LENGTH], offset);\n offset = offset + APPEND_ONLY_TREE_SNAPSHOT_LENGTH;\n\n let partial_fields = arr_copy_slice(serialized, [0; PARTIAL_STATE_REFERENCE_LENGTH], offset);\n\n StateReference {\n l1_to_l2_message_tree: AppendOnlyTreeSnapshot::deserialize(l1_to_l2_message_tree_fields),\n partial: PartialStateReference::deserialize(partial_fields),\n }\n }\n}\n\nimpl Empty for StateReference {\n fn empty() -> Self {\n Self {\n l1_to_l2_message_tree: AppendOnlyTreeSnapshot::zero(),\n partial: PartialStateReference::empty(),\n }\n }\n}\n\n#[test]\nfn serialization_of_empty() {\n let state = StateReference::empty();\n let _serialized = state.serialize();\n let _deserialized = StateReference::deserialize(_serialized);\n}\n"},"261":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/utils/reader.nr","source":"struct Reader<N> {\n data: [Field; N],\n offset: u32,\n}\n\nimpl<N> Reader<N> {\n pub fn new(data: [Field; N]) -> Self {\n Self { data, offset: 0 }\n }\n\n pub fn read(&mut self) -> Field {\n let result = self.data[self.offset];\n self.offset += 1;\n result\n }\n\n pub fn read_u32(&mut self) -> u32 {\n self.read() as u32\n }\n\n pub fn read_bool(&mut self) -> bool {\n self.read() as bool\n }\n\n pub fn read_array<K>(&mut self, mut result: [Field; K]) -> [Field; K] {\n for i in 0..K {\n result[i] = self.data[self.offset + i];\n }\n self.offset += K;\n result\n }\n\n // TODO(#4394)\n pub fn read_struct<T, K>(&mut self, deserialise: fn([Field; K]) -> T) -> T {\n let result = deserialise(self.read_array([0; K]));\n result\n }\n\n pub fn read_struct_array<T, K, C>(&mut self, deserialise: fn([Field; K]) -> T, mut result: [T; C]) -> [T; C] {\n for i in 0..C {\n result[i] = self.read_struct(deserialise);\n }\n result\n }\n\n pub fn finish(self) {\n assert(self.offset == self.data.len(), \"Reader did not read all data\");\n }\n}\n"},"271":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/utils/field.nr","source":"pub fn field_from_bytes<N>(bytes: [u8; N], big_endian: bool) -> Field {\n assert(bytes.len() < 32, \"field_from_bytes: N must be less than 32\");\n let mut as_field = 0;\n let mut offset = 1;\n for i in 0..N {\n let mut index = i;\n if big_endian {\n index = N - i - 1;\n }\n as_field += (bytes[index] as Field) * offset;\n offset *= 256;\n }\n\n as_field\n}\n\n// Convert a 32 byte array to a field element by truncating the final byte\npub fn field_from_bytes_32_trunc(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..15 {\n // covers bytes 16..30 (31 is truncated and ignored)\n low = low + (bytes32[15 + 15 - i] as Field) * v;\n v = v * 256;\n // covers bytes 0..14\n high = high + (bytes32[14 - i] as Field) * v;\n }\n // covers byte 15\n low = low + (bytes32[15] as Field) * v;\n\n low + high * v\n}\n\n// TODO to radix returns u8, so we cannot use bigger radixes. It'd be ideal to use a radix of the maximum range-constrained integer noir supports\npub fn full_field_less_than(lhs: Field, rhs: Field) -> bool {\n lhs.lt(rhs)\n}\n\npub fn full_field_greater_than(lhs: Field, rhs: Field) -> bool {\n rhs.lt(lhs)\n}\n\n#[test]\nunconstrained fn bytes_field_test() {\n // Tests correctness of field_from_bytes_32_trunc against existing methods\n // Bytes representing 0x543e0a6642ffeb8039296861765a53407bba62bd1c97ca43374de950bbe0a7\n let inputs = [\n 84, 62, 10, 102, 66, 255, 235, 128, 57, 41, 104, 97, 118, 90, 83, 64, 123, 186, 98, 189, 28, 151, 202, 67, 55, 77, 233, 80, 187, 224, 167\n ];\n let field = field_from_bytes(inputs, true);\n let return_bytes = field.to_be_bytes(31);\n for i in 0..31 {\n assert_eq(inputs[i], return_bytes[i]);\n }\n // 32 bytes - we remove the final byte, and check it matches the field\n let inputs2 = [\n 84, 62, 10, 102, 66, 255, 235, 128, 57, 41, 104, 97, 118, 90, 83, 64, 123, 186, 98, 189, 28, 151, 202, 67, 55, 77, 233, 80, 187, 224, 167, 158\n ];\n let field2 = field_from_bytes_32_trunc(inputs2);\n let return_bytes2 = field.to_be_bytes(31);\n\n for i in 0..31 {\n assert_eq(return_bytes2[i], return_bytes[i]);\n }\n assert_eq(field2, field);\n}\n"},"273":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/utils/mod.nr","source":"// general util packages/modules are usually bad practice\n// because there is no criteria for what we should not put in here.\n// Reducing the size of this package would be welcome.\n\nmod arrays;\nmod field;\nmod reader;\nmod uint256;\n\n// if predicate == true then return lhs, else return rhs\npub fn conditional_assign(predicate: bool, lhs: Field, rhs: Field) -> Field {\n if predicate { lhs } else { rhs }\n}\n\npub fn arr_copy_slice<T, N, M>(src: [T; N], mut dst: [T; M], offset: u32) -> [T; M] {\n let iterator_len = if N > M { M } else { N };\n for i in 0..iterator_len {\n dst[i] = src[i + offset];\n }\n dst\n}\n"},"286":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/address/eth_address.nr","source":"use crate::{\n constants::ETH_ADDRESS_LENGTH, hash::pedersen_hash,\n traits::{Empty, ToField, Serialize, Deserialize}, utils\n};\n\nstruct EthAddress{\n inner : Field\n}\n\nimpl Eq for EthAddress {\n fn eq(self, other : Self) -> bool {\n self.to_field() == other.to_field()\n }\n}\n\nimpl Empty for EthAddress {\n fn empty() -> Self {\n Self {\n inner : 0\n }\n }\n}\n\nimpl ToField for EthAddress {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl Serialize<ETH_ADDRESS_LENGTH> for EthAddress {\n fn serialize(self: Self) -> [Field; ETH_ADDRESS_LENGTH] {\n [self.inner]\n }\n}\n\nimpl Deserialize<ETH_ADDRESS_LENGTH> for EthAddress {\n fn deserialize(fields: [Field; ETH_ADDRESS_LENGTH]) -> Self {\n EthAddress::from_field(fields[0])\n }\n}\n\nimpl EthAddress {\n pub fn zero() -> Self {\n Self { inner: 0 }\n }\n\n pub fn from_field(field: Field) -> Self {\n field.assert_max_bit_size(160);\n Self { inner: field }\n }\n\n pub fn is_zero(self) -> bool {\n self.inner == 0\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n\n pub fn conditional_assign(predicate: bool, lhs: Self, rhs: Self) -> Self {\n let result = utils::conditional_assign(predicate, rhs.to_field(), lhs.to_field());\n Self { inner: result }\n }\n}\n"},"287":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/address/aztec_address.nr","source":"use crate::{\n crate::address::{eth_address::EthAddress, partial_address::PartialAddress, public_keys_hash::PublicKeysHash},\n constants::{AZTEC_ADDRESS_LENGTH, GENERATOR_INDEX__CONTRACT_ADDRESS_V1},\n contract_class_id::ContractClassId, hash::poseidon2_hash, grumpkin_point::GrumpkinPoint,\n traits::{Empty, FromField, ToField, Serialize, Deserialize}, utils\n};\n\n// Aztec address\nstruct AztecAddress {\n inner : Field\n}\n\nimpl Eq for AztecAddress {\n fn eq(self, other : Self) -> bool {\n self.to_field() == other.to_field()\n }\n}\n\nimpl Empty for AztecAddress {\n fn empty() -> Self {\n Self {\n inner : 0\n }\n }\n}\n\nimpl ToField for AztecAddress {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl FromField for AztecAddress {\n fn from_field(value: Field) -> AztecAddress {\n AztecAddress { inner: value }\n }\n}\n\nimpl Serialize<AZTEC_ADDRESS_LENGTH> for AztecAddress {\n fn serialize(self: Self) -> [Field; AZTEC_ADDRESS_LENGTH] {\n [self.to_field()]\n }\n}\n\nimpl Deserialize<AZTEC_ADDRESS_LENGTH> for AztecAddress {\n fn deserialize(fields: [Field; AZTEC_ADDRESS_LENGTH]) -> Self {\n FromField::from_field(fields[0])\n }\n}\n\nimpl AztecAddress {\n pub fn zero() -> Self {\n Self { inner: 0 }\n }\n\n pub fn compute(pub_keys_hash: PublicKeysHash, partial_address: PartialAddress) -> AztecAddress {\n AztecAddress::from_field(\n poseidon2_hash([pub_keys_hash.to_field(), partial_address.to_field(), GENERATOR_INDEX__CONTRACT_ADDRESS_V1])\n )\n }\n\n pub fn is_zero(self) -> bool {\n self.inner == 0\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n\n pub fn conditional_assign(predicate: bool, lhs: Self, rhs: Self) -> Self {\n let result = utils::conditional_assign(predicate, rhs.to_field(), lhs.to_field());\n Self { inner: result }\n }\n}\n\n#[test]\nfn compute_address_from_partial_and_pub_keys_hash() {\n let pub_keys_hash = PublicKeysHash::from_field(1);\n let partial_address = PartialAddress::from_field(2);\n\n let address = AztecAddress::compute(pub_keys_hash, partial_address);\n let expected_computed_address_from_partial_and_pubkey = 0x1b6ead051e7b42665064ca6cf1ec77da0a36d86e00d1ff6e44077966c0c3a9fa;\n assert(address.to_field() == expected_computed_address_from_partial_and_pubkey);\n}\n\n#[test]\nfn from_field_to_field() {\n let address = AztecAddress { inner: 37 };\n assert_eq(FromField::from_field(address.to_field()), address);\n}\n\n#[test]\nfn serde() {\n let address = AztecAddress { inner: 37 };\n assert_eq(Deserialize::deserialize(address.serialize()), address);\n}\n"},"289":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/address/partial_address.nr","source":"use crate::{\n address::{\n eth_address::EthAddress, salted_initialization_hash::SaltedInitializationHash,\n aztec_address::AztecAddress\n},\n constants::GENERATOR_INDEX__PARTIAL_ADDRESS, contract_class_id::ContractClassId,\n hash::pedersen_hash, traits::{ToField, FromField, Serialize, Deserialize}\n};\n\nglobal PARTIAL_ADDRESS_LENGTH = 1;\n\n// Partial address\nstruct PartialAddress {\n inner : Field\n}\n\nimpl ToField for PartialAddress {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl Serialize<PARTIAL_ADDRESS_LENGTH> for PartialAddress {\n fn serialize(self: Self) -> [Field; PARTIAL_ADDRESS_LENGTH] {\n [self.to_field()]\n }\n}\n\nimpl Deserialize<PARTIAL_ADDRESS_LENGTH> for PartialAddress {\n fn deserialize(fields: [Field; PARTIAL_ADDRESS_LENGTH]) -> Self {\n PartialAddress { inner: fields[0] }\n }\n}\n\nimpl PartialAddress {\n pub fn from_field(field: Field) -> Self {\n Self { inner: field }\n }\n\n pub fn compute(\n contract_class_id: ContractClassId,\n salt: Field,\n initialization_hash: Field,\n deployer: AztecAddress\n ) -> Self {\n PartialAddress::compute_from_salted_initialization_hash(\n contract_class_id,\n SaltedInitializationHash::compute(salt, initialization_hash, deployer)\n )\n }\n\n pub fn compute_from_salted_initialization_hash(\n contract_class_id: ContractClassId,\n salted_initialization_hash: SaltedInitializationHash\n ) -> Self {\n PartialAddress::from_field(\n pedersen_hash(\n [\n contract_class_id.to_field(),\n salted_initialization_hash.to_field()\n ],\n GENERATOR_INDEX__PARTIAL_ADDRESS\n )\n )\n }\n\n pub fn to_field(self) -> Field {\n self.inner\n }\n\n pub fn is_zero(self) -> bool {\n self.to_field() == 0\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n}\n"},"29":{"path":"std/hash/poseidon2.nr","source":"use crate::hash::Hasher;\nuse crate::default::Default;\n\nglobal RATE: u32 = 3;\n\nstruct Poseidon2 {\n cache: [Field;3],\n state: [Field;4],\n cache_size: u32,\n squeeze_mode: bool, // 0 => absorb, 1 => squeeze\n}\n\nimpl Poseidon2 {\n pub fn hash<let N: u32>(input: [Field; N], message_size: u32) -> Field {\n if message_size == N {\n Poseidon2::hash_internal(input, N, false)\n } else {\n Poseidon2::hash_internal(input, message_size, true)\n }\n }\n\n fn new(iv: Field) -> Poseidon2 {\n let mut result = Poseidon2 { cache: [0; 3], state: [0; 4], cache_size: 0, squeeze_mode: false };\n result.state[RATE] = iv;\n result\n }\n\n fn perform_duplex(&mut self) -> [Field; RATE] {\n // zero-pad the cache\n for i in 0..RATE {\n if i >= self.cache_size {\n self.cache[i] = 0;\n }\n }\n // add the cache into sponge state\n for i in 0..RATE {\n self.state[i] += self.cache[i];\n }\n self.state = crate::hash::poseidon2_permutation(self.state, 4);\n // return `RATE` number of field elements from the sponge state.\n let mut result = [0; RATE];\n for i in 0..RATE {\n result[i] = self.state[i];\n }\n result\n }\n\n fn absorb(&mut self, input: Field) {\n if (!self.squeeze_mode) & (self.cache_size == RATE) {\n // If we're absorbing, and the cache is full, apply the sponge permutation to compress the cache\n let _ = self.perform_duplex();\n self.cache[0] = input;\n self.cache_size = 1;\n } else if (!self.squeeze_mode) & (self.cache_size != RATE) {\n // If we're absorbing, and the cache is not full, add the input into the cache\n self.cache[self.cache_size] = input;\n self.cache_size += 1;\n } else if self.squeeze_mode {\n // If we're in squeeze mode, switch to absorb mode and add the input into the cache.\n // N.B. I don't think this code path can be reached?!\n self.cache[0] = input;\n self.cache_size = 1;\n self.squeeze_mode = false;\n }\n }\n\n fn squeeze(&mut self) -> Field {\n if self.squeeze_mode & (self.cache_size == 0) {\n // If we're in squeze mode and the cache is empty, there is nothing left to squeeze out of the sponge!\n // Switch to absorb mode.\n self.squeeze_mode = false;\n self.cache_size = 0;\n }\n if !self.squeeze_mode {\n // If we're in absorb mode, apply sponge permutation to compress the cache, populate cache with compressed\n // state and switch to squeeze mode. Note: this code block will execute if the previous `if` condition was\n // matched\n let new_output_elements = self.perform_duplex();\n self.squeeze_mode = true;\n for i in 0..RATE {\n self.cache[i] = new_output_elements[i];\n }\n self.cache_size = RATE;\n }\n // By this point, we should have a non-empty cache. Pop one item off the top of the cache and return it.\n let result = self.cache[0];\n for i in 1..RATE {\n if i < self.cache_size {\n self.cache[i - 1] = self.cache[i];\n }\n }\n self.cache_size -= 1;\n self.cache[self.cache_size] = 0;\n result\n }\n\n fn hash_internal<let N: u32>(input: [Field; N], in_len: u32, is_variable_length: bool) -> Field {\n let two_pow_64 = 18446744073709551616;\n let iv : Field = (in_len as Field) * two_pow_64;\n let mut sponge = Poseidon2::new(iv);\n for i in 0..input.len() {\n if i < in_len {\n sponge.absorb(input[i]);\n }\n }\n\n // In the case where the hash preimage is variable-length, we append `1` to the end of the input, to distinguish\n // from fixed-length hashes. (the combination of this additional field element + the hash IV ensures\n // fixed-length and variable-length hashes do not collide)\n if is_variable_length {\n sponge.absorb(1);\n }\n sponge.squeeze()\n }\n}\n\nstruct Poseidon2Hasher{\n _state: [Field],\n}\n\nimpl Hasher for Poseidon2Hasher {\n fn finish(self) -> Field {\n let iv : Field = (self._state.len() as Field)*18446744073709551616; // iv = (self._state.len() << 64)\n let mut sponge = Poseidon2::new(iv);\n for i in 0..self._state.len() {\n sponge.absorb(self._state[i]);\n }\n sponge.squeeze()\n }\n\n fn write(&mut self, input: Field){\n self._state = self._state.push_back(input);\n }\n}\n\nimpl Default for Poseidon2Hasher {\n fn default() -> Self {\n Poseidon2Hasher {\n _state: &[],\n }\n }\n}\n"},"290":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/address/salted_initialization_hash.nr","source":"use crate::{\n address::{eth_address::EthAddress, aztec_address::AztecAddress},\n constants::GENERATOR_INDEX__PARTIAL_ADDRESS, hash::pedersen_hash, traits::ToField\n};\n\n// Salted initialization hash. Used in the computation of a partial address.\nstruct SaltedInitializationHash {\n inner: Field\n}\n\nimpl ToField for SaltedInitializationHash {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl SaltedInitializationHash {\n pub fn from_field(field: Field) -> Self {\n Self { inner: field }\n }\n\n pub fn compute(salt: Field, initialization_hash: Field, deployer: AztecAddress) -> Self {\n SaltedInitializationHash::from_field(\n pedersen_hash(\n [\n salt,\n initialization_hash,\n deployer.to_field()\n ],\n GENERATOR_INDEX__PARTIAL_ADDRESS\n )\n )\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n}\n"},"291":{"path":"/usr/src/noir-projects/noir-contracts/contracts/gas_token_contract/src/main.nr","source":"mod lib;\n\ncontract GasToken {\n use dep::aztec::{\n protocol_types::{\n contract_class_id::ContractClassId, abis::function_selector::FunctionSelector,\n address::{AztecAddress, EthAddress},\n constants::{DEPLOYER_CONTRACT_ADDRESS, REGISTERER_CONTRACT_ADDRESS}\n },\n state_vars::{SharedImmutable, PublicMutable, Map},\n oracle::get_contract_instance::get_contract_instance, deploy::deploy_contract\n };\n\n use dep::deployer::ContractInstanceDeployer;\n use dep::registerer::ContractClassRegisterer;\n\n use crate::lib::{calculate_fee, get_bridge_gas_msg_hash};\n\n #[aztec(storage)]\n struct Storage {\n // This map is accessed directly by protocol circuits to check balances for fee payment.\n // Do not change this storage layout unless you also update the base rollup circuits.\n balances: Map<AztecAddress, PublicMutable<U128>>,\n portal_address: SharedImmutable<EthAddress>,\n }\n\n // Not flagged as initializer to reduce cost of checking init nullifier in all functions.\n // This function should be called as entrypoint to initialize the contract by minting itself funds.\n #[aztec(private)]\n fn deploy(\n artifact_hash: Field,\n private_functions_root: Field,\n public_bytecode_commitment: Field,\n portal_address: EthAddress\n ) {\n // Validate contract class parameters are correct\n let self = context.this_address();\n let instance = get_contract_instance(self);\n let contract_class_id = ContractClassId::compute(\n artifact_hash,\n private_functions_root,\n public_bytecode_commitment\n );\n assert(\n instance.contract_class_id == contract_class_id, \"Invalid contract class id computed for gas token\"\n );\n\n // Increase self balance and set as fee payer, and end setup\n let deploy_fees = 20000000000;\n GasToken::at(self)._increase_public_balance(self, deploy_fees).enqueue(&mut context);\n context.set_as_fee_payer();\n context.end_setup();\n\n // Register class and publicly deploy contract\n let _register = ContractClassRegisterer::at(AztecAddress::from_field(REGISTERER_CONTRACT_ADDRESS)).register(\n artifact_hash,\n private_functions_root,\n public_bytecode_commitment\n ).call(&mut context);\n let _deploy = ContractInstanceDeployer::at(AztecAddress::from_field(DEPLOYER_CONTRACT_ADDRESS)).deploy(\n instance.salt,\n instance.contract_class_id,\n instance.initialization_hash,\n instance.public_keys_hash,\n true\n ).call(&mut context);\n\n // Enqueue call to set the portal address\n GasToken::at(self).set_portal(portal_address).enqueue(&mut context);\n }\n\n // We purposefully not set this function as an initializer so we do not bind\n // the contract to a specific L1 portal address, since the gas token address\n // is a hardcoded constant in the rollup circuits.\n #[aztec(public)]\n fn set_portal(portal_address: EthAddress) {\n assert(storage.portal_address.read_public().is_zero());\n storage.portal_address.initialize(portal_address);\n }\n\n #[aztec(private)]\n fn claim(to: AztecAddress, amount: Field, secret: Field) {\n let content_hash = get_bridge_gas_msg_hash(to, amount);\n let portal_address = storage.portal_address.read_private();\n assert(!portal_address.is_zero());\n\n // Consume message and emit nullifier\n context.consume_l1_to_l2_message(content_hash, secret, portal_address);\n\n // TODO(palla/gas) Emit an unencrypted log to announce which L1 to L2 message has been claimed\n // Otherwise, we cannot trace L1 deposits to their corresponding claims on L2\n\n GasToken::at(context.this_address())._increase_public_balance(to, amount).enqueue(&mut context);\n }\n\n #[aztec(public)]\n #[aztec(internal)]\n fn _increase_public_balance(to: AztecAddress, amount: Field) {\n let new_balance = storage.balances.at(to).read().add(U128::from_integer(amount));\n storage.balances.at(to).write(new_balance);\n }\n\n // TODO(palla/gas) Remove this function and use the private claim flow only\n #[aztec(public)]\n fn claim_public(to: AztecAddress, amount: Field, secret: Field, leaf_index: Field) {\n let content_hash = get_bridge_gas_msg_hash(to, amount);\n let portal_address = storage.portal_address.read_public();\n assert(!portal_address.is_zero());\n\n // Consume message and emit nullifier\n context.consume_l1_to_l2_message(content_hash, secret, portal_address, leaf_index);\n\n let new_balance = storage.balances.at(to).read() + U128::from_integer(amount);\n storage.balances.at(to).write(new_balance);\n }\n\n // TODO(@just-mitch): remove this function before mainnet deployment\n // convenience function for testing\n // the true canonical gas token contract will not have this function\n #[aztec(public)]\n fn mint_public(to: AztecAddress, amount: Field) {\n let amount = U128::from_integer(amount);\n let new_balance = storage.balances.at(to).read().add(amount);\n\n storage.balances.at(to).write(new_balance);\n }\n\n #[aztec(public)]\n #[aztec(view)]\n fn check_balance(fee_limit: Field) {\n let fee_limit = U128::from_integer(fee_limit);\n assert(storage.balances.at(context.msg_sender()).read() >= fee_limit, \"Balance too low\");\n }\n\n // utility function for testing\n #[aztec(public)]\n #[aztec(view)]\n fn balance_of_public(owner: AztecAddress) -> pub Field {\n storage.balances.at(owner).read().to_field()\n }\n}\n"},"292":{"path":"/usr/src/noir-projects/noir-contracts/contracts/gas_token_contract/src/lib.nr","source":"use dep::aztec::prelude::{AztecAddress, EthAddress};\nuse dep::aztec::context::PublicContext;\nuse dep::aztec::protocol_types::hash::sha256_to_field;\n\npub fn calculate_fee<TPublicContext>(context: PublicContext) -> Field {\n context.transaction_fee()\n}\n\npub fn get_bridge_gas_msg_hash(owner: AztecAddress, amount: Field) -> Field {\n let mut hash_bytes = [0; 68];\n let recipient_bytes = owner.to_field().to_be_bytes(32);\n let amount_bytes = amount.to_be_bytes(32);\n\n for i in 0..32 {\n hash_bytes[i + 4] = recipient_bytes[i];\n hash_bytes[i + 36] = amount_bytes[i];\n }\n\n // Function selector: 0x3e87b9be keccak256('mint_public(bytes32,uint256)')\n hash_bytes[0] = 0x3e;\n hash_bytes[1] = 0x87;\n hash_bytes[2] = 0xb9;\n hash_bytes[3] = 0xbe;\n\n let content_hash = sha256_to_field(hash_bytes);\n content_hash\n}\n"},"293":{"path":"/usr/src/noir-projects/noir-contracts/contracts/contract_instance_deployer_contract/src/main.nr","source":"contract ContractInstanceDeployer {\n use dep::aztec::protocol_types::{\n address::{AztecAddress, EthAddress, PublicKeysHash, PartialAddress},\n contract_class_id::ContractClassId, constants::DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_MAGIC_VALUE,\n traits::Serialize, abis::log_hash::LogHash\n };\n use dep::aztec::{\n context::PrivateContext, hash::compute_unencrypted_log_hash,\n oracle::logs::emit_unencrypted_log_private_internal\n };\n\n #[aztec(event)]\n struct ContractInstanceDeployed {\n DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_MAGIC_VALUE: Field,\n address: AztecAddress,\n version: u8,\n salt: Field, \n contract_class_id: ContractClassId, \n initialization_hash: Field, \n public_keys_hash: PublicKeysHash, \n deployer: AztecAddress,\n }\n\n #[aztec(private)]\n fn deploy(\n salt: Field,\n contract_class_id: ContractClassId,\n initialization_hash: Field,\n public_keys_hash: PublicKeysHash,\n universal_deploy: bool\n ) {\n // TODO(@spalladino): assert nullifier_exists silo(contract_class_id, ContractClassRegisterer)\n\n let deployer = if universal_deploy {\n AztecAddress::zero()\n } else {\n context.msg_sender()\n };\n\n let partial_address = PartialAddress::compute(contract_class_id, salt, initialization_hash, deployer);\n\n let address = AztecAddress::compute(public_keys_hash, partial_address);\n\n // Emit the address as a nullifier to be able to prove that this instance has been (not) deployed\n context.push_nullifier(address.to_field(), 0);\n\n // Broadcast the event\n let event = ContractInstanceDeployed {\n DEPLOYER_CONTRACT_INSTANCE_DEPLOYED_MAGIC_VALUE,\n contract_class_id,\n address,\n public_keys_hash,\n initialization_hash,\n salt,\n deployer,\n version: 1\n };\n\n let payload = event.serialize();\n dep::aztec::oracle::debug_log::debug_log_format(\"ContractInstanceDeployed: {}\", payload);\n\n let contract_address = context.this_address();\n let counter = context.next_counter();\n\n // @todo This is very inefficient, we are doing a lot of back and forth conversions.\n let log_slice = payload.to_be_bytes_arr();\n let log_hash = compute_unencrypted_log_hash(contract_address, payload);\n // 40 = addr (32) + raw log len (4) + processed log len (4)\n let len = 40 + log_slice.len().to_field();\n let side_effect = LogHash { value: log_hash, counter, length: len };\n context.unencrypted_logs_hashes.push(side_effect);\n\n let _void = emit_unencrypted_log_private_internal(contract_address, payload, counter);\n }\n}\n"},"298":{"path":"/usr/src/noir-projects/noir-contracts/contracts/contract_class_registerer_contract/src/main.nr","source":"mod events;\nmod capsule;\n\ncontract ContractClassRegisterer {\n use dep::aztec::prelude::{AztecAddress, EthAddress, FunctionSelector};\n use dep::aztec::protocol_types::{\n contract_class_id::ContractClassId,\n constants::{\n ARTIFACT_FUNCTION_TREE_MAX_HEIGHT, FUNCTION_TREE_HEIGHT,\n MAX_PACKED_BYTECODE_SIZE_PER_PRIVATE_FUNCTION_IN_FIELDS,\n MAX_PACKED_BYTECODE_SIZE_PER_UNCONSTRAINED_FUNCTION_IN_FIELDS,\n MAX_PACKED_PUBLIC_BYTECODE_SIZE_IN_FIELDS, REGISTERER_CONTRACT_CLASS_REGISTERED_MAGIC_VALUE\n },\n traits::Serialize, abis::log_hash::LogHash\n };\n\n use dep::aztec::{context::PrivateContext, oracle::logs::emit_contract_class_unencrypted_log_private_internal};\n\n use crate::events::{\n class_registered::ContractClassRegistered,\n private_function_broadcasted::{ClassPrivateFunctionBroadcasted, PrivateFunction, InnerPrivateFunction},\n unconstrained_function_broadcasted::{ClassUnconstrainedFunctionBroadcasted, UnconstrainedFunction, InnerUnconstrainedFunction}\n };\n\n // docs:start:import_pop_capsule\n use crate::capsule::pop_capsule;\n // docs:end:import_pop_capsule\n\n #[aztec(private)]\n fn register(artifact_hash: Field, private_functions_root: Field, public_bytecode_commitment: Field) {\n // TODO: Validate public_bytecode_commitment is the correct commitment of packed_public_bytecode\n // TODO: Validate packed_public_bytecode is legit public bytecode\n\n // docs:start:pop_capsule\n let packed_public_bytecode: [Field; MAX_PACKED_PUBLIC_BYTECODE_SIZE_IN_FIELDS] = pop_capsule();\n // docs:end:pop_capsule\n\n // Compute contract class id from preimage\n let contract_class_id = ContractClassId::compute(\n artifact_hash,\n private_functions_root,\n public_bytecode_commitment\n );\n\n // Emit the contract class id as a nullifier to be able to prove that this class has been (not) registered\n let event = ContractClassRegistered { contract_class_id, version: 1, artifact_hash, private_functions_root, packed_public_bytecode };\n context.push_nullifier(contract_class_id.to_field(), 0);\n\n // Broadcast class info including public bytecode\n dep::aztec::oracle::debug_log::debug_log_format(\n \"ContractClassRegistered: {}\",\n [\n contract_class_id.to_field(),\n artifact_hash,\n private_functions_root,\n public_bytecode_commitment\n ]\n );\n emit_contract_class_unencrypted_log(&mut context, event.serialize());\n }\n\n #[aztec(private)]\n fn broadcast_private_function(\n contract_class_id: ContractClassId,\n artifact_metadata_hash: Field,\n unconstrained_functions_artifact_tree_root: Field,\n private_function_tree_sibling_path: [Field; FUNCTION_TREE_HEIGHT],\n private_function_tree_leaf_index: Field,\n artifact_function_tree_sibling_path: [Field; ARTIFACT_FUNCTION_TREE_MAX_HEIGHT],\n artifact_function_tree_leaf_index: Field,\n function_data: InnerPrivateFunction\n ) {\n let private_bytecode: [Field; MAX_PACKED_BYTECODE_SIZE_PER_PRIVATE_FUNCTION_IN_FIELDS] = pop_capsule();\n\n let event = ClassPrivateFunctionBroadcasted {\n contract_class_id,\n artifact_metadata_hash,\n unconstrained_functions_artifact_tree_root,\n private_function_tree_sibling_path,\n private_function_tree_leaf_index,\n artifact_function_tree_sibling_path,\n artifact_function_tree_leaf_index,\n function: PrivateFunction {\n selector: function_data.selector,\n metadata_hash: function_data.metadata_hash,\n vk_hash: function_data.vk_hash,\n bytecode: private_bytecode\n }\n };\n dep::aztec::oracle::debug_log::debug_log_format(\n \"ClassPrivateFunctionBroadcasted: {}\",\n [\n contract_class_id.to_field(),\n artifact_metadata_hash,\n unconstrained_functions_artifact_tree_root,\n function_data.selector.to_field(),\n function_data.vk_hash,\n function_data.metadata_hash\n ]\n );\n emit_contract_class_unencrypted_log(&mut context, event.serialize());\n }\n\n #[aztec(private)]\n fn broadcast_unconstrained_function(\n contract_class_id: ContractClassId,\n artifact_metadata_hash: Field,\n private_functions_artifact_tree_root: Field,\n artifact_function_tree_sibling_path: [Field; ARTIFACT_FUNCTION_TREE_MAX_HEIGHT],\n artifact_function_tree_leaf_index: Field,\n function_data: InnerUnconstrainedFunction\n ) {\n let unconstrained_bytecode: [Field; MAX_PACKED_BYTECODE_SIZE_PER_UNCONSTRAINED_FUNCTION_IN_FIELDS] = pop_capsule();\n let event = ClassUnconstrainedFunctionBroadcasted {\n contract_class_id,\n artifact_metadata_hash,\n private_functions_artifact_tree_root,\n artifact_function_tree_sibling_path,\n artifact_function_tree_leaf_index,\n function: UnconstrainedFunction {\n selector: function_data.selector,\n metadata_hash: function_data.metadata_hash,\n bytecode: unconstrained_bytecode\n }\n };\n dep::aztec::oracle::debug_log::debug_log_format(\n \"ClassUnconstrainedFunctionBroadcasted: {}\",\n [\n contract_class_id.to_field(),\n artifact_metadata_hash,\n private_functions_artifact_tree_root,\n function_data.selector.to_field(),\n function_data.metadata_hash\n ]\n );\n emit_contract_class_unencrypted_log(&mut context, event.serialize());\n }\n\n // This fn exists separately from emit_unencrypted_log because sha hashing the preimage\n // is too large to compile (16,200 fields, 518,400 bytes) => the oracle hashes it\n // It is ONLY used with contract_class_registerer_contract since we already assert correctness:\n // - Contract class -> we will commit to the packed bytecode (currently a TODO)\n // - Private function -> we provide a membership proof\n // - Unconstrained function -> we provide a membership proof\n // Ordinary logs are not protected by the above so this fn shouldn't be called by anything else\n #[contract_library_method]\n pub fn emit_contract_class_unencrypted_log<N>(context: &mut PrivateContext, log: [Field; N]) {\n let contract_address = context.this_address();\n let counter = context.next_counter();\n let log_hash = emit_contract_class_unencrypted_log_private_internal(contract_address, log, counter);\n // 40 = addr (32) + raw log len (4) + processed log len (4)\n let len = 40 + N * 32;\n let side_effect = LogHash { value: log_hash, counter, length: len };\n context.unencrypted_logs_hashes.push(side_effect);\n }\n}\n"},"3":{"path":"std/cmp.nr","source":"// docs:start:eq-trait\ntrait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\nimpl Eq for Field { fn eq(self, other: Field) -> bool { self == other } }\n\nimpl Eq for u64 { fn eq(self, other: u64) -> bool { self == other } }\nimpl Eq for u32 { fn eq(self, other: u32) -> bool { self == other } }\nimpl Eq for u8 { fn eq(self, other: u8) -> bool { self == other } }\nimpl Eq for u1 { fn eq(self, other: u1) -> bool { self == other } }\n\nimpl Eq for i8 { fn eq(self, other: i8) -> bool { self == other } }\nimpl Eq for i32 { fn eq(self, other: i32) -> bool { self == other } }\nimpl Eq for i64 { fn eq(self, other: i64) -> bool { self == other } }\n\nimpl Eq for () { fn eq(_self: Self, _other: ()) -> bool { true } }\nimpl Eq for bool { fn eq(self, other: bool) -> bool { self == other } }\n\nimpl<T, let N: u32> Eq for [T; N] where T: Eq {\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0 .. self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl<T> Eq for [T] where T: Eq {\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0 .. self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl<let N: u32> Eq for str<N> {\n fn eq(self, other: str<N>) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl<A, B> Eq for (A, B) where A: Eq, B: Eq {\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl<A, B, C> Eq for (A, B, C) where A: Eq, B: Eq, C: Eq {\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl<A, B, C, D> Eq for (A, B, C, D) where A: Eq, B: Eq, C: Eq, D: Eq {\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl<A, B, C, D, E> Eq for (A, B, C, D, E) where A: Eq, B: Eq, C: Eq, D: Eq, E: Eq {\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3) & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\nstruct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n// docs:start:ord-trait\ntrait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else {\n if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n }\n}\n\nimpl<T, let N: u32> Ord for [T; N] where T: Ord {\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0 .. self.len() {\n if result == Ordering::equal() {\n let result_i = self[i].cmp(other[i]);\n\n if result_i == Ordering::less() {\n result = result_i;\n } else if result_i == Ordering::greater() {\n result = result_i;\n }\n }\n }\n result\n }\n}\n\nimpl<T> Ord for [T] where T: Ord {\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0 .. self.len() {\n if result == Ordering::equal() {\n let result_i = self[i].cmp(other[i]);\n\n if result_i == Ordering::less() {\n result = result_i;\n } else if result_i == Ordering::greater() {\n result = result_i;\n }\n }\n }\n result\n }\n}\n\nimpl<A, B> Ord for (A, B) where A: Ord, B: Ord {\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl<A, B, C> Ord for (A, B, C) where A: Ord, B: Ord, C: Ord {\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl<A, B, C, D> Ord for (A, B, C, D) where A: Ord, B: Ord, C: Ord, D: Ord {\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl<A, B, C, D, E> Ord for (A, B, C, D, E) where A: Ord, B: Ord, C: Ord, D: Ord, E: Ord {\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max<T>(v1: T, v2: T) -> T where T: Ord {\n if v1 > v2 { v1 } else { v2 }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min<T>(v1: T, v2: T) -> T where T: Ord {\n if v1 > v2 { v2 } else { v1 }\n}\n\nmod cmp_tests {\n use crate::cmp::{min, max};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n"},"31":{"path":"std/merkle.nr","source":"// Regular merkle tree means a append-only merkle tree (Explain why this is the only way to have privacy and alternatives if you don't want it)\n// Currently we assume that it is a binary tree, so depth k implies a width of 2^k\n// XXX: In the future we can add an arity parameter\n// Returns the merkle root of the tree from the provided leaf, its hashpath, using a pedersen hash function.\npub fn compute_merkle_root<let N: u32>(leaf: Field, index: Field, hash_path: [Field; N]) -> Field {\n let n = hash_path.len();\n let index_bits = index.to_le_bits(n as u32);\n let mut current = leaf;\n for i in 0..n {\n let path_bit = index_bits[i] as bool;\n let (hash_left, hash_right) = if path_bit {\n (hash_path[i], current)\n } else {\n (current, hash_path[i])\n };\n current = crate::hash::pedersen_hash([hash_left, hash_right]);\n }\n current\n}\n"},"46":{"path":"std/uint128.nr","source":"use crate::ops::{Add, Sub, Mul, Div, Rem, Not, BitOr, BitAnd, BitXor, Shl, Shr};\nuse crate::cmp::{Eq, Ord, Ordering};\nuse crate::println;\n\nglobal pow64 : Field = 18446744073709551616; //2^64;\nglobal pow63 : Field = 9223372036854775808; // 2^63;\nstruct U128 {\n lo: Field,\n hi: Field,\n}\n\nimpl U128 {\n\n pub fn from_u64s_le(lo: u64, hi: u64) -> U128 {\n // in order to handle multiplication, we need to represent the product of two u64 without overflow\n assert(crate::field::modulus_num_bits() as u32 > 128);\n U128 { lo: lo as Field, hi: hi as Field }\n }\n\n pub fn from_u64s_be(hi: u64, lo: u64) -> U128 {\n U128::from_u64s_le(lo, hi)\n }\n\n pub fn zero() -> U128 {\n U128 { lo: 0, hi: 0 }\n }\n\n pub fn one() -> U128 {\n U128 { lo: 1, hi: 0 }\n }\n pub fn from_le_bytes(bytes: [u8; 16]) -> U128 {\n let mut lo = 0;\n let mut base = 1;\n for i in 0..8 {\n lo += (bytes[i] as Field)*base;\n base *= 256;\n }\n let mut hi = 0;\n base = 1;\n for i in 8..16 {\n hi += (bytes[i] as Field)*base;\n base *= 256;\n }\n U128 { lo, hi }\n }\n\n pub fn to_be_bytes(self: Self) -> [u8; 16] {\n let lo = self.lo.to_be_bytes(8);\n let hi = self.hi.to_be_bytes(8);\n let mut bytes = [0; 16];\n for i in 0..8 {\n bytes[i] = hi[i];\n bytes[i+8] = lo[i];\n }\n bytes\n }\n\n pub fn to_le_bytes(self: Self) -> [u8; 16] {\n let lo = self.lo.to_le_bytes(8);\n let hi = self.hi.to_le_bytes(8);\n let mut bytes = [0; 16];\n for i in 0..8 {\n bytes[i] = lo[i];\n bytes[i+8] = hi[i];\n }\n bytes\n }\n\n pub fn from_hex<let N: u32>(hex: str<N>) -> U128 {\n let N = N as u32;\n let bytes = hex.as_bytes();\n // string must starts with \"0x\"\n assert((bytes[0] == 48) & (bytes[1] == 120), \"Invalid hexadecimal string\");\n assert(N < 35, \"Input does not fit into a U128\");\n\n let mut lo = 0;\n let mut hi = 0;\n let mut base = 1;\n if N <= 18 {\n for i in 0..N - 2 {\n lo += U128::decode_ascii(bytes[N-i-1])*base;\n base = base*16;\n }\n } else {\n for i in 0..16 {\n lo += U128::decode_ascii(bytes[N-i-1])*base;\n base = base*16;\n }\n base = 1;\n for i in 17..N - 1 {\n hi += U128::decode_ascii(bytes[N-i])*base;\n base = base*16;\n }\n }\n U128 { lo: lo as Field, hi: hi as Field }\n }\n\n unconstrained fn uconstrained_check_is_upper_ascii(ascii: u8) -> bool {\n ((ascii >= 65) & (ascii <= 90)) // Between 'A' and 'Z'\n }\n\n fn decode_ascii(ascii: u8) -> Field {\n if ascii < 58 {\n ascii - 48\n } else {\n let ascii = ascii + 32 * (U128::uconstrained_check_is_upper_ascii(ascii) as u8);\n assert(ascii >= 97); // enforce >= 'a'\n assert(ascii <= 102); // enforce <= 'f'\n ascii - 87\n } as Field\n }\n\n // TODO: Replace with a faster version. \n // A circuit that uses this function can be slow to compute\n // (we're doing up to 127 calls to compute the quotient)\n unconstrained fn unconstrained_div(self: Self, b: U128) -> (U128, U128) {\n if b == U128::zero() {\n // Return 0,0 to avoid eternal loop\n (U128::zero(), U128::zero())\n } else if self < b {\n (U128::zero(), self)\n } else if self == b {\n (U128::one(), U128::zero())\n } else {\n let (q,r) = if b.hi as u64 >= pow63 as u64 {\n // The result of multiplication by 2 would overflow\n (U128::zero(), self)\n } else {\n self.unconstrained_div(b * U128::from_u64s_le(2, 0))\n };\n let q_mul_2 = q * U128::from_u64s_le(2, 0);\n if r < b {\n (q_mul_2, r)\n } else {\n (q_mul_2 + U128::one(), r - b)\n }\n }\n }\n\n pub fn from_integer<T>(i: T) -> U128 {\n let f = crate::as_field(i);\n // Reject values which would overflow a u128\n f.assert_max_bit_size(128);\n let lo = f as u64 as Field;\n let hi = (f - lo) / pow64;\n U128 { lo, hi }\n }\n\n pub fn to_integer<T>(self) -> T {\n crate::from_field(self.lo + self.hi * pow64)\n }\n\n fn wrapping_mul(self: Self, b: U128) -> U128 {\n let low = self.lo * b.lo;\n let lo = low as u64 as Field;\n let carry = (low - lo) / pow64;\n let high = self.lo * b.hi + self.hi * b.lo + carry;\n let hi = high as u64 as Field;\n U128 { lo, hi }\n }\n}\n\nimpl Add for U128 {\n fn add(self: Self, b: U128) -> U128 {\n let low = self.lo + b.lo;\n let lo = low as u64 as Field;\n let carry = (low - lo) / pow64; \n let high = self.hi + b.hi + carry;\n let hi = high as u64 as Field;\n assert(hi == high, \"attempt to add with overflow\");\n U128 {\n lo,\n hi,\n }\n }\n}\n\nimpl Sub for U128 {\n fn sub(self: Self, b: U128) -> U128 {\n let low = pow64 + self.lo - b.lo;\n let lo = low as u64 as Field;\n let borrow = (low == lo) as Field;\n let high = self.hi - b.hi - borrow;\n let hi = high as u64 as Field;\n assert(hi == high, \"attempt to subtract with underflow\");\n U128 {\n lo,\n hi,\n }\n }\n}\n\nimpl Mul for U128 {\n fn mul(self: Self, b: U128) -> U128 {\n assert(self.hi*b.hi == 0, \"attempt to multiply with overflow\");\n let low = self.lo*b.lo;\n let lo = low as u64 as Field;\n let carry = (low - lo) / pow64;\n let high = if crate::field::modulus_num_bits() as u32 > 196 {\n (self.lo+self.hi)*(b.lo+b.hi) - low + carry\n } else {\n self.lo*b.hi + self.hi*b.lo + carry\n };\n let hi = high as u64 as Field;\n assert(hi == high, \"attempt to multiply with overflow\");\n U128 {\n lo,\n hi,\n }\n }\n}\n\nimpl Div for U128 {\n fn div(self: Self, b: U128) -> U128 {\n let (q,r) = self.unconstrained_div(b);\n let a = b * q + r;\n assert_eq(self, a);\n assert(r < b);\n q\n }\n}\n\nimpl Rem for U128 {\n fn rem(self: Self, b: U128) -> U128 {\n let (q,r) = self.unconstrained_div(b);\n let a = b * q + r;\n assert_eq(self, a);\n assert(r < b);\n r\n }\n}\n\nimpl Eq for U128 {\n fn eq(self: Self, b: U128) -> bool {\n (self.lo == b.lo) & (self.hi == b.hi)\n }\n}\n\nimpl Ord for U128 {\n fn cmp(self, other: Self) -> Ordering {\n let hi_ordering = (self.hi as u64).cmp((other.hi as u64));\n let lo_ordering = (self.lo as u64).cmp((other.lo as u64));\n \n if hi_ordering == Ordering::equal() {\n lo_ordering\n } else {\n hi_ordering\n }\n }\n}\n\nimpl Not for U128 { \n fn not(self) -> U128 {\n U128 {\n lo: (!(self.lo as u64)) as Field,\n hi: (!(self.hi as u64)) as Field\n }\n }\n}\n\nimpl BitOr for U128 { \n fn bitor(self, other: U128) -> U128 {\n U128 {\n lo: ((self.lo as u64) | (other.lo as u64)) as Field,\n hi: ((self.hi as u64) | (other.hi as u64)) as Field\n }\n }\n}\n\nimpl BitAnd for U128 {\n fn bitand(self, other: U128) -> U128 { \n U128 {\n lo: ((self.lo as u64) & (other.lo as u64)) as Field,\n hi: ((self.hi as u64) & (other.hi as u64)) as Field\n }\n }\n}\n\nimpl BitXor for U128 {\n fn bitxor(self, other: U128) -> U128 { \n U128 {\n lo: ((self.lo as u64) ^ (other.lo as u64)) as Field,\n hi: ((self.hi as u64) ^ (other.hi as u64)) as Field\n }\n }\n}\n\nimpl Shl for U128 { \n fn shl(self, other: u8) -> U128 { \n assert(other < 128, \"attempt to shift left with overflow\");\n let exp_bits = (other as Field).to_be_bits(7);\n\n let mut r: Field = 2;\n let mut y: Field = 1;\n for i in 1..8 {\n y = (exp_bits[7-i] as Field) * (r * y) + (1 - exp_bits[7-i] as Field) * y;\n r *= r;\n }\n self.wrapping_mul(U128::from_integer(y))\n } \n}\n\nimpl Shr for U128 { \n fn shr(self, other: u8) -> U128 { \n assert(other < 128, \"attempt to shift right with overflow\");\n let exp_bits = (other as Field).to_be_bits(7);\n\n let mut r: Field = 2;\n let mut y: Field = 1;\n for i in 1..8 {\n y = (exp_bits[7-i] as Field) * (r * y) + (1 - exp_bits[7-i] as Field) * y;\n r *= r;\n }\n self / U128::from_integer(y)\n } \n}\n\nmod tests {\n use crate::uint128::{U128, pow64, pow63};\n\n #[test]\n fn test_not(lo: u64, hi: u64) {\n let num = U128::from_u64s_le(lo, hi);\n let not_num = num.not();\n\n assert_eq(not_num.hi, (hi.not() as Field));\n assert_eq(not_num.lo, (lo.not() as Field));\n\n let not_not_num = not_num.not();\n assert_eq(num, not_not_num);\n }\n #[test]\n fn test_construction() {\n // Check little-endian u64 is inversed with big-endian u64 construction\n let a = U128::from_u64s_le(2, 1);\n let b = U128::from_u64s_be(1, 2);\n assert_eq(a, b);\n // Check byte construction is equivalent\n let c = U128::from_le_bytes([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]);\n let d = U128::from_u64s_le(0x0706050403020100, 0x0f0e0d0c0b0a0908);\n assert_eq(c, d);\n }\n #[test]\n fn test_byte_decomposition() {\n let a = U128::from_u64s_le(0x0706050403020100, 0x0f0e0d0c0b0a0908);\n // Get big-endian and little-endian byte decompostions\n let le_bytes_a= a.to_le_bytes();\n let be_bytes_a= a.to_be_bytes();\n\n // Check equivalence\n for i in 0..16 {\n assert_eq(le_bytes_a[i], be_bytes_a[15 - i]);\n }\n // Reconstruct U128 from byte decomposition\n let b= U128::from_le_bytes(le_bytes_a);\n // Check that it's the same element\n assert_eq(a, b);\n }\n #[test]\n fn test_hex_constuction() {\n let a = U128::from_u64s_le(0x1, 0x2);\n let b = U128::from_hex(\"0x20000000000000001\");\n assert_eq(a, b);\n\n let c= U128::from_hex(\"0xffffffffffffffffffffffffffffffff\");\n let d= U128::from_u64s_le(0xffffffffffffffff, 0xffffffffffffffff);\n assert_eq(c, d);\n\n let e= U128::from_hex(\"0x00000000000000000000000000000000\");\n let f= U128::from_u64s_le(0, 0);\n assert_eq(e, f);\n }\n\n // Ascii decode tests\n\n #[test]\n fn test_ascii_decode_correct_range() {\n // '0'..'9' range\n for i in 0..10 {\n let decoded= U128::decode_ascii(48 + i);\n assert_eq(decoded, i as Field);\n }\n // 'A'..'F' range\n for i in 0..6 {\n let decoded = U128::decode_ascii(65 + i);\n assert_eq(decoded, (i + 10) as Field);\n }\n // 'a'..'f' range\n for i in 0..6 {\n let decoded = U128::decode_ascii(97 + i);\n assert_eq(decoded, (i + 10) as Field);\n }\n }\n\n #[test(should_fail)]\n fn test_ascii_decode_range_less_than_48_fails_0() {\n crate::println(U128::decode_ascii(0));\n }\n #[test(should_fail)]\n fn test_ascii_decode_range_less_than_48_fails_1() {\n crate::println(U128::decode_ascii(47));\n }\n\n #[test(should_fail)]\n fn test_ascii_decode_range_58_64_fails_0() {\n let _ = U128::decode_ascii(58);\n }\n #[test(should_fail)]\n fn test_ascii_decode_range_58_64_fails_1() {\n let _ = U128::decode_ascii(64);\n }\n #[test(should_fail)]\n fn test_ascii_decode_range_71_96_fails_0() {\n let _ = U128::decode_ascii(71);\n }\n #[test(should_fail)]\n fn test_ascii_decode_range_71_96_fails_1() {\n let _ = U128::decode_ascii(96);\n }\n #[test(should_fail)]\n fn test_ascii_decode_range_greater_than_102_fails() {\n let _ = U128::decode_ascii(103);\n }\n\n #[test(should_fail)]\n fn test_ascii_decode_regression() {\n // This code will actually fail because of ascii_decode,\n // but in the past it was possible to create a value > (1<<128)\n let a = U128::from_hex(\"0x~fffffffffffffffffffffffffffffff\");\n let b:Field= a.to_integer();\n let c= b.to_le_bytes(17);\n assert(c[16] != 0);\n }\n\n #[test]\n fn test_unconstrained_div() {\n // Test the potential overflow case\n let a= U128::from_u64s_le(0x0, 0xffffffffffffffff);\n let b= U128::from_u64s_le(0x0, 0xfffffffffffffffe);\n let c= U128::one();\n let d= U128::from_u64s_le(0x0, 0x1);\n let (q,r) = a.unconstrained_div(b);\n assert_eq(q, c);\n assert_eq(r, d);\n\n let a = U128::from_u64s_le(2, 0);\n let b = U128::one();\n // Check the case where a is a multiple of b\n let (c,d ) = a.unconstrained_div(b);\n assert_eq((c, d), (a, U128::zero()));\n\n // Check where b is a multiple of a\n let (c,d) = b.unconstrained_div(a);\n assert_eq((c, d), (U128::zero(), b));\n\n // Dividing by zero returns 0,0\n let a = U128::from_u64s_le(0x1, 0x0);\n let b = U128::zero();\n let (c,d)= a.unconstrained_div(b);\n assert_eq((c, d), (U128::zero(), U128::zero()));\n\n // Dividing 1<<127 by 1<<127 (special case)\n let a = U128::from_u64s_le(0x0, pow63 as u64);\n let b = U128::from_u64s_le(0x0, pow63 as u64);\n let (c,d )= a.unconstrained_div(b);\n assert_eq((c, d), (U128::one(), U128::zero()));\n }\n\n #[test]\n fn integer_conversions() {\n // Maximum\n let start:Field = 0xffffffffffffffffffffffffffffffff;\n let a = U128::from_integer(start);\n let end = a.to_integer();\n assert_eq(start, end);\n\n // Minimum\n let start:Field = 0x0;\n let a = U128::from_integer(start);\n let end = a.to_integer();\n assert_eq(start, end);\n\n // Low limb\n let start:Field = 0xffffffffffffffff;\n let a = U128::from_integer(start);\n let end = a.to_integer();\n assert_eq(start, end);\n\n // High limb\n let start:Field = 0xffffffffffffffff0000000000000000;\n let a = U128::from_integer(start);\n let end = a.to_integer();\n assert_eq(start, end);\n }\n\n #[test]\n fn integer_conversions_fuzz(lo: u64, hi: u64) {\n let start: Field = (lo as Field) + pow64 * (hi as Field);\n let a = U128::from_integer(start);\n let end = a.to_integer();\n assert_eq(start, end);\n }\n\n #[test]\n fn test_wrapping_mul() {\n // 1*0==0\n assert_eq(U128::zero(), U128::zero().wrapping_mul(U128::one()));\n\n // 0*1==0\n assert_eq(U128::zero(), U128::one().wrapping_mul(U128::zero()));\n\n // 1*1==1\n assert_eq(U128::one(), U128::one().wrapping_mul(U128::one()));\n\n // 0 * ( 1 << 64 ) == 0\n assert_eq(U128::zero(), U128::zero().wrapping_mul(U128::from_u64s_le(0, 1)));\n\n // ( 1 << 64 ) * 0 == 0\n assert_eq(U128::zero(), U128::from_u64s_le(0, 1).wrapping_mul(U128::zero()));\n\n // 1 * ( 1 << 64 ) == 1 << 64\n assert_eq(U128::from_u64s_le(0, 1), U128::from_u64s_le(0, 1).wrapping_mul(U128::one()));\n\n // ( 1 << 64 ) * 1 == 1 << 64\n assert_eq(U128::from_u64s_le(0, 1), U128::one().wrapping_mul(U128::from_u64s_le(0, 1)));\n\n // ( 1 << 64 ) * ( 1 << 64 ) == 1 << 64\n assert_eq(U128::zero(), U128::from_u64s_le(0, 1).wrapping_mul(U128::from_u64s_le(0, 1)));\n // -1 * -1 == 1\n assert_eq(\n U128::one(), U128::from_u64s_le(0xffffffffffffffff, 0xffffffffffffffff).wrapping_mul(U128::from_u64s_le(0xffffffffffffffff, 0xffffffffffffffff))\n );\n }\n}\n"},"79":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/history/public_storage.nr","source":"use dep::protocol_types::{\n constants::GENERATOR_INDEX__PUBLIC_LEAF_INDEX, hash::pedersen_hash, address::AztecAddress,\n header::Header, utils::field::full_field_less_than\n};\nuse std::merkle::compute_merkle_root;\n\nuse crate::{context::PrivateContext, oracle::get_public_data_witness::get_public_data_witness};\n\ntrait PublicStorageHistoricalRead {\n fn public_storage_historical_read(header: Header, storage_slot: Field, contract_address: AztecAddress) -> Field;\n}\n\nimpl PublicStorageHistoricalRead for Header { \n fn public_storage_historical_read(self, storage_slot: Field, contract_address: AztecAddress) -> Field {\n // 1) Compute the leaf slot by siloing the storage slot with the contract address\n let public_value_leaf_slot = pedersen_hash(\n [contract_address.to_field(), storage_slot],\n GENERATOR_INDEX__PUBLIC_LEAF_INDEX\n );\n\n // 2) Get the membership witness of the slot\n let witness = get_public_data_witness(\n self.global_variables.block_number as u32,\n public_value_leaf_slot\n );\n\n // 3) Extract the value from the witness leaf and check that the storage slot is correct\n let preimage = witness.leaf_preimage;\n\n // Here we have two cases. Code based on same checks in `validate_public_data_reads` in `base_rollup_inputs`\n // 1. The value is the same as the one in the witness\n // 2. The value was never initialized and is zero\n let is_less_than_slot = full_field_less_than(preimage.slot, public_value_leaf_slot);\n let is_next_greater_than = full_field_less_than(public_value_leaf_slot, preimage.next_slot);\n let is_max = ((preimage.next_index == 0) & (preimage.next_slot == 0));\n let is_in_range = is_less_than_slot & (is_next_greater_than | is_max);\n\n let value = if is_in_range {\n 0\n } else {\n assert_eq(preimage.slot, public_value_leaf_slot, \"Public data slot doesn't match witness\");\n preimage.value\n };\n\n // 4) Prove that the leaf exists in the public data tree. Note that `hash` returns not just the hash of the value\n // but also the metadata (slot, next index and next slot).\n assert(\n self.state.partial.public_data_tree.root\n == compute_merkle_root(preimage.hash(), witness.index, witness.path), \"Proving public value inclusion failed\"\n );\n\n value\n }\n}\n"},"85":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/messaging.nr","source":"use crate::{\n hash::{compute_secret_hash, compute_message_hash, compute_message_nullifier},\n oracle::get_l1_to_l2_membership_witness::get_l1_to_l2_membership_witness\n};\n\nuse std::merkle::compute_merkle_root;\nuse dep::protocol_types::{constants::L1_TO_L2_MSG_TREE_HEIGHT, address::{AztecAddress, EthAddress}, utils::arr_copy_slice};\n\npub fn process_l1_to_l2_message(\n l1_to_l2_root: Field,\n storage_contract_address: AztecAddress,\n portal_contract_address: EthAddress,\n chain_id: Field,\n version: Field,\n content: Field,\n secret: Field\n) -> Field {\n let secret_hash = compute_secret_hash(secret);\n let message_hash = compute_message_hash(\n portal_contract_address,\n chain_id,\n storage_contract_address,\n version,\n content,\n secret_hash\n );\n\n let returned_message = get_l1_to_l2_membership_witness(storage_contract_address, message_hash, secret);\n let leaf_index = returned_message[0];\n let sibling_path = arr_copy_slice(returned_message, [0; L1_TO_L2_MSG_TREE_HEIGHT], 1);\n\n // Check that the message is in the tree\n // This is implicitly checking that the values of the message are correct\n let root = compute_merkle_root(message_hash, leaf_index, sibling_path);\n assert(root == l1_to_l2_root, \"Message not in state\");\n\n compute_message_nullifier(message_hash, secret, leaf_index)\n}\n"},"88":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/context/packed_returns.nr","source":"use crate::{hash::hash_args_array, oracle::returns::unpack_returns};\nuse dep::protocol_types::traits::Deserialize;\n\nstruct PackedReturns {\n packed_returns: Field,\n}\n\nimpl PackedReturns {\n pub fn new(packed_returns: Field) -> Self {\n PackedReturns { packed_returns }\n }\n\n pub fn assert_empty(self) {\n assert_eq(self.packed_returns, 0);\n }\n\n pub fn raw(self) -> Field {\n self.packed_returns\n }\n\n pub fn unpack<N>(self) -> [Field; N] {\n let unpacked: [Field; N] = unpack_returns(self.packed_returns);\n assert_eq(self.packed_returns, hash_args_array(unpacked));\n unpacked\n }\n\n pub fn unpack_into<T, N>(self) -> T where T: Deserialize<N> {\n let unpacked: [Field; N] = self.unpack();\n Deserialize::deserialize(unpacked)\n }\n}\n"},"92":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/context/call_interfaces.nr","source":"use dep::protocol_types::{\n abis::{function_selector::FunctionSelector, private_circuit_public_inputs::PrivateCircuitPublicInputs},\n address::AztecAddress, traits::Deserialize\n};\n\nuse crate::context::{\n private_context::PrivateContext, public_context::PublicContext, gas::GasOpts,\n public_context::FunctionReturns, inputs::{PrivateContextInputs, PublicContextInputs}\n};\n\nuse crate::oracle::arguments;\n\ntrait CallInterface<N, T, P, Env> {\n fn get_args(self) -> [Field];\n fn get_original(self) -> fn[Env](T) -> P;\n fn get_selector(self) -> FunctionSelector;\n fn get_name(self) -> str<N>;\n fn get_contract_address(self) -> AztecAddress;\n fn get_is_static(self) -> bool;\n}\n\nimpl<N, T, P, Env> CallInterface<N, PrivateContextInputs, PrivateCircuitPublicInputs, Env> for PrivateCallInterface<N, T, Env> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_original(self) -> fn[Env](PrivateContextInputs) -> PrivateCircuitPublicInputs {\n self.original\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<N> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\nstruct PrivateCallInterface<N, T, Env> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<N>,\n args_hash: Field,\n args: [Field],\n original: fn[Env](PrivateContextInputs) -> PrivateCircuitPublicInputs,\n is_static: bool\n}\n\nimpl<N, T, Env> PrivateCallInterface<N, T, Env> {\n pub fn call<M>(self, context: &mut PrivateContext) -> T where T: Deserialize<M> {\n let returns = context.call_private_function_with_packed_args(\n self.target_contract,\n self.selector,\n self.args_hash,\n false,\n false\n );\n let unpacked: T = returns.unpack_into();\n unpacked\n }\n\n pub fn view<M>(self, context: &mut PrivateContext) -> T where T: Deserialize<M> {\n let returns = context.call_private_function_with_packed_args(self.target_contract, self.selector, self.args_hash, true, false);\n returns.unpack_into()\n }\n\n pub fn delegate_call<M>(self, context: &mut PrivateContext) -> T where T: Deserialize<M> {\n let returns = context.call_private_function_with_packed_args(self.target_contract, self.selector, self.args_hash, false, true);\n returns.unpack_into()\n }\n}\n\nimpl<N, T, P, Env> CallInterface<N, PrivateContextInputs, PrivateCircuitPublicInputs, Env> for PrivateVoidCallInterface<N, Env> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_original(self) -> fn[Env](PrivateContextInputs) -> PrivateCircuitPublicInputs {\n self.original\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<N> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\nstruct PrivateVoidCallInterface<N, Env> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<N>,\n args_hash: Field,\n args: [Field],\n original: fn[Env](PrivateContextInputs) -> PrivateCircuitPublicInputs,\n is_static: bool\n}\n\nimpl<N, Env> PrivateVoidCallInterface<N, Env> {\n pub fn call(self, context: &mut PrivateContext) {\n context.call_private_function_with_packed_args(\n self.target_contract,\n self.selector,\n self.args_hash,\n false,\n false\n ).assert_empty();\n }\n\n pub fn view(self, context: &mut PrivateContext) {\n context.call_private_function_with_packed_args(self.target_contract, self.selector, self.args_hash, true, false).assert_empty();\n }\n\n pub fn delegate_call(self, context: &mut PrivateContext) {\n context.call_private_function_with_packed_args(self.target_contract, self.selector, self.args_hash, false, true).assert_empty();\n }\n}\n\nimpl<N, T, P, Env> CallInterface<N, PrivateContextInputs, PrivateCircuitPublicInputs, Env> for PrivateStaticCallInterface<N, T, Env> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_original(self) -> fn[Env](PrivateContextInputs) -> PrivateCircuitPublicInputs {\n self.original\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<N> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\nstruct PrivateStaticCallInterface<N, T, Env> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<N>,\n args_hash: Field,\n args: [Field],\n original: fn[Env](PrivateContextInputs) -> PrivateCircuitPublicInputs,\n is_static: bool\n}\n\nimpl<N, T, Env> PrivateStaticCallInterface<N, T, Env> {\n pub fn view<M>(self, context: &mut PrivateContext) -> T where T: Deserialize<M> {\n let returns = context.call_private_function_with_packed_args(self.target_contract, self.selector, self.args_hash, true, false);\n returns.unpack_into()\n }\n}\n\nimpl<N, T, P, Env> CallInterface<N, PrivateContextInputs, PrivateCircuitPublicInputs, Env> for PrivateStaticVoidCallInterface<N, Env> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_original(self) -> fn[Env](PrivateContextInputs) -> PrivateCircuitPublicInputs {\n self.original\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<N> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\nstruct PrivateStaticVoidCallInterface<N, Env> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<N>,\n args_hash: Field,\n args: [Field],\n original: fn[Env](PrivateContextInputs) -> PrivateCircuitPublicInputs,\n is_static: bool\n}\n\nimpl<N, Env> PrivateStaticVoidCallInterface<N, Env> {\n pub fn view(self, context: &mut PrivateContext) {\n context.call_private_function_with_packed_args(self.target_contract, self.selector, self.args_hash, true, false).assert_empty();\n }\n}\n\nimpl<N, T, P, Env> CallInterface<N, PublicContextInputs, T, Env> for PublicCallInterface<N, T, Env> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_original(self) -> fn[Env](PublicContextInputs) -> T {\n self.original\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<N> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\nstruct PublicCallInterface<N, T, Env> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<N>,\n args: [Field],\n gas_opts: GasOpts,\n original: fn[Env](PublicContextInputs) -> T,\n is_static: bool\n}\n\nimpl<N, T, Env> PublicCallInterface<N, T, Env> {\n pub fn with_gas(self: &mut Self, gas_opts: GasOpts) -> &mut Self {\n self.gas_opts = gas_opts;\n self\n }\n\n pub fn call<M>(self, context: &mut PublicContext) -> T where T: Deserialize<M> {\n let returns = context.call_public_function(self.target_contract, self.selector, self.args, self.gas_opts);\n returns.deserialize_into()\n }\n\n pub fn view<M>(self, context: &mut PublicContext) -> T where T: Deserialize<M> {\n let returns = context.static_call_public_function(self.target_contract, self.selector, self.args, self.gas_opts);\n returns.deserialize_into()\n }\n\n pub fn delegate_call<M>(self, context: &mut PublicContext) -> T where T: Deserialize<M> {\n let returns = context.delegate_call_public_function(self.target_contract, self.selector, self.args);\n returns.deserialize_into()\n }\n\n pub fn enqueue(self, context: &mut PrivateContext) {\n // This packing is only here because PrivateContext's call_public* functions do not accept a slice for the args.\n let args_hash = arguments::pack_arguments(self.args);\n context.call_public_function_with_packed_args(\n self.target_contract,\n self.selector,\n args_hash,\n /*static=*/ false,\n /*delegate=*/ false\n )\n }\n\n pub fn enqueue_view(self, context: &mut PrivateContext) {\n // This packing is only here because PrivateContext's call_public* functions do not accept a slice for the args.\n let args_hash = arguments::pack_arguments(self.args);\n context.call_public_function_with_packed_args(\n self.target_contract,\n self.selector,\n args_hash,\n /*static=*/ true,\n /*delegate=*/ false\n )\n }\n\n pub fn delegate_enqueue(self, context: &mut PrivateContext) {\n // This packing is only here because PrivateContext's call_public* functions do not accept a slice for the args.\n let args_hash = arguments::pack_arguments(self.args);\n context.call_public_function_with_packed_args(\n self.target_contract,\n self.selector,\n args_hash,\n /*static=*/ false,\n /*delegate=*/ true\n )\n }\n}\n\nimpl<N, T, P, Env> CallInterface<N, PublicContextInputs, (), Env> for PublicVoidCallInterface<N, Env> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_original(self) -> fn[Env](PublicContextInputs) -> () {\n self.original\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<N> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\nstruct PublicVoidCallInterface<N, Env> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<N>,\n args: [Field],\n gas_opts: GasOpts,\n original: fn[Env](PublicContextInputs) -> (),\n is_static: bool\n}\n\nimpl<N, Env> PublicVoidCallInterface<N, Env> {\n pub fn with_gas(self: &mut Self, gas_opts: GasOpts) -> &mut Self {\n self.gas_opts = gas_opts;\n self\n }\n\n pub fn call(self, context: &mut PublicContext) {\n let returns = context.call_public_function(self.target_contract, self.selector, self.args, self.gas_opts);\n returns.assert_empty()\n }\n\n pub fn view(self, context: &mut PublicContext) {\n let returns = context.static_call_public_function(self.target_contract, self.selector, self.args, self.gas_opts);\n returns.assert_empty()\n }\n\n pub fn delegate_call(self, context: &mut PublicContext) {\n let returns = context.delegate_call_public_function(self.target_contract, self.selector, self.args);\n returns.assert_empty()\n }\n\n pub fn enqueue(self, context: &mut PrivateContext) {\n // This packing is only here because PrivateContext's call_public* functions do not accept a slice for the args.\n let args_hash = arguments::pack_arguments(self.args);\n context.call_public_function_with_packed_args(\n self.target_contract,\n self.selector,\n args_hash,\n /*static=*/ false,\n /*delegate=*/ false\n )\n }\n\n pub fn enqueue_view(self, context: &mut PrivateContext) {\n // This packing is only here because PrivateContext's call_public* functions do not accept a slice for the args.\n let args_hash = arguments::pack_arguments(self.args);\n context.call_public_function_with_packed_args(\n self.target_contract,\n self.selector,\n args_hash,\n /*static=*/ true,\n /*delegate=*/ false\n )\n }\n\n pub fn delegate_enqueue(self, context: &mut PrivateContext) {\n // This packing is only here because PrivateContext's call_public* functions do not accept a slice for the args.\n let args_hash = arguments::pack_arguments(self.args);\n context.call_public_function_with_packed_args(\n self.target_contract,\n self.selector,\n args_hash,\n /*static=*/ false,\n /*delegate=*/ true\n )\n }\n}\n\nimpl<N, T, P, Env> CallInterface<N, PublicContextInputs, T, Env> for PublicStaticCallInterface<N, T, Env> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_original(self) -> fn[Env](PublicContextInputs) -> T {\n self.original\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<N> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\nstruct PublicStaticCallInterface<N, T, Env> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<N>,\n args: [Field],\n gas_opts: GasOpts,\n original: fn[Env](PublicContextInputs) -> T,\n is_static: bool\n}\n\nimpl<N, T, Env> PublicStaticCallInterface<N, T, Env> {\n pub fn with_gas(self: &mut Self, gas_opts: GasOpts) -> &mut Self {\n self.gas_opts = gas_opts;\n self\n }\n\n pub fn view<M>(self, context: &mut PublicContext) -> T where T: Deserialize<M> {\n let returns = context.static_call_public_function(self.target_contract, self.selector, self.args, self.gas_opts);\n let unpacked: T = returns.deserialize_into();\n unpacked\n }\n\n pub fn enqueue_view(self, context: &mut PrivateContext) {\n // This packing is only here because PrivateContext's call_public* functions do not accept a slice for the args.\n let args_hash = arguments::pack_arguments(self.args);\n context.call_public_function_with_packed_args(\n self.target_contract,\n self.selector,\n args_hash,\n /*static=*/ true,\n /*delegate=*/ false\n )\n }\n}\n\nimpl<N, T, P, Env> CallInterface<N, PublicContextInputs, (), Env> for PublicStaticVoidCallInterface<N, Env> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_original(self) -> fn[Env](PublicContextInputs) -> () {\n self.original\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<N> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\nstruct PublicStaticVoidCallInterface<N, Env> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<N>,\n args: [Field],\n gas_opts: GasOpts,\n original: fn[Env](PublicContextInputs) -> (),\n is_static: bool\n}\n\nimpl<N, Env> PublicStaticVoidCallInterface<N, Env> {\n pub fn with_gas(self: &mut Self, gas_opts: GasOpts) -> &mut Self {\n self.gas_opts = gas_opts;\n self\n }\n\n pub fn view(self, context: &mut PublicContext) {\n let returns = context.static_call_public_function(self.target_contract, self.selector, self.args, self.gas_opts);\n returns.assert_empty()\n }\n\n pub fn enqueue_view(self, context: &mut PrivateContext) {\n // This packing is only here because PrivateContext's call_public* functions do not accept a slice for the args.\n let args_hash = arguments::pack_arguments(self.args);\n context.call_public_function_with_packed_args(\n self.target_contract,\n self.selector,\n args_hash,\n /*static=*/ true,\n /*delegate=*/ false\n )\n }\n}\n"},"93":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/context/private_context.nr","source":"use crate::{\n context::{inputs::PrivateContextInputs, packed_returns::PackedReturns},\n messaging::process_l1_to_l2_message, hash::{hash_args_array, ArgsHasher},\n keys::constants::{NULLIFIER_INDEX, OUTGOING_INDEX, NUM_KEY_TYPES, sk_generators},\n oracle::{\n key_validation_request::get_key_validation_request, arguments, returns::pack_returns,\n call_private_function::call_private_function_internal, header::get_header_at,\n logs::{emit_encrypted_note_log, emit_encrypted_event_log},\n enqueue_public_function_call::{\n enqueue_public_function_call_internal, set_public_teardown_function_call_internal,\n parse_public_call_stack_item_from_oracle\n}\n}\n};\nuse dep::protocol_types::{\n abis::{\n caller_context::CallerContext, function_selector::FunctionSelector,\n max_block_number::MaxBlockNumber,\n validation_requests::{KeyValidationRequest, KeyValidationRequestAndGenerator},\n private_call_request::PrivateCallRequest, private_circuit_public_inputs::PrivateCircuitPublicInputs,\n public_call_stack_item::PublicCallStackItem, read_request::ReadRequest, note_hash::NoteHash,\n nullifier::Nullifier, log_hash::{LogHash, NoteLogHash, EncryptedLogHash}\n},\n address::{AztecAddress, EthAddress},\n constants::{\n MAX_NOTE_HASHES_PER_CALL, MAX_L2_TO_L1_MSGS_PER_CALL, MAX_NULLIFIERS_PER_CALL,\n MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL, MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL,\n MAX_NOTE_HASH_READ_REQUESTS_PER_CALL, MAX_NULLIFIER_READ_REQUESTS_PER_CALL,\n MAX_KEY_VALIDATION_REQUESTS_PER_CALL, MAX_ENCRYPTED_LOGS_PER_CALL, MAX_UNENCRYPTED_LOGS_PER_CALL,\n MAX_NOTE_ENCRYPTED_LOGS_PER_CALL\n},\n header::Header, messaging::l2_to_l1_message::L2ToL1Message, utils::reader::Reader, traits::Empty\n};\n\n// When finished, one can call .finish() to convert back to the abi\nstruct PrivateContext {\n // docs:start:private-context\n inputs: PrivateContextInputs,\n side_effect_counter: u32,\n\n min_revertible_side_effect_counter: u32,\n is_fee_payer: bool,\n\n args_hash: Field,\n return_hash: Field,\n\n max_block_number: MaxBlockNumber,\n\n note_hash_read_requests: BoundedVec<ReadRequest, MAX_NOTE_HASH_READ_REQUESTS_PER_CALL>,\n nullifier_read_requests: BoundedVec<ReadRequest, MAX_NULLIFIER_READ_REQUESTS_PER_CALL>,\n key_validation_requests_and_generators: BoundedVec<KeyValidationRequestAndGenerator, MAX_KEY_VALIDATION_REQUESTS_PER_CALL>,\n\n note_hashes: BoundedVec<NoteHash, MAX_NOTE_HASHES_PER_CALL>,\n nullifiers: BoundedVec<Nullifier, MAX_NULLIFIERS_PER_CALL>,\n\n private_call_requests : BoundedVec<PrivateCallRequest, MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL>,\n public_call_stack_hashes : BoundedVec<Field, MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL>,\n public_teardown_function_hash: Field,\n l2_to_l1_msgs : BoundedVec<L2ToL1Message, MAX_L2_TO_L1_MSGS_PER_CALL>,\n // docs:end:private-context\n\n // Header of a block whose state is used during private execution (not the block the transaction is included in).\n historical_header: Header,\n\n note_encrypted_logs_hashes: BoundedVec<NoteLogHash, MAX_NOTE_ENCRYPTED_LOGS_PER_CALL>,\n encrypted_logs_hashes: BoundedVec<EncryptedLogHash, MAX_ENCRYPTED_LOGS_PER_CALL>,\n unencrypted_logs_hashes: BoundedVec<LogHash, MAX_UNENCRYPTED_LOGS_PER_CALL>,\n\n // Contains the last key validation request for each key type. This is used to cache the last request and avoid\n // fetching the same request multiple times.\n // The index of the array corresponds to the key type (0 nullifier, 1 incoming, 2 outgoing, 3 tagging).\n last_key_validation_requests: [Option<KeyValidationRequest>; NUM_KEY_TYPES],\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 max_block_number: MaxBlockNumber::empty(),\n note_hash_read_requests: BoundedVec::new(),\n nullifier_read_requests: BoundedVec::new(),\n key_validation_requests_and_generators: BoundedVec::new(),\n note_hashes: BoundedVec::new(),\n nullifiers: BoundedVec::new(),\n historical_header: inputs.historical_header,\n private_call_requests: BoundedVec::new(),\n public_call_stack_hashes: BoundedVec::new(),\n public_teardown_function_hash: 0,\n l2_to_l1_msgs: BoundedVec::new(),\n note_encrypted_logs_hashes: BoundedVec::new(),\n encrypted_logs_hashes: BoundedVec::new(),\n unencrypted_logs_hashes: BoundedVec::new(),\n last_key_validation_requests: [Option::none(); NUM_KEY_TYPES]\n }\n }\n\n fn msg_sender(self) -> AztecAddress {\n self.inputs.call_context.msg_sender\n }\n\n fn this_address(self) -> AztecAddress {\n self.inputs.call_context.storage_contract_address\n }\n\n fn chain_id(self) -> Field {\n self.inputs.tx_context.chain_id\n }\n\n fn version(self) -> Field {\n self.inputs.tx_context.version\n }\n\n fn selector(self) -> FunctionSelector {\n self.inputs.call_context.function_selector\n }\n\n fn get_args_hash(self) -> Field {\n self.args_hash\n }\n\n fn push_note_hash(&mut self, note_hash: Field) {\n self.note_hashes.push(NoteHash { value: note_hash, counter: self.next_counter() });\n }\n\n // TODO(#7112): This function is called with non-zero note hash only in 1 of 25 cases in aztec-packages repo\n // - consider creating a separate function with 1 arg for the zero note hash case.\n fn push_nullifier(&mut self, nullifier: Field, nullified_note_hash: Field) {\n self.nullifiers.push(Nullifier { value: nullifier, note_hash: nullified_note_hash, counter: self.next_counter() });\n }\n\n // Returns the header of a block whose state is used during private execution (not the block the transaction is\n // included in).\n fn get_header(self) -> Header {\n self.historical_header\n }\n\n // Returns the header of an arbitrary block whose block number is less than or equal to the block number\n // of historical header.\n pub fn get_header_at(self, block_number: u32) -> Header {\n get_header_at(block_number, self)\n }\n\n pub fn set_return_hash(&mut self, returns_hasher: ArgsHasher) {\n pack_returns(returns_hasher.fields);\n self.return_hash = returns_hasher.hash();\n }\n\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 max_block_number: self.max_block_number,\n note_hash_read_requests: self.note_hash_read_requests.storage,\n nullifier_read_requests: self.nullifier_read_requests.storage,\n key_validation_requests_and_generators: self.key_validation_requests_and_generators.storage,\n note_hashes: self.note_hashes.storage,\n nullifiers: self.nullifiers.storage,\n private_call_requests: self.private_call_requests.storage,\n public_call_stack_hashes: self.public_call_stack_hashes.storage,\n public_teardown_function_hash: self.public_teardown_function_hash,\n l2_to_l1_msgs: self.l2_to_l1_msgs.storage,\n start_side_effect_counter: self.inputs.start_side_effect_counter,\n end_side_effect_counter: self.side_effect_counter,\n note_encrypted_logs_hashes: self.note_encrypted_logs_hashes.storage,\n encrypted_logs_hashes: self.encrypted_logs_hashes.storage,\n unencrypted_logs_hashes: self.unencrypted_logs_hashes.storage,\n historical_header: self.historical_header,\n tx_context: self.inputs.tx_context\n }\n }\n\n pub fn set_as_fee_payer(&mut self) {\n dep::protocol_types::debug_log::debug_log_format(\"Setting {0} as fee payer\", [self.this_address().to_field()]);\n self.is_fee_payer = true;\n }\n\n pub fn end_setup(&mut self) {\n // dep::protocol_types::debug_log::debug_log_format(\n // \"Ending setup at counter {0}\",\n // [self.side_effect_counter as Field]\n // );\n self.min_revertible_side_effect_counter = self.side_effect_counter;\n }\n\n // docs:start:max-block-number\n pub fn set_tx_max_block_number(&mut self, max_block_number: u32) {\n // docs:end:max-block-number\n self.max_block_number = MaxBlockNumber::min_with_u32(self.max_block_number, max_block_number);\n }\n\n pub fn push_note_hash_read_request(&mut self, note_hash: Field) {\n let side_effect = ReadRequest { value: note_hash, counter: self.next_counter() };\n self.note_hash_read_requests.push(side_effect);\n }\n\n pub fn push_nullifier_read_request(&mut self, nullifier: Field) {\n let request = ReadRequest { value: nullifier, counter: self.next_counter() };\n self.nullifier_read_requests.push(request);\n }\n\n pub fn request_nsk_app(&mut self, npk_m_hash: Field) -> Field {\n self.request_sk_app(npk_m_hash, NULLIFIER_INDEX)\n }\n\n pub fn request_ovsk_app(&mut self, ovpk_m_hash: Field) -> Field {\n self.request_sk_app(ovpk_m_hash, OUTGOING_INDEX)\n }\n\n fn request_sk_app(&mut self, pk_m_hash: Field, key_index: Field) -> Field {\n let cached_request = self.last_key_validation_requests[key_index].unwrap_or(KeyValidationRequest::empty());\n\n if cached_request.pk_m.hash() == pk_m_hash {\n // We get a match so the cached request is the latest one \n cached_request.sk_app\n } else {\n // We didn't get a match meaning the cached result is stale. We fetch new values from oracle and instruct\n // protocol circuits to validate them by storing the validation request in context.\n let request = get_key_validation_request(pk_m_hash, key_index);\n let request_and_generator = KeyValidationRequestAndGenerator { request, sk_app_generator: sk_generators[key_index] };\n // We constrain that the pk_m_hash matches the one in the request (otherwise we could get an arbitrary\n // valid key request and not the one corresponding to pk_m_hash).\n assert(request.pk_m.hash() == pk_m_hash);\n self.key_validation_requests_and_generators.push(request_and_generator);\n self.last_key_validation_requests[key_index] = Option::some(request);\n request.sk_app\n }\n }\n\n // docs:start:context_message_portal\n pub fn message_portal(&mut self, recipient: EthAddress, content: Field) {\n // docs:end:context_message_portal\n let message = L2ToL1Message { recipient, content, counter: self.next_counter() };\n self.l2_to_l1_msgs.push(message);\n }\n\n // docs:start:context_consume_l1_to_l2_message\n // docs:start:consume_l1_to_l2_message\n pub fn consume_l1_to_l2_message(&mut self, content: Field, secret: Field, sender: EthAddress) {\n // docs:end:context_consume_l1_to_l2_message\n let nullifier = process_l1_to_l2_message(\n self.historical_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 );\n\n // Push nullifier (and the \"commitment\" corresponding to this can be \"empty\")\n self.push_nullifier(nullifier, 0)\n }\n // docs:end:consume_l1_to_l2_message\n\n // NB: A randomness value of 0 signals that the kernels should not mask the contract address\n // used in siloing later on e.g. 'handshaking' contract w/ known address.\n pub fn emit_raw_event_log_with_masked_address<M>(&mut self, randomness: Field, log: [u8; M], log_hash: Field) {\n let counter = self.next_counter();\n let contract_address = self.this_address();\n let len = log.len() as Field + 4;\n let side_effect = EncryptedLogHash { value: log_hash, counter, length: len, randomness };\n self.encrypted_logs_hashes.push(side_effect);\n\n emit_encrypted_event_log(contract_address, randomness, log, counter);\n }\n\n pub fn emit_raw_note_log<M>(&mut self, note_hash_counter: u32, log: [u8; M], log_hash: Field) {\n let counter = self.next_counter();\n let len = log.len() as Field + 4;\n let side_effect = NoteLogHash { value: log_hash, counter, length: len, note_hash_counter };\n self.note_encrypted_logs_hashes.push(side_effect);\n\n emit_encrypted_note_log(note_hash_counter, log, counter);\n }\n\n pub fn call_private_function<ARGS_COUNT>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT]\n ) -> PackedReturns {\n let args_hash = hash_args_array(args);\n assert(args_hash == arguments::pack_arguments_array(args));\n self.call_private_function_with_packed_args(contract_address, function_selector, args_hash, false, false)\n }\n\n pub fn static_call_private_function<ARGS_COUNT>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT]\n ) -> PackedReturns {\n let args_hash = hash_args_array(args);\n assert(args_hash == arguments::pack_arguments_array(args));\n self.call_private_function_with_packed_args(contract_address, function_selector, args_hash, true, false)\n }\n\n pub fn delegate_call_private_function<ARGS_COUNT>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT]\n ) -> PackedReturns {\n let args_hash = hash_args_array(args);\n assert(args_hash == arguments::pack_arguments_array(args));\n self.call_private_function_with_packed_args(contract_address, function_selector, args_hash, false, true)\n }\n\n pub fn call_private_function_no_args<RETURNS_COUNT>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector\n ) -> PackedReturns {\n self.call_private_function_with_packed_args(contract_address, function_selector, 0, false, false)\n }\n\n pub fn static_call_private_function_no_args<RETURNS_COUNT>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector\n ) -> PackedReturns {\n self.call_private_function_with_packed_args(contract_address, function_selector, 0, true, false)\n }\n\n pub fn delegate_call_private_function_no_args<ARGS_COUNT>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector\n ) -> PackedReturns {\n self.call_private_function_with_packed_args(contract_address, function_selector, 0, false, true)\n }\n\n pub fn call_private_function_with_packed_args<RETURNS_COUNT>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n is_delegate_call: bool\n ) -> PackedReturns {\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 let item = call_private_function_internal(\n contract_address,\n function_selector,\n args_hash,\n start_side_effect_counter,\n is_static_call,\n is_delegate_call\n );\n\n assert_eq(item.public_inputs.call_context.side_effect_counter, start_side_effect_counter);\n assert_eq(item.public_inputs.start_side_effect_counter, start_side_effect_counter);\n let end_side_effect_counter = item.public_inputs.end_side_effect_counter;\n self.side_effect_counter = end_side_effect_counter + 1;\n\n // TODO (fees) figure out why this crashes the prover and enable it\n // we need this in order to pay fees inside child call contexts\n // assert(\n // (item.public_inputs.min_revertible_side_effect_counter == 0 as u32)\n // | (item.public_inputs.min_revertible_side_effect_counter\n // > self.min_revertible_side_effect_counter)\n // );\n\n // if item.public_inputs.min_revertible_side_effect_counter\n // > self.min_revertible_side_effect_counter {\n // self.min_revertible_side_effect_counter = item.public_inputs.min_revertible_side_effect_counter;\n // }\n\n assert(contract_address.eq(item.contract_address));\n assert(function_selector.eq(item.function_data.selector));\n\n assert(args_hash == item.public_inputs.args_hash);\n\n // Assert that the call context of the call generated by the oracle matches our request.\n assert(item.public_inputs.call_context.is_delegate_call == is_delegate_call);\n assert(item.public_inputs.call_context.is_static_call == is_static_call);\n\n if (is_delegate_call) {\n // For delegate calls, we also constrain the execution context address for the nested call to be equal to our address.\n assert(\n item.public_inputs.call_context.storage_contract_address.eq(self.inputs.call_context.storage_contract_address)\n );\n assert(item.public_inputs.call_context.msg_sender.eq(self.inputs.call_context.msg_sender));\n } else {\n // For non-delegate calls, we also constrain the execution context address for the nested call to be equal to the address we called.\n assert(item.public_inputs.call_context.storage_contract_address.eq(contract_address));\n assert(\n item.public_inputs.call_context.msg_sender.eq(self.inputs.call_context.storage_contract_address)\n );\n }\n\n let mut caller_context = CallerContext::empty();\n caller_context.is_static_call = self.inputs.call_context.is_static_call;\n if is_delegate_call {\n caller_context.msg_sender = self.inputs.call_context.msg_sender;\n caller_context.storage_contract_address = self.inputs.call_context.storage_contract_address;\n }\n self.private_call_requests.push(\n PrivateCallRequest { hash: item.hash(), caller_context, start_side_effect_counter, end_side_effect_counter }\n );\n\n PackedReturns::new(item.public_inputs.returns_hash)\n }\n\n pub fn call_public_function<ARGS_COUNT>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT]\n ) {\n let args_hash = hash_args_array(args);\n assert(args_hash == arguments::pack_arguments_array(args));\n self.call_public_function_with_packed_args(contract_address, function_selector, args_hash, false, false)\n }\n\n pub fn static_call_public_function<ARGS_COUNT>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT]\n ) {\n let args_hash = hash_args_array(args);\n assert(args_hash == arguments::pack_arguments_array(args));\n self.call_public_function_with_packed_args(contract_address, function_selector, args_hash, true, false)\n }\n\n pub fn delegate_call_public_function<ARGS_COUNT>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT]\n ) {\n let args_hash = hash_args_array(args);\n assert(args_hash == arguments::pack_arguments_array(args));\n self.call_public_function_with_packed_args(contract_address, function_selector, args_hash, false, true)\n }\n\n pub fn call_public_function_no_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector\n ) {\n self.call_public_function_with_packed_args(contract_address, function_selector, 0, false, false)\n }\n\n pub fn static_call_public_function_no_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector\n ) {\n self.call_public_function_with_packed_args(contract_address, function_selector, 0, true, false)\n }\n\n pub fn delegate_call_public_function_no_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector\n ) {\n self.call_public_function_with_packed_args(contract_address, function_selector, 0, false, true)\n }\n\n pub fn call_public_function_with_packed_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n is_delegate_call: bool\n ) {\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n let fields = enqueue_public_function_call_internal(\n contract_address,\n function_selector,\n args_hash,\n self.side_effect_counter,\n is_static_call,\n is_delegate_call\n );\n\n let item = parse_public_call_stack_item_from_oracle(fields);\n self.validate_call_stack_item_from_oracle(\n item,\n contract_address,\n function_selector,\n args_hash,\n is_static_call,\n is_delegate_call\n );\n\n self.side_effect_counter = self.side_effect_counter + 1;\n self.public_call_stack_hashes.push(item.hash());\n }\n\n pub fn set_public_teardown_function<ARGS_COUNT>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT]\n ) {\n let args_hash = hash_args_array(args);\n assert(args_hash == arguments::pack_arguments_array(args));\n self.set_public_teardown_function_with_packed_args(contract_address, function_selector, args_hash, false, false)\n }\n\n pub fn set_public_teardown_function_with_packed_args<ARGS_COUNT>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n is_delegate_call: bool\n ) {\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n let fields = set_public_teardown_function_call_internal(\n contract_address,\n function_selector,\n args_hash,\n self.side_effect_counter,\n is_static_call,\n is_delegate_call\n );\n\n let item = parse_public_call_stack_item_from_oracle(fields);\n self.validate_call_stack_item_from_oracle(\n item,\n contract_address,\n function_selector,\n args_hash,\n is_static_call,\n is_delegate_call\n );\n\n self.side_effect_counter = self.side_effect_counter + 1;\n self.public_teardown_function_hash = item.hash();\n }\n\n fn validate_call_stack_item_from_oracle(\n self,\n item: PublicCallStackItem,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n is_delegate_call: bool\n ) {\n assert(contract_address.eq(item.contract_address));\n assert(function_selector.eq(item.function_data.selector));\n\n assert_eq(item.public_inputs.call_context.side_effect_counter, self.side_effect_counter);\n\n assert(args_hash == item.public_inputs.args_hash);\n\n // Assert that the call context of the enqueued call generated by the oracle matches our request.\n assert(item.public_inputs.call_context.is_delegate_call == is_delegate_call);\n assert(item.public_inputs.call_context.is_static_call == is_static_call);\n\n if (is_delegate_call) {\n // For delegate calls, we also constrain the execution context address for the nested call to be equal to our address.\n assert(\n item.public_inputs.call_context.storage_contract_address.eq(self.inputs.call_context.storage_contract_address)\n );\n assert(item.public_inputs.call_context.msg_sender.eq(self.inputs.call_context.msg_sender));\n } else {\n // For non-delegate calls, we also constrain the execution context address for the nested call to be equal to the address we called.\n assert(item.public_inputs.call_context.storage_contract_address.eq(contract_address));\n assert(\n item.public_inputs.call_context.msg_sender.eq(self.inputs.call_context.storage_contract_address)\n );\n }\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 max_block_number: MaxBlockNumber::empty(),\n note_hash_read_requests: BoundedVec::new(),\n nullifier_read_requests: BoundedVec::new(),\n key_validation_requests_and_generators: BoundedVec::new(),\n note_hashes: BoundedVec::new(),\n nullifiers: BoundedVec::new(),\n private_call_requests: BoundedVec::new(),\n public_call_stack_hashes: BoundedVec::new(),\n public_teardown_function_hash: 0,\n l2_to_l1_msgs: BoundedVec::new(),\n historical_header: Header::empty(),\n note_encrypted_logs_hashes: BoundedVec::new(),\n encrypted_logs_hashes: BoundedVec::new(),\n unencrypted_logs_hashes: BoundedVec::new(),\n last_key_validation_requests: [Option::none(); NUM_KEY_TYPES]\n }\n }\n}\n"},"94":{"path":"/usr/src/noir-projects/aztec-nr/aztec/src/context/public_context.nr","source":"use crate::hash::{compute_secret_hash, compute_message_hash, compute_message_nullifier};\nuse dep::protocol_types::address::{AztecAddress, EthAddress};\nuse dep::protocol_types::traits::{Serialize, Deserialize, Empty};\nuse dep::protocol_types::abis::function_selector::FunctionSelector;\nuse crate::context::inputs::public_context_inputs::PublicContextInputs;\nuse crate::context::gas::GasOpts;\n\nstruct PublicContext {\n inputs: PublicContextInputs,\n}\n\nimpl PublicContext {\n pub fn new(inputs: PublicContextInputs) -> Self {\n PublicContext { inputs }\n }\n\n pub fn emit_unencrypted_log<T, N>(&mut self, log: T) where T: Serialize<N> {\n emit_unencrypted_log(Serialize::serialize(log).as_slice());\n }\n\n pub fn note_hash_exists(self, note_hash: Field, leaf_index: Field) -> bool {\n note_hash_exists(note_hash, leaf_index) == 1\n }\n\n pub fn l1_to_l2_msg_exists(self, msg_hash: Field, msg_leaf_index: Field) -> bool {\n l1_to_l2_msg_exists(msg_hash, msg_leaf_index) == 1\n }\n\n fn nullifier_exists(self, unsiloed_nullifier: Field, address: AztecAddress) -> bool {\n nullifier_exists(unsiloed_nullifier, address.to_field()) == 1\n }\n\n 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 secret_hash = compute_secret_hash(secret);\n let message_hash = compute_message_hash(\n sender,\n self.chain_id(),\n /*recipient=*/ self.this_address(),\n self.version(),\n content,\n secret_hash\n );\n let nullifier = compute_message_nullifier(message_hash, secret, leaf_index);\n\n assert(\n !self.nullifier_exists(nullifier, self.this_address()), \"L1-to-L2 message is already nullified\"\n );\n assert(\n self.l1_to_l2_msg_exists(message_hash, leaf_index), \"Tried to consume nonexistent L1-to-L2 message\"\n );\n\n // Push nullifier (and the \"commitment\" corresponding to this can be \"empty\")\n self.push_nullifier(nullifier, 0);\n }\n\n fn message_portal(&mut self, recipient: EthAddress, content: Field) {\n send_l2_to_l1_msg(recipient, content);\n }\n\n fn call_public_function<RETURNS_COUNT>(\n self: &mut Self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field],\n gas_opts: GasOpts\n ) -> FunctionReturns<RETURNS_COUNT> {\n let results = call(\n gas_for_call(gas_opts),\n contract_address,\n args,\n function_selector.to_field()\n );\n let data_to_return: [Field; RETURNS_COUNT] = results.0;\n let success: u8 = results.1;\n assert(success == 1, \"Nested call failed!\");\n\n FunctionReturns::new(data_to_return)\n }\n\n fn static_call_public_function<RETURNS_COUNT>(\n self: &mut Self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field],\n gas_opts: GasOpts\n ) -> FunctionReturns<RETURNS_COUNT> {\n let (data_to_return, success): ([Field; RETURNS_COUNT], u8) = call_static(\n gas_for_call(gas_opts),\n contract_address,\n args,\n function_selector.to_field()\n );\n\n assert(success == 1, \"Nested static call failed!\");\n FunctionReturns::new(data_to_return)\n }\n\n fn delegate_call_public_function<RETURNS_COUNT>(\n self: &mut Self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field]\n ) -> FunctionReturns<RETURNS_COUNT> {\n assert(false, \"'delegate_call_public_function' not implemented!\");\n FunctionReturns::new([0; RETURNS_COUNT])\n }\n\n fn push_note_hash(&mut self, note_hash: Field) {\n emit_note_hash(note_hash);\n }\n fn push_nullifier(&mut self, nullifier: Field, _nullified_commitment: Field) {\n // Cannot nullify pending commitments in AVM, so `nullified_commitment` is not used\n emit_nullifier(nullifier);\n }\n\n fn this_address(self) -> AztecAddress {\n address()\n }\n pub fn storage_address(self) -> AztecAddress {\n storage_address()\n }\n fn msg_sender(self) -> AztecAddress {\n sender()\n }\n fn selector(self) -> FunctionSelector {\n FunctionSelector::from_u32(function_selector())\n }\n fn get_args_hash(self) -> Field {\n self.inputs.args_hash\n }\n fn transaction_fee(self) -> Field {\n transaction_fee()\n }\n\n fn chain_id(self) -> Field {\n chain_id()\n }\n fn version(self) -> Field {\n version()\n }\n fn block_number(self) -> Field {\n block_number()\n }\n fn timestamp(self) -> u64 {\n timestamp()\n }\n pub fn fee_per_l2_gas(self) -> Field {\n fee_per_l2_gas()\n }\n pub fn fee_per_da_gas(self) -> Field {\n fee_per_da_gas()\n }\n\n fn l2_gas_left(self) -> Field {\n l2_gas_left()\n }\n fn da_gas_left(self) -> Field {\n da_gas_left()\n }\n\n fn raw_storage_read<N>(_self: Self, storage_slot: Field) -> [Field; N] {\n storage_read(storage_slot)\n }\n\n fn storage_read<T, N>(self, storage_slot: Field) -> T where T: Deserialize<N> {\n T::deserialize(self.raw_storage_read(storage_slot))\n }\n\n fn raw_storage_write<N>(_self: Self, storage_slot: Field, values: [Field; N]) {\n storage_write(storage_slot, values);\n }\n\n fn storage_write<T, N>(self, storage_slot: Field, value: T) where T: Serialize<N> {\n self.raw_storage_write(storage_slot, value.serialize());\n }\n}\n\n// Helper functions\nfn gas_for_call(user_gas: GasOpts) -> [Field; 2] {\n // It's ok to use the max possible gas here, because the gas will be\n // capped by the gas left in the (STATIC)CALL instruction.\n let MAX_POSSIBLE_FIELD: Field = 0 - 1;\n [\n user_gas.l2_gas.unwrap_or(MAX_POSSIBLE_FIELD),\n user_gas.da_gas.unwrap_or(MAX_POSSIBLE_FIELD)\n ]\n}\n\n// Unconstrained opcode wrappers (do not use directly).\n// TODO(https://github.com/AztecProtocol/aztec-packages/issues/6420): reconsider.\nunconstrained fn address() -> AztecAddress {\n address_opcode()\n}\nunconstrained fn storage_address() -> AztecAddress {\n storage_address_opcode()\n}\nunconstrained fn sender() -> AztecAddress {\n sender_opcode()\n}\nunconstrained fn portal() -> EthAddress {\n portal_opcode()\n}\nunconstrained fn function_selector() -> u32 {\n function_selector_opcode()\n}\nunconstrained fn transaction_fee() -> Field {\n transaction_fee_opcode()\n}\nunconstrained fn chain_id() -> Field {\n chain_id_opcode()\n}\nunconstrained fn version() -> Field {\n version_opcode()\n}\nunconstrained fn block_number() -> Field {\n block_number_opcode()\n}\nunconstrained fn timestamp() -> u64 {\n timestamp_opcode()\n}\nunconstrained fn fee_per_l2_gas() -> Field {\n fee_per_l2_gas_opcode()\n}\nunconstrained fn fee_per_da_gas() -> Field {\n fee_per_da_gas_opcode()\n}\nunconstrained fn l2_gas_left() -> Field {\n l2_gas_left_opcode()\n}\nunconstrained fn da_gas_left() -> Field {\n da_gas_left_opcode()\n}\nunconstrained fn note_hash_exists(note_hash: Field, leaf_index: Field) -> u8 {\n note_hash_exists_opcode(note_hash, leaf_index)\n}\nunconstrained fn emit_note_hash(note_hash: Field) {\n emit_note_hash_opcode(note_hash)\n}\nunconstrained fn nullifier_exists(nullifier: Field, address: Field) -> u8 {\n nullifier_exists_opcode(nullifier, address)\n}\nunconstrained fn emit_nullifier(nullifier: Field) {\n emit_nullifier_opcode(nullifier)\n}\nunconstrained fn emit_unencrypted_log(message: [Field]) {\n emit_unencrypted_log_opcode(message)\n}\nunconstrained fn l1_to_l2_msg_exists(msg_hash: Field, msg_leaf_index: Field) -> u8 {\n l1_to_l2_msg_exists_opcode(msg_hash, msg_leaf_index)\n}\nunconstrained fn send_l2_to_l1_msg(recipient: EthAddress, content: Field) {\n send_l2_to_l1_msg_opcode(recipient, content)\n}\nunconstrained fn call<RET_SIZE>(\n gas: [Field; 2],\n address: AztecAddress,\n args: [Field],\n function_selector: Field\n) -> ([Field; RET_SIZE], u8) {\n call_opcode(gas, address, args, function_selector)\n}\nunconstrained fn call_static<RET_SIZE>(\n gas: [Field; 2],\n address: AztecAddress,\n args: [Field],\n function_selector: Field\n) -> ([Field; RET_SIZE], u8) {\n call_static_opcode(gas, address, args, function_selector)\n}\n\nunconstrained fn storage_read<N>(storage_slot: Field) -> [Field; N] {\n storage_read_opcode(storage_slot, N)\n}\n\nunconstrained fn storage_write<N>(storage_slot: Field, values: [Field; N]) {\n storage_write_opcode(storage_slot, values);\n}\n\nimpl Empty for PublicContext {\n fn empty() -> Self {\n PublicContext::new(PublicContextInputs::empty())\n }\n}\n\n// AVM oracles (opcodes) follow, do not use directly.\n#[oracle(avmOpcodeAddress)]\nunconstrained fn address_opcode() -> AztecAddress {}\n\n#[oracle(avmOpcodeStorageAddress)]\nunconstrained fn storage_address_opcode() -> AztecAddress {}\n\n#[oracle(avmOpcodeSender)]\nunconstrained fn sender_opcode() -> AztecAddress {}\n\n#[oracle(avmOpcodePortal)]\nunconstrained fn portal_opcode() -> EthAddress {}\n\n#[oracle(avmOpcodeFunctionSelector)]\nunconstrained fn function_selector_opcode() -> u32 {}\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() -> Field {}\n\n#[oracle(avmOpcodeTimestamp)]\nunconstrained fn timestamp_opcode() -> u64 {}\n\n#[oracle(avmOpcodeFeePerL2Gas)]\nunconstrained fn fee_per_l2_gas_opcode() -> Field {}\n\n#[oracle(avmOpcodeFeePerDaGas)]\nunconstrained fn fee_per_da_gas_opcode() -> Field {}\n\n#[oracle(avmOpcodeL2GasLeft)]\nunconstrained fn l2_gas_left_opcode() -> Field {}\n\n#[oracle(avmOpcodeDaGasLeft)]\nunconstrained fn da_gas_left_opcode() -> Field {}\n\n#[oracle(avmOpcodeNoteHashExists)]\nunconstrained fn note_hash_exists_opcode(note_hash: Field, leaf_index: Field) -> u8 {}\n\n#[oracle(avmOpcodeEmitNoteHash)]\nunconstrained fn emit_note_hash_opcode(note_hash: Field) {}\n\n#[oracle(avmOpcodeNullifierExists)]\nunconstrained fn nullifier_exists_opcode(nullifier: Field, address: Field) -> u8 {}\n\n#[oracle(avmOpcodeEmitNullifier)]\nunconstrained fn emit_nullifier_opcode(nullifier: Field) {}\n\n#[oracle(avmOpcodeEmitUnencryptedLog)]\nunconstrained fn emit_unencrypted_log_opcode(message: [Field]) {}\n\n#[oracle(avmOpcodeL1ToL2MsgExists)]\nunconstrained fn l1_to_l2_msg_exists_opcode(msg_hash: Field, msg_leaf_index: Field) -> u8 {}\n\n#[oracle(avmOpcodeSendL2ToL1Msg)]\nunconstrained fn send_l2_to_l1_msg_opcode(recipient: EthAddress, content: Field) {}\n\n#[oracle(avmOpcodeCall)]\nunconstrained fn call_opcode<RET_SIZE>(\n gas: [Field; 2], // gas allocation: [l2_gas, da_gas]\n address: AztecAddress,\n args: [Field],\n // TODO(5110): consider passing in calldata directly\n function_selector: Field\n) -> ([Field; RET_SIZE], u8) {}\n// ^ return data ^ success\n\n#[oracle(avmOpcodeStaticCall)]\nunconstrained fn call_static_opcode<RET_SIZE>(\n gas: [Field; 2], // gas allocation: [l2_gas, da_gas]\n address: AztecAddress,\n args: [Field],\n // TODO(5110): consider passing in calldata directly\n function_selector: Field\n) -> ([Field; RET_SIZE], u8) {}\n// ^ return data ^ success\n\n#[oracle(avmOpcodeStorageRead)]\nunconstrained fn storage_read_opcode<N>(storage_slot: Field, length: Field) -> [Field; N] {}\n\n#[oracle(avmOpcodeStorageWrite)]\nunconstrained fn storage_write_opcode<N>(storage_slot: Field, values: [Field; N]) {}\n\nstruct FunctionReturns<N> {\n values: [Field; N]\n}\n\nimpl<N> FunctionReturns<N> {\n pub fn new(values: [Field; N]) -> FunctionReturns<N> {\n FunctionReturns { values }\n }\n\n pub fn assert_empty(returns: FunctionReturns<0>) {\n assert(returns.values.len() == 0);\n }\n\n pub fn raw(self) -> [Field; N] {\n self.values\n }\n\n pub fn deserialize_into<T>(self) -> T where T: Deserialize<N> {\n Deserialize::deserialize(self.raw())\n }\n}\n"}}}
|