@aztec/protocol-contracts 0.46.3 → 0.46.4
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/GasToken.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"transpiled":true,"noir_version":"0.31.0+97ecff5ea76a0da878bdccc453b121147f726ec4","name":"GasToken","functions":[{"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":"7ZztahtXEIbvRb9N2XfmzPnwrZRSlMQpAiOHWCkUk3uvVWu3NlIiYsQjLUf/LGl2Z94xD0eIh31afLr78O2vP1frzw+Pi9vfnxb3Dx+Xm9XD+vnV02L4TcN/7z5+Wa63bzxull83i1uXDzeLu/Wn7Z85f79ZfF7d3y1urcX3m71qFc+7apU6TNWK4UB1uKdddXhuU/XBW4eaj8WmI8U1hrIrrpH8dfEfN9us1lHW1FHW6Chr7ihr6Shr7Shr47OqTVnL8PPxSx3vXLafT2MML9PbMOvpNevpbdbT+6ynT7OePmY9fb7s6bNP0+c30+/XNh/v214dOodrS9Tpvun/Wt8tpVyXsr+UCz9bz7IUv/BD7zxLufDT6DxLufBD7jxLufCz8zxLuR7JB5ZyPZIPLKVel7K/lOv3lP2lpOM/LZS3S3m5zN53mb/vsvS+y35wiNTxpyI3P/oPtzyuT650sT9wpdJR1tpR1tZP1hg6yqqOshqf9RcOXrU0nektXv0U5uP8PvP508znj5nPn2c+f5n5/Kf4vuCuaf6U38z/0qQBTfJANBHRxIgmTjRJRJMgmmSiSSGaEMRngvhCEF8I4gtBfCGILwTxhSC+EMQXgvhCEF8I4itBfCWIrwTxlSC+EsRXgvhKEF8J4itBfCWIbwTxjSC+EcQ3gvhGEN8I4htBfCOIbwTxjSBew4B0EdLFkC6OdElIl0C6ZKRLQbpUpAvCvhD2hbAvhH0h7AthXwj7QtgXwr4Q9oWwbwj7hrBvCPuGsG8I+4awbwj7hrBvCPuGsO8I+46w7wj7jrDvCPuOsO8I+46w7wj7jrCfEPYTwn5C2E8I+wlhPyHsJ4T9hLCfEPYTwn4g7AfCfiDsB8J+IOwHwn4g7AfCPqLrCfH1hAh7Qow9IcqeEGdPiLQnxNoTou0J8faEiHtCzD0h6p4Qd0+IvCfE3hOi7wnx94QIfEIMPiEKnxCHT4jEJ8TiE6LxCfH4hIh8Qkw+ISqfEJdPiMwnxOYTovMJ8fmECH1CjD4hSp8Qp0+I1CfE6hOi9Qnx+gzx+gzx+gzx+gzx+mxISJdAumSkS0G6VKQLwj7i9Rni9Rni9Rni9Rni9Rni9Rni9Rni9Rni9Rni9Rni9Rni9Rni9Rni9Rni9Rni9Rni9Rni9Rni9Rni9Rni9Rni9Rni9Rni9Rni9Rni9Rni9Rni9Rni9Rni9Rni9Rni9Rni9Rni9Rni9Rni9dlJvL4YxgdqKfLRx29ljU9WjZxjqj5460hlKo7hSHHNNj4GrOa3D/bahS09ha09hW0dhT2J8zmbsOoprPcUNvUUNnoK29OXiujpS8VJ9Oko47OilS1fcNjWUdiTyOSzCauewlpPYb2nsKmnsNFT2NxT2NJH2OcXfy+/rpYf7u8eny/ZfvZt/XGzeljvXm7++fLyyXPtvw=="},{"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":"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":"ndpRattAGIXRveg5FN/fmhkpWymlOIlTDMEJsVMoJnuv3dIF9LxpJN237+kwl+lp//Dx4/vh+Px6mu6/XqaX18fd+fB6vJ4u0+ZLLX/ent52x9uL03n3fp7ut33cTfvj0/Vp1Ofd9Hx42U/3tbbPb3e30Qqj7UZGkVHJaCujWUZNRl1GQ0ZSxFaKmKWIWYqYpYhZipiliFmKmKWIWYqYpYhZimhSRJMimhTRpIgmRTQpokkRTYpoUkSTIroU0aWILkV0KaJLEV2K6FJElyK6FNGliCFFDCliSBFDihhSxJAihhQxpIghRQwpYpEiFilikSIWKWKRIhYpYpEiFilikSIWKWKVIlYpYpUiVililSJWKWKVIlYpYpUiVikimw2tQqui1ZZWM60arTqtBq0WWlEboTZCbYTaCLURaiPURqiNUBuhNkJtFLVR1EZRG0VtFLVR1EZRG0VtEGiGRDNEmiHTDKFmSDVDrBlyzRBshmQzRJsh2wzhZkg3Q7wZ8s0QcIaEM0ScIeMMIWdIOUPMGXLOEHSGpDNEnSHrDGFnSDtD3BnyzhB4hsQzRJ4h8wyhZ0g9Q+wZcs8QfIbkM0SfIfsM4WdIP0P8GfLPEICGBDREoCEDDSFoSEFDDBpy0BCEhiQ0RKEhCw1haEhDQxwa8tAQiIZENESiIRMNoWhIRUMsGnLRIhctctEiFy1y0SIXLXLRIhctctEiFy1y0SIXLXLRIhctctEiFy1y0SIXLXLRIhctctEiFy1y0SIXLXLRIhctctEiFy1y0bKLnuSiRS5a5KJFLlrkokUuWuSi9d8uej393L0fdg8v+9vd3tvHj+Pjv6u+1+P519vfL9d/fwM="},{"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":"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"}}],"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"}}],"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"}},{"name":"is_infinite","type":{"kind":"boolean"}}],"kind":"struct","path":"std::embedded_curve_ops::EmbeddedCurvePoint"}},{"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":"target","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"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"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::call_context::CallContext"}},{"name":"function_data","type":{"fields":[{"name":"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_private","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_data::FunctionData"}},{"name":"args_hash","type":{"kind":"field"}},{"name":"returns_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":"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":"7dzdbhzHEYbhe+GxEHT9d+tWgiCQbTkgIFCGRQcIBN17VjF3lgLHXhpZFPl6fSZK7amqMcvf0mg9n29+eP/dL//65+3djx8/3bz9++ebDx+/f3d/+/Hu8NXnm/E3kf/97qef3t19/Y1P9+9+vr95G6L15ub93Q9ffxn25c3Nj7cf3t+81RVf3jw57br04bSbzO20187hivlwtpafHmxf/vHmazv6utrx19VOvK528nW1Uxdox6y2djwet/NrjdlQY12iRvlWY44nNXRcpIadaqynNbShhu3XmHKsocPP1Fh2/K5a8/QNKL53VmI8nJU1H30Hjr3n+jp2sSJO/w7U5aF5Jzcf5OaT3HyRm5/g5m2Qmxdy80punhxSRg4pI4eUkUPKyCFl6JBa4OadnLB+gYSVkccfeER0nGn/2Pw489Qa2w/OGo+e+fBTlBu1cac2HtTGk9p4URuf1MYXtPEY1MapARRKbZyanEFNzqAmZ1CTM6jJGdTkDGpyJjU5k5qcSU3OpCZnUpMzqcmZ1ORManImNTmTmpxFTc6iJmdRk7OoyVnU5CxqchY1OYuanEVNzqIm56Qm56Qm56Qm56Qm56Qm56Qm56Qm56Qm56Qm56Qm56Im56Im56Im56Im56Im56Im56Im56Im56Im56ImpwxqdMqgZqcManjKoKanDGp8yqDm56EotnNqgsqgRqgMbIYKNkMFm6GCzVDBZqhgM1SwGSrYDBVshgo2QwWboYrNUMVmqGIzVLEZegkq54U6x2aoYjNUsRmq2AxVbIYaNkMNm6GGzVDDZuglJJ8X6hyboYbNUMNmqGEz1LAZ6tgMxaI94tgMxXpDggWHBCsOCZYcEqw5JFh0SLDqkGDZIcG6Q4KFhwQrDwmWHhKsPSRYfEiw+pBg+SHB+kOCBYgEKxAJliASrEEkWIRIsAqRYBkiwTpEgoWIBCsRCZYiEqxFJFiMSLAakWA5IsF6RIIFiQQrEgmWJBKsSSRYlEiwKpFgWSLBukSChYkEKxMJliYSrE0kWJxIsDqRYHkiwfpEggWKBCsUCZYoEqxRJFikSLBKkWCZIsE6RYp1ihTrFCnWKVKsU3RoC9s5NUMV6xQp1ilSrFOkWKdIsU6RYp0ixTpFinWKFOsUKdYpUqxTpFinSLFOkWKdIsU6RYp1ihTrFCnWKVKsU6RYp0ixTpFinSLFOkWKdYoU6xQp1ilSrFOkWKdIsU6RYp0ixTpFinWKFOsUKdYpUqxTpFinSLFOkWKdIsU6RYp1ihTrFCnWKVKsU6RYp0ixTpFinSLFOkWKdYoU6xQp1ilSrFOkWKdIsU6RYp0ixTpFinWKFOsUKdYpUqxTpFinSLFOkWKdIsU6RYp1ihTrFCnWKVKsU6RYp0ixTpFinSLFOkWKdYoU6xQp1ilSrFOkWKdIsU6RYp0ixTpFinWKFOsUKdYpUqxTpFinSLFOkWKdIsU6RYp1ihTrFCnWKVKsU6RYp0ixTpFinSLDOkWGdYoM6xQZ1imyQc1QwzpFhnWKDOsUGdYpMqxTZFinyLBOkWGdIsM6RYZ1igzrFBnWKTKsU2RYp8iwTpFhnSLDOkWGdYoM6xQZ1ikyrFNkWKfIsE6RYZ0iwzpFhnWKDOsUGdYpMqxTZFinyJ7hFImc7bzq1Ll8U+Xp6Ti8reOzLdd2evfRIctOjZw5PGMc+5jh9vjww7B5TcPWNQ07r2nYdUXDPoNpuviwsrZha/x+/5J1/E/x4ZenYdW2AYQ+gNIHMPoATh8g6APkKx8gZBtgjm8GeHradenDaT/8r+Xt9G4fFdsHyPXoI6wdX0z99WL2X8z668Xsvph47YH+Yi/mtX9QeLEX89o/gPyhF3P4wWx7MR6PX8zDtK/908plp/U/1bTl27SPTp+mfe2fg/7gtHaadu1Me/5Dk9qZaX2uOBZZY69IXaDI0rkVsblTZHYUWZcosn2SPfxyp8gztKlnFMm1FZm1U0T+/yIx5DhJDPWdInrhIqY7RewSRbatipF7RbyjSFyiyJxbkbX33ZUdRaqjyOwoshqK1OgoIh1FtKOIdRTxjiIdG18dG18dG18dG18dGz87Nn52bPzs2PjZsfGzY+Nnx8bPjo2fHRs/OzZ+dmz86tj41bHxq2PjV8fGr46NXx0bvzo2fnVs/OrY+NWw8T5GRxHpKKIdRayjiHcUiY4i2VGkOorMjiIdGy8dGy8dGy8dGy8dGy8dGy8dGy8dGy8dGy8dGy8dG68dG68dG68dG68dG68dG68dG68dG68dG68dG68dG28dG28dG28dG28dG28dG28dG28dG28dG28dG28dG+8dG+8dG+8dG+8dG+8dG+8dG+8dG+8dG+8dG+8dGx8dGx8dGx8dGx8dGx8dGx8dGx8dGx8dGx8dGx8dG58dG58dG58dG58dG58dG99x58477tx5x50777hz5x137rzjzp133Lnzjjt33nHnzjvu3HnHnTvvuHPnHXfuvOPOnXfcufOOO3fecefOO+7cecedO++4c+cdd+68486dd9y58447d95x58477tx5x50777hz5x137rzjzp133Lnzjjt33nHnzjvu3HnHnbvouHMXHXfuouPOXXTcuYvhHUWio0h2FKmOIrOjSMfGd9y5i447d/Ebd+705Hpp1Jkiy4411jyV2PcJJTZR51E7amPvuYePOccHRzz6a+cux+4N3b2juw9094nuvtDdT3T3i9z9b9wdpXQv6O7RWavorFV01io6axWdtXqBrH0Rwzt0Yjtf1M5tYDsXbOeK7dywnTu288B2ntjOsRlq2Aw1bIY6NkMdm6GOzVDHZqhjM9SxGerYDHVshjo2Qx2boYHN0MBmaGAzNLAZGtgMDWyGBjZDA5uhgc3QwGZoYjM0sRma2AxNbIYmNkMTm6GJzdDEZmhiMzSxGVrYDC1shhY2QwuboYXN0MJmaGEztLAZWtgMLWyGTmyGTmyGTmyGTmyGTmyGTmyGTmyGTmyGTmyGTmyGLmyGLmyGLmyGLmyGLmyGLmyGLmyGLmyGLmyGLmqG5qBmaA5qhuagZmgOaobmoGZoDmqG5qBmaA5qhuagZmgObIYKNkMFm6GCzVDBZuglbKMX6hyboYLNUMFmqGAzVLAZqtgMVWyGKjZDFZuhlzCLXqhzbIYqNkOxTlFinaLEOkWJdYoS6xQl1ilKrFOUWKcosU5RYp2ixDpFiXWKEusUJdYpSqxTlFinKLFOUWKdosQ6RYl1ihLrFCXWKUqsU5RYpyixTlFinaLEOkWJdYoS6xQl1ilKrFOUWKcosU5RYp2ixDpFiXWKEusUJdYpSqxTlFinKLFOUWKdosQ6RYl1ihLrFCXWKUqsU5RYpyixTlFinaLEOkWJdYoS6xQl1ilKrFOUWKcosU5RYp2ixDpFiXWKEusUJdYpSqxTlFinKLFOUWKdosQ6RYl1ihLrFCXWKUqsU5RYpyixTlFhnaLCOkWFdYoK6xTVoGZoYZ2iwjpFhXWKCusUFdYpKqxTVFinqLBOUWGdosI6RYV1igrrFBXWKSqsU1RYp6iwTlFhnaLCOkWFdYoK6xQV1ikqrFNUWKeosE5RYZ2iwjpFhXWKCusUFdYpKqxTVFinqLBOUWGdosI6RYV1igrrFBXWKSqsU1RYp6iwTlFhnaLCOkWFdYoK6xQV1ikqrFNUWKeosE5RYZ2iwjpFhXWKCusUFdYpKqxTVFinqLBOUWGdosI6RYV1igrrFBXWKSqsU1RYp6iwTlFhnaLCOkWFdYoK6xQV1ikqrFNUWKeosE5RYZ2iwjpFhXWKCusUFdYpKqxTVFinqLBOUWGdosI6RYV1igrrFBXWKSqsU1RYp6iwTlFhnaLCOkWFdYoK6xQV1ikqrFNUz3CKKs91bpLHzi3nN1Weno70Oj4707fT+4/2dexfQk4DqO2ddl/HRjxEttPHaeczbCPStPPMtNI/rYzTtPH704bXdjjGmcMz9fhqZtZ4fPhhWL2mYe2ahvVrGjauadi8pmHrmoad1zTsuqJhZVzHsIcv/v3u59t33314/+nwj3z9s1/uvr+//Xj38OX9f3769U8OZ/8L"},{"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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"},{"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"}}],"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"}}],"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"}},{"name":"is_infinite","type":{"kind":"boolean"}}],"kind":"struct","path":"std::embedded_curve_ops::EmbeddedCurvePoint"}},{"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":"target","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"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"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::call_context::CallContext"}},{"name":"function_data","type":{"fields":[{"name":"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_private","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_data::FunctionData"}},{"name":"args_hash","type":{"kind":"field"}},{"name":"returns_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":"7L3djiRLkpz5Ln1NDNzM1f/4KovFgrtDLggQw8WSe0XMu2+e7grPrD7hZRZ1JNLEVeSKzUFUluknddxENNJV/9ff/vU//5//3//9f/zXf/sv//1//O0//m//62//7b//X//pf/7X//5vH/+///W3En//v/2P/+c//dsf/9//8T//0//7P//2H6f/8Lf//G//+vH//vt/+Nt/+a//7T//7T/WY/n3//Cnz9W1HD8+Wtco56dLrU8+PW9Rf3x63qej8ekjjvLj08eyfDnJx9/zv/+Hv5Xlrgdfv+/gUbbHUaLO5S8efPsrB5/3Op0Ml/X89BF//9n7G3/28exnl9iWH3+mLFNt/A1lOrGXadk/Qcb0x19RJ8RfsdXzrzjmn/6KJ5/e9/nx72Bav2q1P/t0nePxs+cpvpxkfvLp9Tz2vn79bLz+b6YWcjDlC5jSAlOWePzssn35j+/5p1to6vejKZ9otiaaKJ8nqfOXk5Rnxa7lAfJY1/pTsc8eqOvjsVS287Pzs0NHLdvnI2z+9YfrfvKo+9H4cJnWU/uPfwdfP/yHPLPlYZYnLA+zPAtWno9L90937lMfVZb5Aaes29z4K474/Bt+wn78/W94anjKNn1eAsvP1uSPP/TUyZRjLuc/nrK0jrXM9fPm+DzX02sGak7rcefTz9M3nx7qr+eCOP1+nn6dtq+n/+NvqIi/YT1+8TfMgL9hLfvjb9hr+bUCtcznc6iW5Sj/ZP7n+PYDrZ/3RFnXnw705N9/fEaXWL/eQc+e/Nv2qHXbP2NO+VHqolPqqlPqplPqrlPqIVNqTDqlFp1Sq06pM3mpy/r49PzVkV2V+giE+5fUVtdnP/kjQZ1dz61+yUd/xM4XIYYh/nWI7A7vFhDZveMtILK70ltAZPe7t4DI7qTvAHFh9+i3gMju/m8BkT1X3AKibmLZlvNbqW1bfoL4B5gwmOdgdJNFA4xuWmiA0U0ADTC6rr4BRtep/xrMquu+G2B0HXUDjK5L3qfzV4j2uv4JjK7zbYAJg3kORtf5NsDoOt8GGF3n2wCj63wbYHSd76/BbLrOtwFG1/k2wLA73zX2E8y6NMDM8Umx/ATmj1LZvSyw1NApld1vAktld5DAUtk9IbBUdpcHLJXdt+FK3dmdGLBUdm8FLHWAWzrfiKpl3+uvS63zXh6v63387y8v1v/ji+x9pj//9nn+oy7/fP5gP/8xP6x5jan8if9Cfv6Yztc9P/73tv3z+Vf289fpfOU26pe3in+cf6M//76f55+X+s/n39nPf6znv59livmfz3+Qn3+Zzvc961K2f/7v9/j+W/0437v4+N/xpwMVtgN9/w15HKcZ+Pivv2EGvh5/Kp8fLts/jj/f+/hP78ePH7ucf2gpjePvZXn8FR/9on9+gh5Pb7CP/8zO/2w+PFbjb1jPO3JdP99Qn6e3j4o61u89PPR19mNrHn5v/dOcy/lXzB9/8us/zT/+hh3xN2zzL/6GA/A31PpQYI4y/fo/r7Ks0+Nfc1n2n//z+jhQmSa6ExW6E1W6E810Jwq6Ey10J1rpTrTRnWinOxHdM7vQPbML3TO70D2zC90zu9A9swvdM7vQPbML3TO70D2zC90zu9I9syvdM7vSPbMr3TO70j2zK90zu9I9syvdM7vSPbMr3TN7pntmz3TP7JnumT3TPbNnumf2TPfMnume2TPdM3ume2bPdM/soHtmB90zO+ie2UH3zA66Z3bQPbOD7pkddM/soHtmB90ze6F7Zi90z+yF7pm90D2zF7pn9kL3zF7ontkL3TN7oXtmL3TP7JXumb3SPbNXumf2SvfMXume2SvdM3ule2avdM/sle6ZvdI9sze6Z/ZG98ze6J7ZG90ze6N7Zm90z+yN7pm90T2zN7pn9kb3zN7pntk73TN7p3tm73TP7J3umb3TPbN3umf2TvfM3ume2TvdM/uge2YfdM/sg+6ZfdA9sw+6Z/ZB98w+6J7ZB90zG/JeI/ZEbM/sSvceZKV7D7LSvQdZ6d6DrBPbM7vSvQdZ6d6DrHTvQVa69yAr3XuQle49yEr3HmSlew+y0r0HWeneg6x070FWuvcgK917kJXuPchK9x5kpXsPstK9B1np3oOsdO9BVrr3ICvde5CV7j3ISvceZKV7D7LSvQdZ6d6DrHTvQVa69yAr3XuQle49yEr3HmSlew+y0r0HWeneg6x070FWuvcgK917kJXuPchK9x5kpXsPstK9B1np3oOsdO9BVrr3ICvde5CV7j3ISvceZKV7D7LSvQdZ6d6DrHTvQVa69yAr3XuQle49yEr3HmSlew+y0r0HWeneg6x070FWuvcgK917kJXuPchK9x5kpXsPstK9B1np3oOsdO9BVrr3IOuA9yD3uZ4nOkr86UTf/sxep/mxXeTjf/9pOU39/vcgmyf69mf2us3nv6N12+qfTrR9/4mOzxPt8/GnE337M3vdl/3zRMefT/Ttz+xtKuea7m3a538+0fe/B7mVqZwnKl/2Zj5O9O3P7G3bjvNE+7L+6UTf/sze9uNTteP40zMb/h7k142Y89MPx+Ozy+fyxv34x2meP69jelD98HNz4zT7uQltX79+dnt2GOTurnrxvuRdTr9+7+mhq8fqxXuYX09/1Na/41/uHqsXL1a++Ff8avlYvXhT8rW/AurpLt6UHHmiQneiSneime5EQXeihe5EK92JNroT7XQnYntmzxPbM3ue2J7Z88T2zJ4ntmf2PLE9s+eJ7Zk9T2zP7Hlie2bPE9sze57ontmF7pld6J7Zhe6ZXeie2YXumV3ontmF7pld6J7Zhe6ZXeie2ZXumV3pntmV7pld6Z7Zle6ZXeme2ZXumV3pntmV7pld6Z7ZM90ze6Z7Zs90z+yZ7pk90z2zZ7pn9kz3zJ7pntkz3TN7pntmB90zO+ie2UH3zA66Z3bQPbOD7pkddM/soHtmB90zO+ie2QvdM3uhe2YvdM/she6ZvdA9sxe6Z/ZC98xe6J7ZC90ze6F7Zq90z+yV7pm90j2zV7pn9kr3zF7pntkr3TN7pXtmr3TP7JXumb3RPbM3umf2RvfM3uie2RvdM3uje2ZvdM/sje6ZvdE9sze6Z/ZO98ze6Z7ZO90ze6d7Zu90z+yd7pm90z2zd7pn9k73zKZ7D3Kmew9ypnsPcqZ7D3Kmew9ypnsPcqZ7D3Kmew9ypnsPcqZ7D3Kmew8y6N6DDLr3IIPuPcigew8yJrZndtC9Bxl070EG3XuQQfceZNC9Bxl070EG3XuQQfceZNC9Bxl070EG3XuQQfceZNC9Bxl070EG3XuQQfceZNC9Bxl070EG3XuQQfceZNC9Bxl070EG3XuQQfceZNC9Bxl070EG3XuQQfceZNC9Bxl070EG3XuQQfceZNC9Bxl070EG3XuQQfceZNC9Bxl070EG3XuQQfceZNC9Bxl070EG3XuQQfceZNC9Bxl070EG3XuQQfceZNC9Bxl070EG3XuQQfceZNC9Bxl070EG3XuQQfceZNC9Bxl070HGgPcgf719LL7/PcjGrq/4/vcgmyf69md2Y/tYfP97kI3tY/H970E2to/F978H2dg+Ft//HmRj+1h8/3uQje1j8f3vQTa2jwX8Pci/sn0sLt6B3JbHE6zudWqc5ljOO+FYlto4DXKBV1y8MPm+40M3eMXF25UvHn8/j79O29fj//2v2BB/xXr86q/YAX/FWh5P3+Mno/NMhFrm9fFvuv5hQ/7039jx7Sday/mzy7r+dKIn/xFEnc7/fr9sjSsf/y7+/OltexS77Z8PuPKj1os3K3PWWoRqrUK1zkK1hlCti1Ctq1Ctm1CtO3mty3quV/1qzq5qfQSHvXxyqWtchPQzydQvmaRsr1Nkd2S3oHiwe717UGR3kfegyO5P70GR3fneg2KYIoAiu1u/B0X2HHAPiuwJ4x4UdbPLtsRJcVt+ovh3Mrp55Ndklkk3Y7TI6OaGFhndLNAio+vvW2TCZC7I6PrwFhldb90io+uX9+n8fZu9rn8mo+uBW2R0PXCDTNH1wC0yuh64RUbXA7fI6HrgFpkwmQsyuh64RUbXA7fIsHvgNfaTzJdfnn9OZo5PjOUnMn+vld3VImtl96nAWiu780TWyu4lkbWyu0Nkrex+D1lrCNXK7smQtbK7LGStA3zT+RZVLftef11rnfeyPj4+78v+9eN/L2CnL2D7LOCoy58KONgLOOaHT68xlT8pME/kBcQ0r58FbNufCijsBdSpngXUbfpTAZW+gH0/C5iX+qcCZvYCjvX8J/Tx7eX8pwKCvICPr0LOf0IfYfnP/xF///1+nO9pfPzv+POJVroTff9deRznz/54BjR8wdfzT+Xzw2X7cf791ucvx7887was+/l7cF/+ihLTjz/1PFc3/1T5rT9Vf+tPzS//qbn8y/Peevn8L72Un16yX//+5+Z/eW6ZyvY5ceL4p97djz93/N6fe24QOv5c+c0/V3/jzx3xL8+fONv+eM5ux5e+47w9/tT2W39q/60/dfzOn3o+R7X5p8pv/an6W39q/q0/Fb/1p5bf+lO/9W8jfuvfRvzWv434rX8by2/921h+69/G8lv/Npbf+rex/Na/jeW3/m0sv/VvY/mtfxvLb/3bWH7r38b6W/82ns9u25bj/FPbsz9VX/9T2+/dgMcfd/tT+Pv0cCvH8TndrMyff2z/vT92/NYfe+5b2n+s/N4fq7/3x+bf+2PxXLnPGVNT1J/+4DO/eH7bWI4vb0DUPzT/s5s6+0jr/OXNin/0wf5+pIXvSCvfkTa+I+3vPdLjrzm+5a+5cMvwv6Z8z19Tv+evmb/nr4nv+WuW7/lr1u/5a7bv+WsAT4E6xXJ2II6p8WAq5fx0KV/ayvUo56EOwkPF9N2H2vaHj9vLz4/wV34r6HH8cu/j13sff7738ePex1/uffz13sff7n38/d7HP259/OXet+5y71t3ufetu9z71l3ufesu9751l3vfusu9b93l3rfucu9bd733rbve+9Zd733rrve+ddd737or9XN/OVdZLPH8+NTP/ebxN+onz3Lu61nW7enxqZ887eNTP3nax6d+8rSPT+3328en9vvt41M/95vfRm/Uz/328an9fvP4O7Xfbx+f+tZtH5/61m0fn/rWbR+f+tZtH5/61m0fn/rWbR//3rfufu9bd7/3rXt8/637yuyYsj4+XMr25ZeHPn8l5ih3L6DevYD57gXE3QtY7l7AevcCNp4CHkfa+Y6EuCtLOVculzUaRyqlfkr35b3gWh/SzdPEeKjy3YdCfgEwT/Xex5/vffy49/GXex9/vffxt3sff7/38Y9bH79M9z7+vW/dcu9bt9z71i33vnXLvW/dcu9bt9z71i33vnXLvW/deu9bt9771q33vnXrvW9dxDSKkce/961b733r1nvfuvXet2699607Uz/3W78lPM/Uz/328amfPK3flJxn6idP+/jUT5728amfPM3jB7Xfbx+f2u+3j0/93G/9ws8c1M/99vHj3sen9vvt41Pfuu3jU9+67eNT37rt41Pfus3jL9S3bvv41Ldu+/j3vnWXe9+6kCkgA4///bfuK79eOO2fvw42ffklu89fB1vWuxew3b2A/e4FHDcvYJ3uXkC5ewGVu4AzuX8UUH4q4NlPPje0fBlKW47zzlhnpWJDqVhuN/DTL4c//++Q2w10FMDtBjoK4HYDHQVwu4F2ARu3G+gogNsNdBTA7Qba79hs3Dd8RwHct3ZHAUQ38eNIRHfr40iQ2/LLOscvW1wvXlA790qWJZ4eaec70vHdR4L+Nglk+s3A45d7H7/e+/jzvY8f9z7+cu/jr/c+/nbv4+/3Pv69b93j3rfuce9b97j3rXvc+9aFTL0ZePx737rHvW/d49637nHvW/e49a0b061v3ZhufevGdOtbN6Zb37ox3frWjenWt25Mt751Y7r1rRvTrW/dmO596xbq537rhb8o1M/99vGpnzytl56iUD952senfvK0j0/9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50Vq7nmRmntepOaeF6m550Vq7nmRmntepOaeF6m550Vq7nmRmntepOaeF6m550Vq7nmRmntepOaeF6m550Vq7nmRmntepOaeF6m550Vq7nmRmntepOaeF6m550Vq7nmRmntepOaeF6m550Vq7nmRmntepOaeF6m550Vq7nmRmntepOaeF6m550Vq7nmRmntepeaeV6m551Vq7nmVmntep5CqVslLVam551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7vksNfd8lpp7PkvNPZ+l5p7PU0hVq+SlZqm557PU3PNZau75LDX3fJaaez5LzT2fpeaez1Jzz2epueez1NzzWWru+Sw193yWmns+Z5qNfWz18eFtfl5tovu2o9pEz+Rj388Pb8+rTfRM7qg20TO5o9pEz+SOahPl23a1meYnd1Sb6b5tV5vpvm1XmyjfdlQbUtVKealM85M7qr2tlzoruK0/Oiug9jwf56jLeZBpXxv/5q5/9qNe7knHb6iX2ve8oV5q5/OGeqm9zxvqDbF6qf3PG+qldkBvqJfaA72hXmrH9IZ6xfwV9/TjN9Qr5q+4JyC/oV4xf8U9BfkN9Yr5K+5JyG+oV8xfcU9DfkO9Yv6KeyLyG+oV81fcU5HfUK+Yv+KejPyGesX8Ffd05DfUK+avuCckv6FeMX/FPVv21XqXePyu6hIX9aa6jzrqTfW8WpbH71gs6/PfseCeQvqGelM9r9r1ck8ifUO9qfJgR72p8mBHvanu37WsPz69zvV5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pq05HdVKealMG2I6qpXyUpm2oXRUK+WlMm3+6KhWyktl2nLRUa2Ul8q00aGjWikvlWl7QUe1Ul4q06T+jmqlvFSmifcd1Up5qUxT6TuqlfJSmSbHd1Qr5aUyTXfvqFbKS2WawN5RrZSXyjQlvaNaKS8lNfd8k5p7vknNPd+k5p5vUnPPN6m555vU3PNNau75JjX3fJOae75JzT3fpOaeb1Jzzzepueeb1NzzTWru+SY193yTmnu+S80936Xmnu9Sc893qbnn+xRS1Sp5qV1q7vkuNfd8l5p7vkvNPd+l5p7vUnPPd6m557vU3PNdau75LjX3fJeae75LzT3fpeae71Jzz3epuee71NzzXWru+S4193yXmnu+S80936Xmnu9Sc893qbnnu9Tc811q7vkuNfd8l5p7vkvNPd+l5p7vUnPPd6m557vU3PNdau75LjX3fJeae75LzT3fpeae71Jzz3epuee71NzzXWru+S4193yXmnu+S80936Xmnu9Sc893qbnnu9Tc811q7vkuNfd8l5p7vkvNPd+l5p7vUnPPd6m557vU3PNdau75LjX3fJeae75LzT3fpeae71Jzz3epuee71NzzXWru+S4193yXmnu+S80936Xmnu9Sc893qbnnu9Tc811q7vkuNfd8l5p7vkvNPd+l5p7vUnPPd6m557vU3PNdau75LjX3fJeae75LzT3fpeae71Jzz3epuee71NzzXWru+S4193yXmnu+S80936Xmnu9Sc88Pqbnnh9Tc80Nq7vkhNff8mEKqWiUvdUjNPT+k5p4fUnPPD6m554fU3PNDau75ITX3/JCae35IzT0/pOaeH1Jzzw+pueeH1NzzQ2ru+SE19/yQmnt+SM09P6Tmnh9Sc88Pqbnnh9Tc80Nq7vkhNff8kJp7fkjNPT+k5p4fUnPPD6m554fU3PNDau75ITX3/JCae35IzT0/pOaeH1Jzzw+pueeH1NzzQ2ru+SE19/yQmnt+SM09P6Tmnh9Sc88Pqbnnh9Tc80Nq7vkhNff8kJp7fkjNPT+k5p4fUnPPD6m554fU3PNDau75ITX3/JCae35IzT0/pOaeH1Jzzw+pueeH1NzzQ2ru+SE19/yQmnt+SM09P6Tmnh9Sc88Pqbnnh9Tc80Nq7vkhNff8kJp7fkjNPT+k5p4fUnPPD6m554fU3PNDau75ITX3/JCae35IzT0/pOaeH1Jzzw+pueeH1NzzQ2ru+SE19/yQmnt+SM09P6Tmnh9Sc88Pqbnnh9Tc80Np7vk2Kc09/6hWyEt9VCvkpT6qFfJSH9WGVLVCXuqjWiEv9VGtkJf6qFbIS31UK+WllOaef1Qr5aWU5p5/VCvlpZTmnn9UK+WllOaef1Qr5aWU5p5/VCvlpZTmnn9UK+WllOaef1Qr5aWU5p5/VCvlpZTmnn9UK+WllOaef1Qr5aWU5p5/VCvlpZTmnn9UK+WllOaef1Qr5aWU5p5/VCvlpZTmnn9UK+WllOaef1Qr5aWU5p5/VCvlpZTmnn9UK+WllOaef1Qr5aWU5p5/VCvlpZTmnn9UK+WllOaef1Qr5aWU5p5/VCvlpZTmnn9UK+WllOaef1Qr5aWU5p5/VCvlpZTmnn9UK+WllOaef1Qr5aWU5p5/VCvlpZTmnn9UK+WllOaef1Qr5aWU5p5/VCvlpZTmnn9UK+WllOaef1Qr5aWU5p5/VCvlpZTmnn9UK+WllOaef1Qr5aWU5p5/VCvlpZTmnn9UK+WllOaef1Qr5aWU5p5/VCvlpZTmnn9UK+WllOaef1Qr5aWU5p5/VCvlpZTmnn9Uq+SlitTc8yI197xIzT0vUnPPP2qRqlbJSxWpuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XjLNxv449XSeuh6Nn/3KOeZ5Xn58eJ738nmOY/mLP7lO9fHhOm1f2JXp2U/ej/Mn18ZPXqL++OwS83PtE7kPa/+i9om8mLV/Ufuw9rLaJ/Lp1v5F7ROlFmv/ovaJMpy1f1H7RInW2r+ofaLvSqz9S9rXTJtJrP2L2ruvp6u9+3pZtd8fMJZjea69+3q62oe1l9XefT1d7d3Xy6r99qn9+lx79/V0tXdfT1d79/Vktc+0Jc/av6i9+3q62ruvl1X75fF7usu6PdfefT1d7cPay2rvvp6u9u7r6Wrvvp6u9u7r6Wrvvp6s9pk2Nlv7F7V3X09Xe/f1dLV3X09X+7D2stq7r6ervft6utq7r6ervft6utq7ryer/ey+nq727uvpau++nq727uvpah/WXlZ79/V0tXdfT1d79/V0tXdfT1d79/VktQ/39XS1d19PV3v39XS1d19PV/uw9rLau6+nq737errau6+nq737errau68nq/3ivp6u9s73Q7UvRzwkKscxI7Vv7s1YwtrLau98r6u9872u9s73uto73+tq73wvq/3qfK+rvX9vR1d7/96Orvbu6+lqH9Y+qfbN3Yir+3q62ruvp6u9+3q62ruvl1X75o601X09We039/V0tXdfT1d79/V0tXdfT1f7sPZJtW/+nu7mvp6u9u7r6Wrvvp6u9u7r6Wrvvp6s9rv7errau6+nq737errau6+nq31Ye1nt3dfT1d59PV3t3dfT1d59PV3t3deT1f5wX09Xe/f1dLV3X09Xe/f1dLUPay+rvft6utq7r6ervft6utq7r6ervft6qtrPk/t6utq7r6ervft6utq7r6erfVh7We3d19PV3n09Xe3d19PV3n09Xe3d15PVvrivp6u9+3q62ruvp6u98z1ee+R2i7k4hbMr5KzMrpATLbtCzp3kClWnQ3aFnOHYFXLSYlfIv+fArlBYIXKF3FNgV8g9hbEKtXaczdU9BXaF3FNgV8g9BXKFZvcUxirU2sEzz+4psCvkngK7Qu4psCsUVohcIfcU2BVyT2GsQs3f9ZndU2BXyD0FdoXcUyBXKNxTYFfIPQV2hdxTYFfIPQV2hcIKkSvkngK7Qu4psCvkngK7Qu4psCvkngK5Qot7CuwKuafArpB7CuwKuafArlBYIXKF3FNgV8g9BXaF3FNgV8g9BXaF3FMgV2h1T4FdIfcU2BVyT4FdIfcU2BUKK0SukHsK7Aq5p8CukHsK7Aq5p8CukHsK5Apt7imwK+SeArtC7imwK+SeArtCYYXIFXIe6lGo7A8ec60rUqHmjMbNeYhdIechcoV25yF2hZyH2BVyHmJXyHmI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lIB7xq303O0Yt9Jz93zc5Cte5eMWSr4943q5quT7XeXjtruO+x7htk7pPUJu97PN6+u/o20+C+LzawfN3A7+o8vtfuTj5nY/8nFzux/1uMkXsMrHze1+5OPmdj/ycXO7H/m4zWvc3E5JPq6Xq0q+eVU+rperSr53VT1u8rWr8nG9XFXypavycb1c1dq8xvVyVclX6srH9XJVq5erSr4xWT1u8pXJ8nG9XFXypcnycb1cVfK1yfJxvVxV8sXJ8nG9XFXy1cnycb1cVfLlyfJxvVxV8lXL8nG9XFXytczycb1cVfKlzPJxvVxV8pXM8nGtXNWQfB+zfFwrVzUk38UsH9fKVX0N4zWulasaku9glo9r5aqG5PuX5eN6uarku5fl43q5quR7l+Xjermq5DuX5eN6uark+5bl43q5quS7luXjermq5HuW5eN6uarkO5bl43q5quT7leXjermq5LuV5eN6uarke5Xl43q5quQ7leXjermq5PuU5eN6uarku5Tl43q5qsnLVU1erir5lmz5uF6uqnm5qublqpLvQJeP6+Wqku9Al4/r5aqS70CXj+vlqpLvQJeP6+Wqku9Al4/r5aqS70CXj+vlqpLvQJeP6+WqvHarD1671Qev3eqD1271wWu3+uC1W33w2q0+eO1WH7x2qw9eu9UHr93qg9du9cFrt/rgtVt98NqtPnjtVh+8dqsPXrvVB6/d6oPXbvXBa7f64LVbffDarT547VYfvHarD1671Qev3eqD1271wWu3+uC1W33w2q0+eO1WH7x2qw9eu9UHr93qg9du9cFrt/rgtVt98NqtPnjtVh+8dqsPXrvVB6/d6oPXbvXRa7f66LVbffTarT567VYfH81rXCtXNXrtVh+9dquPXrvVR6/d6qPXbvXRa7f66LVbffTarT567VYfvXarj1671Uev3eqj12710Wu3+ui1W3302q0+eu1WH712q49eu9VHr93qo9du9dFrt/rotVt99NqtPnrtVh+9dquPXrvVR6/d6qPXbvXRa7f66LVbffTarT567VYfvXarj1671Uev3eqj12710Wu3+ui1W3302q0+eu1WH712q49eu9VHr93qo9du9dFrt/rotVt99NqtPnrtVh+9dquPXrvVR6/d6qPXbvXRa7f66LVbffTarT567VYfvXarj1671Uev3eqj12710Wu3+ui1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BoFvgI8BT3INAk9yDQJPcg0CT3INAk9y/Zf38YKzki4/wCEBfoBDSvsAhyT1AU4DzjEcEskHOKSGD3Bw9h/g4L4/wMEhH8PZcMgf4BRyyPu2vV68HoxbyPP2jFvIxfaM27zGLeQ0e8Yt5B17xi3kBnvGLeTvesYt5Ng6xt0LebCecb1c1e7lqnYvV7U3r3G9XNXu5ap2L1e1e7mq3cpVrQ8rV7U+rFzV+rByVevDylWtj+Y1rpWrWh9Wrmp9WLmq9WHlqtaHl6savFxVpTv2PeN6uapKN9t7xm1e43q5qkpXwXvG9XJVlS5g94zr5aoqXXvuGdfLVVW6bNwzrperqnTFt2dcL1dV6WJtz7herqrSddaecb1cVaVLpD3jermqSlc3e8b1clWVLkz2jOvlqipdU+wZ18tVVboc2DOul6uqdCWvZ1wvV1XpIlzPuF6uqtL1s55xvVxVpUtfPeN6uapKV616xvVyVZUuOPWM6+WqKl0r6hnXy1VVuszTM66Xq6p0haZnXC9XVeniSs+4Xq6q0nWRnnG9XFWlSxo943q5qkpXI3rG9XJVlS4k9Izr5aoqXQPoGdfLVVXaqt8zrperqrT5vmdcL1dVaTt9z7herqrSBvmecb1cVaUt7z3jermqSpvYe8b1clVeu9VXr93qq9du9dVrt/rqtVt99dqtvnrtVl+9dquvXrvVV6/d6qvXbvXVa7f66rVbffXarb567VZfvXarr1671Vev3eqb1271zWu3+ua1W33z2q2+PZrXuFauavParb557VbfvHarb1671Tev3eqb1271zWu3+ua1W33z2q2+ee1W37x2q29eu9U3r93qm9du9c1rt/rmtVt989qtvnntVt+8dqtvXrvVN6/d6pvXbvXNa7f65rVbffParb557VbfvHarb1671Tev3eqb1271zWu3+ua1W33z2q2+ee1W37x2q29eu9U3r93qm9du9c1rt/rmtVt989qtvnntVt+8dqtvXrvVN6/d6pvXbvXNa7f65rVbffParb557VbfvHarb1671Tev3eqb1271zWu3+ua1W33z2q2+ee1W37x2q29eu9U3r93qm9du9c1rt/rmtVt989qtvnntVt+8dqtvXrvVN6/d6pvXbvXNa7f65rVbffParb557VbfvHarb1671Tev3eqb1271zWu3+ua1W33z2q2+ee1W37x2q29eu9U3r93qm9du9c1rt/rmtVt989qtvnntVt+8dqtvXrvVN6/d6pvXbvXda7f67rVbfffarb577VbfH81rXCtXtXvtVt+9dqvvXrvVd6/d6rvXbvXda7f67rVbfffarb577VbfvXar71671Xev3eq712713Wu3+u61W3332q2+e+1W3712q+9eu9V3r93qu9du9d1rt/rutVt999qtvnvtVt+9dqvvXrvVd6/d6rvXbvXda7f67rVbfffarb577VbfvXar71671Xev3eq712713Wu3+u61W3332q2+e+1W3712q+9eu9V3r93qu9du9d1rt/rutVt999qtvnvtVt+9dqvvXrvVd6/d6rvXbvXda7f67rVbfffarb577VbfvXar71671Xev3eq712713Wu3+u61W3332q2+e+1W3712q+9eu9V3r93qu9du9d1rt/rutVt999qtvnvtVt+9dqvvXrvVd6/d6rvXbvXda7f67rVbfffarb577VbfvXar71671Xev3eq712713Wu3+u61W3332q2+e+1W3712q+9eu9V3r93qu9du9d1qt/r6sNqt/jWuk6v6GtfJVX2N6+SqvsZtXuM6uaqvcZ1c1de4Tq7qa1wnV/U1rperstqt/jWul6uy2q3+Na6Xq7Larf41rperstqt/jWul6uy2q3+Na6Xq7Larf41rperstqt/jWul6uy2q3+Na6Xq7Larf41rperstqt/jWul6uy2q3+Na6Xq7Larf41rperstqt/jWul6uy2q3+Na6Xq7Larf41rperstqt/jWul6uy2q3+Na6Xq7Larf41rperstqt/jWul6uy2q3+Na6Xq7Larf41rperstqt/jWul6uy2q3+Na6Xq7Larf41rperstqt/jWul6uy2q3+Na6Xq7Larf41rperstqt/jWul6uy2q3+Na6Xq7Larf41rperstqt/jWul6uy2q3+Na6Xq7Larf41rperstqt/jWul6uy2q3+Na6Xq7Larf41rperstqt/jWul6uy2q3+Na6Xq7Larf41rperstqt/jWul6uy2q3+Na6Xq7Larf41rperstqt/jWul6uy2q3+Na6Xq7Larf41rpWrGrx2qw9eu9UHr93qg9du9a9hvMa1clWD1271wWu3+uC1W33w2q0+eO1WH7x2qw9eu9UHr93qg9du9cFr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"},{"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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"}],"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"}},{"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":"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::_increase_public_balance_parameters"}}],"kind":"struct","path":"GasToken::_increase_public_balance_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":"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":"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"}}],"kind":"struct","path":"GasToken::mint_public_parameters"}}],"kind":"struct","path":"GasToken::mint_public_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"}]}},"file_map":{"122":{"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"},"126":{"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"},"129":{"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"},"136":{"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"},"140":{"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"},"141":{"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 start_side_effect_counter: reader.read_u32(),\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 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"},"144":{"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"},"145":{"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"},"147":{"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"},"150":{"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"},"168":{"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"},"170":{"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"},"171":{"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"},"173":{"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 = 0x15c9b0a92b9b541598e24c9f0b0b4b04b7f2408599751c45aa12de671fd9b363;\n assert_eq(hash, test_data_empty_hash);\n}\n"},"174":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/public_call_stack_item_compressed.nr","source":"use crate::abis::{call_context::CallContext, function_data::FunctionData, gas::Gas};\nuse crate::address::AztecAddress;\nuse crate::constants::{GENERATOR_INDEX__CALL_STACK_ITEM, PUBLIC_CALL_STACK_ITEM_COMPRESSED_LENGTH};\nuse crate::traits::{Hash, Empty, Serialize, Deserialize};\nuse crate::utils::reader::Reader;\n\n/**\n * A compressed version of the PublicCallStackItem struct used to compute the \"hash\"\n * of a PublicCallStackItem.\n * \n * Historically, we have been zeroing most values in the PublicCallStackItem struct\n * to compute the hash involved when adding a PublicCallStackItem to the PublicCallStack.\n * \n * This struct is used to store the values that we did not zero out, and allow us to hash\n * only these, thereby skipping a lot of computation and saving us a lot of constraints\n * \n * Essentially this struct exists such that we don't have a `hash` function in the \n * PublicCallStackItem struct that practically throws away some values of the struct\n * without clearly indicating that it does so.\n */\nstruct PublicCallStackItemCompressed {\n contract_address: AztecAddress,\n call_context: CallContext,\n function_data: FunctionData,\n args_hash: Field,\n returns_hash: Field,\n revert_code: u8,\n start_gas_left: Gas,\n end_gas_left: Gas,\n}\n\nimpl Eq for PublicCallStackItemCompressed {\n fn eq(self, other: PublicCallStackItemCompressed) -> bool {\n (self.contract_address == other.contract_address)\n & (self.call_context == other.call_context)\n & (self.function_data == other.function_data)\n & (self.args_hash == other.args_hash)\n & (self.returns_hash == other.returns_hash)\n & (self.revert_code == other.revert_code)\n & (self.start_gas_left == other.start_gas_left)\n & (self.end_gas_left == other.end_gas_left)\n }\n}\n\nimpl Hash for PublicCallStackItemCompressed {\n fn hash(self) -> Field {\n std::hash::pedersen_hash_with_separator(self.serialize(), GENERATOR_INDEX__CALL_STACK_ITEM)\n }\n}\n\nimpl Empty for PublicCallStackItemCompressed {\n fn empty() -> Self {\n PublicCallStackItemCompressed {\n contract_address: AztecAddress::empty(),\n call_context: CallContext::empty(),\n function_data: FunctionData::empty(),\n args_hash: 0,\n returns_hash: 0,\n revert_code: 0,\n start_gas_left: Gas::empty(),\n end_gas_left: Gas::empty(),\n }\n }\n}\n\nimpl Serialize<PUBLIC_CALL_STACK_ITEM_COMPRESSED_LENGTH> for PublicCallStackItemCompressed {\n fn serialize(self) -> [Field; PUBLIC_CALL_STACK_ITEM_COMPRESSED_LENGTH] {\n let mut fields: BoundedVec<Field, PUBLIC_CALL_STACK_ITEM_COMPRESSED_LENGTH> = BoundedVec::new();\n\n fields.push(self.contract_address.to_field());\n fields.extend_from_array(self.call_context.serialize());\n fields.extend_from_array(self.function_data.serialize());\n fields.push(self.args_hash);\n fields.push(self.returns_hash);\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\n assert_eq(fields.len(), PUBLIC_CALL_STACK_ITEM_COMPRESSED_LENGTH);\n\n fields.storage\n }\n}\n\nimpl Deserialize<PUBLIC_CALL_STACK_ITEM_COMPRESSED_LENGTH> for PublicCallStackItemCompressed {\n fn deserialize(fields: [Field; PUBLIC_CALL_STACK_ITEM_COMPRESSED_LENGTH]) -> PublicCallStackItemCompressed {\n let mut reader = Reader::new(fields);\n\n let item = PublicCallStackItemCompressed {\n contract_address: reader.read_struct(AztecAddress::deserialize),\n call_context: reader.read_struct(CallContext::deserialize),\n function_data: reader.read_struct(FunctionData::deserialize),\n args_hash: reader.read(),\n returns_hash: reader.read(),\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 };\n reader.finish();\n item\n }\n}\n"},"176":{"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"},"177":{"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"},"180":{"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"},"181":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/validation_requests/key_validation_request.nr","source":"use crate::{constants::KEY_VALIDATION_REQUEST_LENGTH, traits::{Empty, Serialize, Deserialize}, point::Point};\n\nstruct KeyValidationRequest {\n pk_m: Point,\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: Point::empty(),\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.pk_m.is_infinite as Field,\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: Point { x:fields[0], y: fields[1], is_infinite: fields[2] as bool},\n sk_app: fields[3],\n }\n }\n}\n\n"},"185":{"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"},"194":{"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"},"195":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_call_request.nr","source":"use crate::{\n abis::{\n private_call_stack_item::PrivateCallStackItem, call_context::CallContext,\n function_data::FunctionData, caller_context::CallerContext,\n side_effect::{Ordered, RangeOrdered, Scoped}\n},\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 target: AztecAddress,\n call_context: CallContext,\n function_data: FunctionData,\n args_hash: Field,\n returns_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.target == other.target) \n & (self.call_context == other.call_context) \n & (self.function_data == other.function_data) \n & (self.args_hash == other.args_hash) \n & (self.returns_hash == other.returns_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 target: AztecAddress::empty(),\n call_context: CallContext::empty(),\n function_data: FunctionData::empty(),\n args_hash: 0,\n returns_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.target.to_field());\n fields.extend_from_array(self.call_context.serialize());\n fields.extend_from_array(self.function_data.serialize());\n fields.push(self.args_hash);\n fields.push(self.returns_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 target: reader.read_struct(AztecAddress::deserialize),\n call_context: reader.read_struct(CallContext::deserialize),\n function_data: reader.read_struct(FunctionData::deserialize),\n args_hash: reader.read(),\n returns_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 pub fn matches_stack_item(self, stack_item: PrivateCallStackItem) -> bool {\n (self.target == stack_item.contract_address)\n & (self.call_context == stack_item.public_inputs.call_context)\n & (self.function_data == stack_item.function_data)\n & (self.args_hash == stack_item.public_inputs.args_hash)\n & (self.returns_hash == stack_item.public_inputs.returns_hash)\n & (self.start_side_effect_counter\n == stack_item.public_inputs.start_side_effect_counter)\n & (self.end_side_effect_counter\n == stack_item.public_inputs.end_side_effect_counter)\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"},"200":{"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"},"209":{"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 = 0x065f2831db9ac0db5e710bd3a865b5facd8cf83f1585e1af8fd1d6ce9c47f685;\n assert_eq(hash, test_data_empty_hash);\n}\n"},"210":{"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"},"212":{"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"},"216":{"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"},"217":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/call_context.nr","source":"use crate::{\n abis::function_selector::FunctionSelector, address::AztecAddress,\n constants::{CALL_CONTEXT_LENGTH, GENERATOR_INDEX__CALL_CONTEXT}, hash::pedersen_hash,\n traits::{Deserialize, Hash, Serialize, Empty}, 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// docs:end:call-context\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 \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 }\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 }\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 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"},"218":{"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"},"22":{"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"},"221":{"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"},"228":{"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"},"23":{"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"},"230":{"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"},"235":{"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"},"236":{"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"},"237":{"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"},"238":{"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"},"239":{"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"},"240":{"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"},"241":{"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"},"242":{"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"},"244":{"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"},"248":{"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"},"249":{"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"},"25":{"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#[no_predicates]\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 multi_scalar_mul(generators, points)\n}\n\n#[no_predicates]\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 ).x\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"},"250":{"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"},"264":{"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"},"274":{"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"},"276":{"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"},"290":{"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"},"291":{"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,\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"},"293":{"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"},"294":{"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"},"295":{"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"},"296":{"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"},"297":{"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"},"30":{"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 #[no_predicates]\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"},"302":{"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"},"32":{"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"},"4":{"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"},"47":{"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"},"80":{"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"},"86":{"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"},"89":{"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"},"93":{"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::pack_arguments;\nuse crate::hash::hash_args;\n\ntrait CallInterface<N, T, P, Env> {\n fn get_original(self) -> fn[Env](T) -> P;\n\n fn get_args(self) -> [Field] {\n self.args\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\nimpl<N, T, P, Env> CallInterface<N, PrivateContextInputs, PrivateCircuitPublicInputs, Env> for PrivateCallInterface<N, T, Env> {\n fn get_original(self) -> fn[Env](PrivateContextInputs) -> PrivateCircuitPublicInputs {\n self.original\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 assert(self.args_hash == pack_arguments(self.args));\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 assert(self.args_hash == pack_arguments(self.args));\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 assert(self.args_hash == pack_arguments(self.args));\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_original(self) -> fn[Env](PrivateContextInputs) -> PrivateCircuitPublicInputs {\n self.original\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 assert(self.args_hash == pack_arguments(self.args));\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 assert(self.args_hash == pack_arguments(self.args));\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 assert(self.args_hash == pack_arguments(self.args));\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_original(self) -> fn[Env](PrivateContextInputs) -> PrivateCircuitPublicInputs {\n self.original\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 assert(self.args_hash == pack_arguments(self.args));\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_original(self) -> fn[Env](PrivateContextInputs) -> PrivateCircuitPublicInputs {\n self.original\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 assert(self.args_hash == pack_arguments(self.args));\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_original(self) -> fn[Env](PublicContextInputs) -> T {\n self.original\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 let args_hash = hash_args(self.args);\n assert(args_hash == 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 let args_hash = hash_args(self.args);\n assert(args_hash == 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 let args_hash = hash_args(self.args);\n assert(args_hash == 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_original(self) -> fn[Env](PublicContextInputs) -> () {\n self.original\n }\n}\n\nstruct PublicVoidCallInterface<N, Env> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<N>,\n args: [Field],\n original: fn[Env](PublicContextInputs) -> (),\n is_static: bool,\n gas_opts: GasOpts\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 let args_hash = hash_args(self.args);\n assert(args_hash == 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 let args_hash = hash_args(self.args);\n assert(args_hash == 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 let args_hash = hash_args(self.args);\n assert(args_hash == 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_original(self) -> fn[Env](PublicContextInputs) -> T {\n self.original\n }\n}\n\nstruct PublicStaticCallInterface<N, T, Env> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<N>,\n args: [Field],\n original: fn[Env](PublicContextInputs) -> T,\n is_static: bool,\n gas_opts: GasOpts\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 let args_hash = hash_args(self.args);\n assert(args_hash == 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_original(self) -> fn[Env](PublicContextInputs) -> () {\n self.original\n }\n}\n\nstruct PublicStaticVoidCallInterface<N, Env> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<N>,\n args: [Field],\n original: fn[Env](PublicContextInputs) -> (),\n is_static: bool,\n gas_opts: GasOpts\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 let args_hash = hash_args(self.args);\n assert(args_hash == 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"},"94":{"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.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 {\n target: item.contract_address,\n call_context: item.public_inputs.call_context,\n function_data: item.function_data,\n args_hash: item.public_inputs.args_hash,\n returns_hash: item.public_inputs.returns_hash,\n caller_context,\n start_side_effect_counter,\n end_side_effect_counter\n }\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.get_compressed().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.get_compressed().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.start_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"},"95":{"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"}}}
|
|
1
|
+
{"transpiled":true,"noir_version":"0.31.0+97ecff5ea76a0da878bdccc453b121147f726ec4","name":"GasToken","functions":[{"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"}}],"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"}}],"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"}},{"name":"is_infinite","type":{"kind":"boolean"}}],"kind":"struct","path":"std::embedded_curve_ops::EmbeddedCurvePoint"}},{"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":"target","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"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"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::call_context::CallContext"}},{"name":"function_data","type":{"fields":[{"name":"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_private","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_data::FunctionData"}},{"name":"args_hash","type":{"kind":"field"}},{"name":"returns_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":"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":"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"}}],"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"}}],"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"}},{"name":"is_infinite","type":{"kind":"boolean"}}],"kind":"struct","path":"std::embedded_curve_ops::EmbeddedCurvePoint"}},{"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":"target","type":{"fields":[{"name":"inner","type":{"kind":"field"}}],"kind":"struct","path":"authwit::aztec::protocol_types::address::aztec_address::AztecAddress"}},{"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"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::call_context::CallContext"}},{"name":"function_data","type":{"fields":[{"name":"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_private","type":{"kind":"boolean"}}],"kind":"struct","path":"authwit::aztec::protocol_types::abis::function_data::FunctionData"}},{"name":"args_hash","type":{"kind":"field"}},{"name":"returns_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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cMvwv6Z8z19Tv+evmb/nr4nv+WuW7/lr1u/5a7bv+WsAT4E6xXJ2II6p8WAq5fx0KV/ayvUo56EOwkPF9N2H2vaHj9vLz4/wV34r6HH8cu/j13sff7738ePex1/uffz13sff7n38/d7HP259/OXet+5y71t3ufetu9z71l3ufesu9751l3vfusu9b93l3rfucu9bd733rbve+9Zd733rrve+ddd737or9XN/OVdZLPH8+NTP/ebxN+onz3Lu61nW7enxqZ887eNTP3nax6d+8rSPT+3328en9vvt41M/95vfRm/Uz/328an9fvP4O7Xfbx+f+tZtH5/61m0fn/rWbR+f+tZtH5/61m0fn/rWbR//3rfufu9bd7/3rXt8/637yuyYsj4+XMr25ZeHPn8l5ih3L6DevYD57gXE3QtY7l7AevcCNp4CHkfa+Y6EuCtLOVculzUaRyqlfkr35b3gWh/SzdPEeKjy3YdCfgEwT/Xex5/vffy49/GXex9/vffxt3sff7/38Y9bH79M9z7+vW/dcu9bt9z71i33vnXLvW/dcu9bt9z71i33vnXLvW/deu9bt9771q33vnXrvW9dxDSKkce/961b733r1nvfuvXet2699607Uz/3W78lPM/Uz/328amfPK3flJxn6idP+/jUT5728amfPM3jB7Xfbx+f2u+3j0/93G/9ws8c1M/99vHj3sen9vvt41Pfuu3jU9+67eNT37rt41Pfus3jL9S3bvv41Ldu+/j3vnWXe9+6kCkgA4///bfuK79eOO2fvw42ffklu89fB1vWuxew3b2A/e4FHDcvYJ3uXkC5ewGVu4AzuX8UUH4q4NlPPje0fBlKW47zzlhnpWJDqVhuN/DTL4c//++Q2w10FMDtBjoK4HYDHQVwu4F2ARu3G+gogNsNdBTA7Qba79hs3Dd8RwHct3ZHAUQ38eNIRHfr40iQ2/LLOscvW1wvXlA790qWJZ4eaec70vHdR4L+Nglk+s3A45d7H7/e+/jzvY8f9z7+cu/jr/c+/nbv4+/3Pv69b93j3rfuce9b97j3rXvc+9aFTL0ZePx737rHvW/d49637nHvW/e49a0b061v3ZhufevGdOtbN6Zb37ox3frWjenWt25Mt751Y7r1rRvTrW/dmO596xbq537rhb8o1M/99vGpnzytl56iUD952senfvK0j0/9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50Vq7nmRmntepOaeF6m550Vq7nmRmntepOaeF6m550Vq7nmRmntepOaeF6m550Vq7nmRmntepOaeF6m550Vq7nmRmntepOaeF6m550Vq7nmRmntepOaeF6m550Vq7nmRmntepOaeF6m550Vq7nmRmntepOaeF6m550Vq7nmRmntepOaeF6m550Vq7nmRmntepeaeV6m551Vq7nmVmntep5CqVslLVam551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7nmVmntepeaeV6m551Vq7vksNfd8lpp7PkvNPZ+l5p7PU0hVq+SlZqm557PU3PNZau75LDX3fJaaez5LzT2fpeaez1Jzz2epueez1NzzWWru+Sw193yWmns+Z5qNfWz18eFtfl5tovu2o9pEz+Rj388Pb8+rTfRM7qg20TO5o9pEz+SOahPl23a1meYnd1Sb6b5tV5vpvm1XmyjfdlQbUtVKealM85M7qr2tlzoruK0/Oiug9jwf56jLeZBpXxv/5q5/9qNe7knHb6iX2ve8oV5q5/OGeqm9zxvqDbF6qf3PG+qldkBvqJfaA72hXmrH9IZ6xfwV9/TjN9Qr5q+4JyC/oV4xf8U9BfkN9Yr5K+5JyG+oV8xfcU9DfkO9Yv6KeyLyG+oV81fcU5HfUK+Yv+KejPyGesX8Ffd05DfUK+avuCckv6FeMX/FPVv21XqXePyu6hIX9aa6jzrqTfW8WpbH71gs6/PfseCeQvqGelM9r9r1ck8ifUO9qfJgR72p8mBHvanu37WsPz69zvV5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pq05HdVKealMG2I6qpXyUpm2oXRUK+WlMm3+6KhWyktl2nLRUa2Ul8q00aGjWikvlWl7QUe1Ul4q06T+jmqlvFSmifcd1Up5qUxT6TuqlfJSmSbHd1Qr5aUyTXfvqFbKS2WawN5RrZSXyjQlvaNaKS8lNfd8k5p7vknNPd+k5p5vUnPPN6m555vU3PNNau75JjX3fJOae75JzT3fpOaeb1Jzzzepueeb1NzzTWru+SY193yTmnu+S80936Xmnu9Sc893qbnn+xRS1Sp5qV1q7vkuNfd8l5p7vkvNPd+l5p7vUnPPd6m557vU3PNdau75LjX3fJeae75LzT3fpeae71Jzz3epuee71NzzXWru+S4193yXmnu+S80936Xmnu9Sc893qbnnu9Tc811q7vkuNfd8l5p7vkvNPd+l5p7vUnPPd6m557vU3PNdau75LjX3fJeae75LzT3fpeae71Jzz3epuee71NzzXWru+S4193yXmnu+S80936Xmnu9Sc893qbnnu9Tc811q7vkuNfd8l5p7vkvNPd+l5p7vUnPPd6m557vU3PNdau75LjX3fJeae75LzT3fpeae71Jzz3epuee71NzzXWru+S4193yXmnu+S80936Xmnu9Sc893qbnnu9Tc811q7vkuNfd8l5p7vkvNPd+l5p7vUnPPd6m557vU3PNdau75LjX3fJeae75LzT3fpeae71Jzz3epuee71NzzXWru+S4193yXmnu+S80936Xmnu9Sc88Pqbnnh9Tc80Nq7vkhNff8mEKqWiUvdUjNPT+k5p4fUnPPD6m554fU3PNDau75ITX3/JCae35IzT0/pOaeH1Jzzw+pueeH1NzzQ2ru+SE19/yQmnt+SM09P6Tmnh9Sc88Pqbnnh9Tc80Nq7vkhNff8kJp7fkjNPT+k5p4fUnPPD6m554fU3PNDau75ITX3/JCae35IzT0/pOaeH1Jzzw+pueeH1NzzQ2ru+SE19/yQmnt+SM09P6Tmnh9Sc88Pqbnnh9Tc80Nq7vkhNff8kJp7fkjNPT+k5p4fUnPPD6m554fU3PNDau75ITX3/JCae35IzT0/pOaeH1Jzzw+pueeH1NzzQ2ru+SE19/yQmnt+SM09P6Tmnh9Sc88Pqbnnh9Tc80Nq7vkhNff8kJp7fkjNPT+k5p4fUnPPD6m554fU3PNDau75ITX3/JCae35IzT0/pOaeH1Jzzw+pueeH1NzzQ2ru+SE19/yQmnt+SM09P6Tmnh9Sc88Pqbnnh9Tc80Np7vk2Kc09/6hWyEt9VCvkpT6qFfJSH9WGVLVCXuqjWiEv9VGtkJf6qFbIS31UK+WllOaef1Qr5aWU5p5/VCvlpZTmnn9UK+WllOaef1Qr5aWU5p5/VCvlpZTmnn9UK+WllOaef1Qr5aWU5p5/VCvlpZTmnn9UK+WllOaef1Qr5aWU5p5/VCvlpZTmnn9UK+WllOaef1Qr5aWU5p5/VCvlpZTmnn9UK+WllOaef1Qr5aWU5p5/VCvlpZTmnn9UK+WllOaef1Qr5aWU5p5/VCvlpZTmnn9UK+WllOaef1Qr5aWU5p5/VCvlpZTmnn9UK+WllOaef1Qr5aWU5p5/VCvlpZTmnn9UK+WllOaef1Qr5aWU5p5/VCvlpZTmnn9UK+WllOaef1Qr5aWU5p5/VCvlpZTmnn9UK+WllOaef1Qr5aWU5p5/VCvlpZTmnn9UK+WllOaef1Qr5aWU5p5/VCvlpZTmnn9UK+WllOaef1Qr5aWU5p5/VCvlpZTmnn9UK+WllOaef1Qr5aWU5p5/VCvlpZTmnn9Uq+SlitTc8yI197xIzT0vUnPPP2qRqlbJSxWpuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XqTmnhepuedFau55kZp7XjLNxv449XSeuh6Nn/3KOeZ5Xn58eJ738nmOY/mLP7lO9fHhOm1f2JXp2U/ej/Mn18ZPXqL++OwS83PtE7kPa/+i9om8mLV/Ufuw9rLaJ/Lp1v5F7ROlFmv/ovaJMpy1f1H7RInW2r+ofaLvSqz9S9rXTJtJrP2L2ruvp6u9+3pZtd8fMJZjea69+3q62oe1l9XefT1d7d3Xy6r99qn9+lx79/V0tXdfT1d79/Vktc+0Jc/av6i9+3q62ruvl1X75fF7usu6PdfefT1d7cPay2rvvp6u9u7r6Wrvvp6u9u7r6Wrvvp6s9pk2Nlv7F7V3X09Xe/f1dLV3X09X+7D2stq7r6ervft6utq7r6ervft6utq7ryer/ey+nq727uvpau++nq727uvpah/WXlZ79/V0tXdfT1d79/V0tXdfT1d79/VktQ/39XS1d19PV3v39XS1d19PV/uw9rLau6+nq737errau6+nq737errau68nq/3ivp6u9s73Q7UvRzwkKscxI7Vv7s1YwtrLau98r6u9872u9s73uto73+tq73wvq/3qfK+rvX9vR1d7/96Orvbu6+lqH9Y+qfbN3Yir+3q62ruvp6u9+3q62ruvl1X75o601X09We039/V0tXdfT1d79/V0tXdfT1f7sPZJtW/+nu7mvp6u9u7r6Wrvvp6u9u7r6Wrvvp6s9rv7errau6+nq737errau6+nq31Ye1nt3dfT1d59PV3t3dfT1d59PV3t3deT1f5wX09Xe/f1dLV3X09Xe/f1dLUPay+rvft6utq7r6ervft6utq7r6ervft6qtrPk/t6utq7r6ervft6utq7r6erfVh7We3d19PV3n09Xe3d19PV3n09Xe3d15PVvrivp6u9+3q62ruvp6u98z1ee+R2i7k4hbMr5KzMrpATLbtCzp3kClWnQ3aFnOHYFXLSYlfIv+fArlBYIXKF3FNgV8g9hbEKtXaczdU9BXaF3FNgV8g9BXKFZvcUxirU2sEzz+4psCvkngK7Qu4psCsUVohcIfcU2BVyT2GsQs3f9ZndU2BXyD0FdoXcUyBXKNxTYFfIPQV2hdxTYFfIPQV2hcIKkSvkngK7Qu4psCvkngK7Qu4psCvkngK5Qot7CuwKuafArpB7CuwKuafArlBYIXKF3FNgV8g9BXaF3FNgV8g9BXaF3FMgV2h1T4FdIfcU2BVyT4FdIfcU2BUKK0SukHsK7Aq5p8CukHsK7Aq5p8CukHsK5Apt7imwK+SeArtC7imwK+SeArtCYYXIFXIe6lGo7A8ec60rUqHmjMbNeYhdIechcoV25yF2hZyH2BVyHmJXyHmI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lIB7xq303O0Yt9Jz93zc5Cte5eMWSr4943q5quT7XeXjtruO+x7htk7pPUJu97PN6+u/o20+C+LzawfN3A7+o8vtfuTj5nY/8nFzux/1uMkXsMrHze1+5OPmdj/ycXO7H/m4zWvc3E5JPq6Xq0q+eVU+rperSr53VT1u8rWr8nG9XFXypavycb1c1dq8xvVyVclX6srH9XJVq5erSr4xWT1u8pXJ8nG9XFXypcnycb1cVfK1yfJxvVxV8sXJ8nG9XFXy1cnycb1cVfLlyfJxvVxV8lXL8nG9XFXytczycb1cVfKlzPJxvVxV8pXM8nGtXNWQfB+zfFwrVzUk38UsH9fKVX0N4zWulasaku9glo9r5aqG5PuX5eN6uarku5fl43q5quR7l+Xjermq5DuX5eN6uark+5bl43q5quS7luXjermq5HuW5eN6uarkO5bl43q5quT7leXjermq5LuV5eN6uarke5Xl43q5quQ7leXjermq5PuU5eN6uarku5Tl43q5qsnLVU1erir5lmz5uF6uqnm5qublqpLvQJeP6+Wqku9Al4/r5aqS70CXj+vlqpLvQJeP6+Wqku9Al4/r5aqS70CXj+vlqpLvQJeP6+WqvHarD1671Qev3eqD1271wWu3+uC1W33w2q0+eO1WH7x2qw9eu9UHr93qg9du9cFrt/rgtVt98NqtPnjtVh+8dqsPXrvVB6/d6oPXbvXBa7f64LVbffDarT547VYfvHarD1671Qev3eqD1271wWu3+uC1W33w2q0+eO1WH7x2qw9eu9UHr93qg9du9cFrt/rgtVt98NqtPnjtVh+8dqsPXrvVB6/d6oPXbvXRa7f66LVbffTarT567VYfH81rXCtXNXrtVh+9dquPXrvVR6/d6qPXbvXRa7f66LVbffTarT567VYfvXarj1671Uev3eqj12710Wu3+ui1W3302q0+eu1WH712q49eu9VHr93qo9du9dFrt/rotVt99NqtPnrtVh+9dquPXrvVR6/d6qPXbvXRa7f66LVbffTarT567VYfvXarj1671Uev3eqj12710Wu3+ui1W3302q0+eu1WH712q49eu9VHr93qo9du9dFrt/rotVt99NqtPnrtVh+9dquPXrvVR6/d6qPXbvXRa7f66LVbffTarT567VYfvXarj1671Uev3eqj12710Wu3+ui1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BoFvgI8BT3INAk9yDQJPcg0CT3INAk9y/Zf38YKzki4/wCEBfoBDSvsAhyT1AU4DzjEcEskHOKSGD3Bw9h/g4L4/wMEhH8PZcMgf4BRyyPu2vV68HoxbyPP2jFvIxfaM27zGLeQ0e8Yt5B17xi3kBnvGLeTvesYt5Ng6xt0LebCecb1c1e7lqnYvV7U3r3G9XNXu5ap2L1e1e7mq3cpVrQ8rV7U+rFzV+rByVevDylWtj+Y1rpWrWh9Wrmp9WLmq9WHlqtaHl6savFxVpTv2PeN6uapKN9t7xm1e43q5qkpXwXvG9XJVlS5g94zr5aoqXXvuGdfLVVW6bNwzrperqnTFt2dcL1dV6WJtz7herqrSddaecb1cVaVLpD3jermqSlc3e8b1clWVLkz2jOvlqipdU+wZ18tVVboc2DOul6uqdCWvZ1wvV1XpIlzPuF6uqtL1s55xvVxVpUtfPeN6uapKV616xvVyVZUuOPWM6+WqKl0r6hnXy1VVuszTM66Xq6p0haZnXC9XVeniSs+4Xq6q0nWRnnG9XFWlSxo943q5qkpXI3rG9XJVlS4k9Izr5aoqXQPoGdfLVVXaqt8zrperqrT5vmdcL1dVaTt9z7herqrSBvmecb1cVaUt7z3jermqSpvYe8b1clVeu9VXr93qq9du9dVrt/rqtVt99dqtvnrtVl+9dquvXrvVV6/d6qvXbvXVa7f66rVbffXarb567VZfvXarr1671Vev3eqb1271zWu3+ua1W33z2q2+PZrXuFauavParb557VbfvHarb1671Tev3eqb1271zWu3+ua1W33z2q2+ee1W37x2q29eu9U3r93qm9du9c1rt/rmtVt989qtvnntVt+8dqtvXrvVN6/d6pvXbvXNa7f65rVbffParb557VbfvHarb1671Tev3eqb1271zWu3+ua1W33z2q2+ee1W37x2q29eu9U3r93qm9du9c1rt/rmtVt989qtvnntVt+8dqtvXrvVN6/d6pvXbvXNa7f65rVbffParb557VbfvHarb1671Tev3eqb1271zWu3+ua1W33z2q2+ee1W37x2q29eu9U3r93qm9du9c1rt/rmtVt989qtvnntVt+8dqtvXrvVN6/d6pvXbvXNa7f65rVbffParb557VbfvHarb1671Tev3eqb1271zWu3+ua1W33z2q2+ee1W37x2q29eu9U3r93qm9du9c1rt/rmtVt989qtvnntVt+8dqtvXrvVN6/d6pvXbvXda7f67rVbfffarb577VbfH81rXCtXtXvtVt+9dqvvXrvVd6/d6rvXbvXda7f67rVbfffarb577VbfvXar71671Xev3eq712713Wu3+u61W3332q2+e+1W3712q+9eu9V3r93qu9du9d1rt/rutVt999qtvnvtVt+9dqvvXrvVd6/d6rvXbvXda7f67rVbfffarb577VbfvXar71671Xev3eq712713Wu3+u61W3332q2+e+1W3712q+9eu9V3r93qu9du9d1rt/rutVt999qtvnvtVt+9dqvvXrvVd6/d6rvXbvXda7f67rVbfffarb577VbfvXar71671Xev3eq712713Wu3+u61W3332q2+e+1W3712q+9eu9V3r93qu9du9d1rt/rutVt999qtvnvtVt+9dqvvXrvVd6/d6rvXbvXda7f67rVbfffarb577VbfvXar71671Xev3eq712713Wu3+u61W3332q2+e+1W3712q+9eu9V3r93qu9du9d1qt/r6sNqt/jWuk6v6GtfJVX2N6+SqvsZtXuM6uaqvcZ1c1de4Tq7qa1wnV/U1rperstqt/jWul6uy2q3+Na6Xq7Larf41rperstqt/jWul6uy2q3+Na6Xq7Larf41rperstqt/jWul6uy2q3+Na6Xq7Larf41rperstqt/jWul6uy2q3+Na6Xq7Larf41rperstqt/jWul6uy2q3+Na6Xq7Larf41rperstqt/jWul6uy2q3+Na6Xq7Larf41rperstqt/jWul6uy2q3+Na6Xq7Larf41rperstqt/jWul6uy2q3+Na6Xq7Larf41rperstqt/jWul6uy2q3+Na6Xq7Larf41rperstqt/jWul6uy2q3+Na6Xq7Larf41rperstqt/jWul6uy2q3+Na6Xq7Larf41rperstqt/jWul6uy2q3+Na6Xq7Larf41rperstqt/jWul6uy2q3+Na6Xq7Larf41rperstqt/jWul6uy2q3+Na6Xq7Larf41rperstqt/jWul6uy2q3+Na6Xq7Larf41rpWrGrx2qw9eu9UHr93qg9du9a9hvMa1clWD1271wWu3+uC1W33w2q0+eO1WH7x2qw9eu9UHr93qg9du9cFr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"},{"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":"ndpRattAGIXRveg5FN/fmhkpWymlOIlTDMEJsVMoJnuv3dIF9LxpJN237+kwl+lp//Dx4/vh+Px6mu6/XqaX18fd+fB6vJ4u0+ZLLX/ent52x9uL03n3fp7ut33cTfvj0/Vp1Ofd9Hx42U/3tbbPb3e30Qqj7UZGkVHJaCujWUZNRl1GQ0ZSxFaKmKWIWYqYpYhZipiliFmKmKWIWYqYpYhZimhSRJMimhTRpIgmRTQpokkRTYpoUkSTIroU0aWILkV0KaJLEV2K6FJElyK6FNGliCFFDCliSBFDihhSxJAihhQxpIghRQwpYpEiFilikSIWKWKRIhYpYpEiFilikSIWKWKVIlYpYpUiVililSJWKWKVIlYpYpUiVikimw2tQqui1ZZWM60arTqtBq0WWlEboTZCbYTaCLURaiPURqiNUBuhNkJtFLVR1EZRG0VtFLVR1EZRG0VtEGiGRDNEmiHTDKFmSDVDrBlyzRBshmQzRJsh2wzhZkg3Q7wZ8s0QcIaEM0ScIeMMIWdIOUPMGXLOEHSGpDNEnSHrDGFnSDtD3BnyzhB4hsQzRJ4h8wyhZ0g9Q+wZcs8QfIbkM0SfIfsM4WdIP0P8GfLPEICGBDREoCEDDSFoSEFDDBpy0BCEhiQ0RKEhCw1haEhDQxwa8tAQiIZENESiIRMNoWhIRUMsGnLRIhctctEiFy1y0SIXLXLRIhctctEiFy1y0SIXLXLRIhctctEiFy1y0SIXLXLRIhctctEiFy1y0SIXLXLRIhctctEiFy1y0bKLnuSiRS5a5KJFLlrkokUuWuSi9d8uej393L0fdg8v+9vd3tvHj+Pjv6u+1+P519vfL9d/fwM="},{"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":"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":"7ZzbahtLEEX/Rc/mMLuqqy/+lUMISuIEgZFDrASCyb/HiqWJjJSYGLGkofVmSTVTtdssehgW/TD7cPPu66e3i+XHu/vZ9f8Ps9u79/PV4m75+OlhNvyn4de395/ny/UX96v5l9Xs2uXD1exm+WH9Z84/rmYfF7c3s2tr8eNqr1pF2lSrRIzViuFAdbinTXV4bmP1wVuHmm+LTS8U1xjKprhG8t3iN1frrNZR1tRR1ugoa+4oa+koa+0oa+Ozqo1Zy/D38UvNm9rSYmeM4Wl6GyY9vSY9vU16ep/09GnS08ekp8/nPX32cfr8bPr92ubb+7adTedwbYk63jf9rvXNopTLouwvypnvrSdZFD/zTe80i3Lmu9FpFuXMN7nTLMqZ752nWZTLlnxgUS5b8oFFqZdF2V+Uy3PK/qKkl18tlOeL8nSZve4yf91l6XWX/WETqdtXRW7+4j/ch20Tecpn+4IrlY6y1o6ytn6yxtBRVnWU1fis/7DxqqXtmzC1nT3dfDu/T3z+NPH5Y+Lz54nPXyY+/1GeF8bHc3mpz+Z/atKAJnkgmohoYkQTJ5okokkQTTLRpBBNCOIzQXwhiC8E8YUgvhDEF4L4QhBfCOILQXwhiC8E8ZUgvhLEV4L4ShBfCeIrQXwliK8E8ZUgvhLEN4L4RhDfCOIbQXwjiG8E8Y0gvhHEN4L4RhCvYUC6COliSBdHuiSkSyBdMtKlIF0q0gVhXwj7QtgXwr4Q9oWwL4R9IewLYV8I+0LYN4R9Q9g3hH1D2DeEfUPYN4R9Q9g3hH1D2HeEfUfYd4R9R9h3hH1H2HeEfUfYd4R9R9hPCPsJYT8h7CeE/YSwnxD2E8J+QthPCPsJYT8Q9gNhPxD2A2E/EPYDYT8Q9gNhH9H1hPh6QoQ9IcaeEGVPiLMnRNoTYu0J0faEeHtCxD0h5p4QdU+IuydE3hNi7wnR94T4e0IEPiEGnxCFT4jDJ0TiE2LxCdH4hHh8QkQ+ISafEJVPiMsnROYTYvMJ0fmE+HxChD4hRp8QpU+I0ydE6hNi9QnR+oR4fYZ4fYZ4fYZ4fYZ4fTYkpEsgXTLSpSBdKtIFYR/x+gzx+gzx+gzx+gzx+gzx+gzx+gzx+gzx+gzx+gzx+gzx+gzx+gzx+gzx+gzx+gzx+gzx+gzx+gzx+gzx+gzx+gzx+gzx+gzx+gzx+gzx+gzx+gzx+gzx+gzx+gzx+gzx+gzx+gzx+gzx+uwoXl+k8dza2Dledt1lvzqytod1Rc4xVh+8daQyFsfwQnHNtj2NtubnB3ttwpaewtaewraOwh7F+ZxMWPUU1nsKm3oKGz2F7emhInp6qDiKPp2H8UjVHPWMw7aOwh5FJp9MWPUU1noK6z2FTT2FjZ7C5p7Clj7CPn74Nv+ymL+7vbl/vGT929fl+9Xibrn5uPr++emXx9qf"},{"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":"_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":"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":"7ZzvbhtHEsTfRZ+Nw3R39fzxqxwOByVxDgIMOYiVAw5G3v3ohFzR0MJSdQiZBeeTLXuH07NVclHF9e/TzU/vfvjtP/++u//5w8ebt//8dPP+w4+3D3cf7g9ffbpp/7D2x59+/OX2/vMffHy4/fXh5m17c/Pu/qfDr7+/ufn57v27m7e+8vd/vfm8wNgFzi4IdgHYBcku6OyCwS6Y7IJFLnBWaWeVdlZpZ5V2VmlnlXZWaWeVdlZpZ5UOVulglQ5W6WCVDlbpYJUOVulglQ5W6WCVBqs0WKXBKg1WabBKg1UarNJglQarNFilk1U6WaWTVTpZpZNVOlmlk1U6WaWTVTpZpTurdGeV7qzSnVW6s0p3VunOKt1ZpTurdGeVHqzSg1V6sEoPVunBKj1YpQer9GCVHqzSg1V6skpPVunJKj1ZpSer9GSVnqzSk1V6skpPVunFKr1YpRer9GKVXqzSi1V6sUovVunFKr1Ypa3R1Umju5NGlyeNbk8aXZ80uj9pdIHS6Aal0RVKozUv1GW05nxhxjdmfGXGd2Z8aca3ZnxtRvdmRhdn5nxHSmtOd2dGl2dGt2dG12dG92dGF2hGN2hGV2hGd2gWfDFOa07XaEb3aEYXaUY3aUZXaUZ3aUaXaUa3aUbXaQb+0xBac7pRM7pSM7pTM7pUM7pVM7pWM7pXM7pYM7pZM7paM7pbM7pcM7pdM7peM7pfM7pgM7phM7piM7pjM7pks85/7klrTvdsRhdtRjdtRldtRndtRpdtRrdtRtdtRvdtNvgPu2nN6crN6M7N6NLN6NbN6NrN6N7N6OLN6ObN6OrNJv+EA6053b4ZXb8Z3b8ZXcAZ3cAZXcEZ3cEZXcIZ3cLZ4h9r4Z9roR9soXs4p3s4p3s4p3s4p3s4p3s4p3s4p3s4p3s4N/5hJlpzuodzuodzuodzuodzuodzuodzuodz/vk1/gG2whNstOb8M2z8Q2z8U2z8Y2z8c2z8g2x0D+d0D+d0D+fBP7ZIa073cE73cE73cE73cE73cE73cE73cE73cE73cA7+WVVac7qHc7qHc7qHc7qHc7qHc7qHc7qHc7qHc7qHc7qHc7qHc7qHc7qHc7qHc7qHc7qHc7qHc7qHc7qHc7qH884/lU5rTvdwTvdwTvdwTvdwTvdwTvdwTvdwTvdwTvdwvt/DZazTooStL9a9eXI1fPnxaoTN7WqMnYtHzuO1Y+HxheM0z7iyedZ1zbPfN37DeezK5vELzBMxtnmQ5/McN4nX2ASX2GRg22S2nU3yIpvE4yZrZ5PxGpvsBksi+7bJ6M9u4o+3K3y7evfiHvPkxI4W5xcfJ9r/pwNxNtF4ZqIVpz3WfPzGMOxde/ic+XjtoRE9+85oe6+LZacXzjwLBthx+v2SW2Z6k57epacP6ekhPX2Xnn5ITz+lp1dOq2jKaRVNOa2iKadVNOW0iqacVrH/0bLM9MpZG+0CWWutn34oM/P2zPz7NdTOT/ht+wnf8+w1x2nypTq5NdnJTXZyl508ZCeH7OQpO3mXnVw2iWzKTi6boS6boS6boS6boS6boS6boS6boS6boS6boS6boS6boSGboSGboSGboSGboSGboSGboSGboSGboSGboSGboZDNUMhmKGQzFLIZCtkMhWyGQjZDIZuhkM1QyGZoymZoymZoymZoymZoymZoymZoymZoymZoymZoymZol83QLpuhXTZDu2yGdtkM7bIZ2mUztMtmaJfN0C6boUM2Q4dshg7ZDB2yGTpkM3TIZuiQzdAhm6FDNkOHbIZO2Qydshk6ZTN0ymbolM3QKZuhUzZDp2yGTtkMnbIZumQzdMlm6JLN0CWboZdg7HyjyWUzdMlm6JLN0CWboUs1Q9FUMxRNNUPRVDMUTTVD0VQzFE01Q9FUMxSytB801QyFLKcIspwiyHKKIMspgiynCLKcIshyiiDLKYIspwiynCLIcoogyymCLKcIspwiyHKKIMspgiynCLKcIshyiiDLKYIspwiynCLIcoogyymCLKcIspwiyHKKIMspgiynCLKcIshyiiDLKYIspwiynCLIcoogyymCLKcIspwiyHKKIMspgiynCLKcIshyiiDLKYIspwiynCLIcoogyymCLKcIspwiyHKKIMspgiynCLKcIshyiiDLKYIspwiynCLIcoogyymCLKcIspwiyHKKIMspgiynCLKcIshyiiDLKYIspwiynCLIcoogyymCLKcIspwiyHKKIMspgiynCLKcIshyiiDLKYIspwiynCLIcoogyymCLKcIspwiyHKKIMspgiynCLKcIshyilKWU5SynKKU5RSlLKcom2qGpiynKGU5RSnLKUpZTlHKcopSllOUspyilOUUpSynKGU5RSnLKUpZTlHKcopSllOUspyilOUUpSynKGU5RSnLKUpZTlHKcopSllOUspyilOUUpSynKGU5RSnLKUpZTlHKcopSllOUspyilOUUpSynKGU5RSnLKUpZTlHKcopSllOUspyilOUUpSynKGU5RSnLKUpZTlHKcopSllOUspyilOUUpSynKGU5RSnLKUpZTlHKcopSllOUspyilOUUpSynKGU5RSnLKUpZTlHKcopSllOUspyilOUUpSynKGU5RSnLKUpZTlHKcopSllOUspyilOUUpSynKGU5RSnLKUpZTlHKcopSllOUspyilOUUpSynKGU5RSnLKUpZTlHKcopSllOUL+AUTTw3ubWxTZ72xS5Pr84InF47+tqu3n3ptHW6Ken2zMUztznm4QTnFx8P69/TYeN7Oiy+p8Pm93TY/vqHtbUddrSvz299nP4pPvz28bAe2wGG+gGm+gGW9gH6CxBOV34AUz+AX/kB0rYDzPbFAZ5eDV9+vBphc7t6d46R2xvIdXbCON2Y+PvG7N+Y/PvG7N+Yaw/0b3Zjrv2Nwje7Mdf+BoS6MRFjuzHI8xtzPO21v1u56Gnt2t/acKcd2E57dvXjaa/9fRB52ng87do57fNvmtZzrVifcdqkT4ydTeI1NsFrbJKX2CSxbdL3NOmvscl4jU3mRTTxbZNhX0+psHGKqcM31dl393GgF2CCLjyQ4/RjS3j6k4HiEndotdMefRmeyvCC/wj8gk3ctk2iP93kBf9n9wW3dq3HTeZf0xrx2gM9o3W/xB1a/VHr5V8fyAMnzTz6fDqQX9tAtFH/XDesuM6L66K4DsV1WVzXi+tGcd0srivqPltxXdEvs+iXWfTLLPplFv0yi36ZRb/Mol9m0S+r6JdV9Msq+mUV/bKKfllFv6yiX1bRL6vol1Xzy2ituM6K67y4LorrUFyXxXW9uG4U183iuqJfrOgXK/rFin6xol+s6Bcr+sWKfrGiX6zoFyv6xYt+8aJfvOgXL/rFi37xol+86Bcv+sWLfvGiX6Lolyj6JYp+iaJfouiXKPolin6Jol+i6Jco+gVFv6DoFxT9gqJfUPQLin5B0S8o+gVFv6Dolyz6JYt+yaJfsuiXLPoli37Jol+y6Jcs+iWLfulFv/SiX3rRL73ol170Sy/6pRf90ot+6UW/FHvaMYp+Kfa7o9jvjkK/e/jqv7e/3t3+8P7dx8Oaz3/52/2PD3cf7o9fPvzvlz//5nDt/wE="}],"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":"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":"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":"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"},{"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":"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":"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":"fee_limit","type":{"kind":"field"}}],"kind":"struct","path":"GasToken::check_balance_parameters"}}],"kind":"struct","path":"GasToken::check_balance_abi"}]}},"file_map":{"122":{"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"},"126":{"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"},"129":{"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"},"136":{"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"},"140":{"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"},"141":{"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 start_side_effect_counter: reader.read_u32(),\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 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"},"144":{"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"},"145":{"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"},"147":{"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, T_SERIALIZED_LEN> PublicMutable<T, &mut PublicContext> where T: Serialize<T_SERIALIZED_LEN> + Deserialize<T_SERIALIZED_LEN> {\n // docs:start:public_mutable_struct_read\n pub fn read(self) -> T {\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(self, value: T) {\n self.context.storage_write(self.storage_slot, value);\n }\n // docs:end:public_mutable_struct_write\n}\n\nimpl<T, T_SERIALIZED_LEN> PublicMutable<T, UnconstrainedContext> where T: Deserialize<T_SERIALIZED_LEN> {\n unconstrained pub fn read(self) -> T {\n self.context.storage_read(self.storage_slot)\n }\n}\n"},"150":{"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, T_SERIALIZED_LEN> SharedImmutable<T, &mut PublicContext> where T: Serialize<T_SERIALIZED_LEN> + Deserialize<T_SERIALIZED_LEN> {\n // Intended to be only called once. \n pub fn initialize(self, value: T) {\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(self) -> T {\n self.context.storage_read(self.storage_slot)\n }\n}\n\nimpl<T, T_SERIALIZED_LEN> SharedImmutable<T, UnconstrainedContext> where T: Serialize<T_SERIALIZED_LEN> + Deserialize<T_SERIALIZED_LEN> {\n unconstrained pub fn read_public(self) -> T {\n self.context.storage_read(self.storage_slot)\n }\n}\n\nimpl<T, T_SERIALIZED_LEN> SharedImmutable<T, &mut PrivateContext> where T: Serialize<T_SERIALIZED_LEN> + Deserialize<T_SERIALIZED_LEN> {\n pub fn read_private(self) -> T {\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"},"168":{"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"},"170":{"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"},"171":{"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"},"173":{"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 = 0x15c9b0a92b9b541598e24c9f0b0b4b04b7f2408599751c45aa12de671fd9b363;\n assert_eq(hash, test_data_empty_hash);\n}\n"},"174":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/public_call_stack_item_compressed.nr","source":"use crate::abis::{call_context::CallContext, function_data::FunctionData, gas::Gas};\nuse crate::address::AztecAddress;\nuse crate::constants::{GENERATOR_INDEX__CALL_STACK_ITEM, PUBLIC_CALL_STACK_ITEM_COMPRESSED_LENGTH};\nuse crate::traits::{Hash, Empty, Serialize, Deserialize};\nuse crate::utils::reader::Reader;\n\n/**\n * A compressed version of the PublicCallStackItem struct used to compute the \"hash\"\n * of a PublicCallStackItem.\n * \n * Historically, we have been zeroing most values in the PublicCallStackItem struct\n * to compute the hash involved when adding a PublicCallStackItem to the PublicCallStack.\n * \n * This struct is used to store the values that we did not zero out, and allow us to hash\n * only these, thereby skipping a lot of computation and saving us a lot of constraints\n * \n * Essentially this struct exists such that we don't have a `hash` function in the \n * PublicCallStackItem struct that practically throws away some values of the struct\n * without clearly indicating that it does so.\n */\nstruct PublicCallStackItemCompressed {\n contract_address: AztecAddress,\n call_context: CallContext,\n function_data: FunctionData,\n args_hash: Field,\n returns_hash: Field,\n revert_code: u8,\n start_gas_left: Gas,\n end_gas_left: Gas,\n}\n\nimpl Eq for PublicCallStackItemCompressed {\n fn eq(self, other: PublicCallStackItemCompressed) -> bool {\n (self.contract_address == other.contract_address)\n & (self.call_context == other.call_context)\n & (self.function_data == other.function_data)\n & (self.args_hash == other.args_hash)\n & (self.returns_hash == other.returns_hash)\n & (self.revert_code == other.revert_code)\n & (self.start_gas_left == other.start_gas_left)\n & (self.end_gas_left == other.end_gas_left)\n }\n}\n\nimpl Hash for PublicCallStackItemCompressed {\n fn hash(self) -> Field {\n std::hash::pedersen_hash_with_separator(self.serialize(), GENERATOR_INDEX__CALL_STACK_ITEM)\n }\n}\n\nimpl Empty for PublicCallStackItemCompressed {\n fn empty() -> Self {\n PublicCallStackItemCompressed {\n contract_address: AztecAddress::empty(),\n call_context: CallContext::empty(),\n function_data: FunctionData::empty(),\n args_hash: 0,\n returns_hash: 0,\n revert_code: 0,\n start_gas_left: Gas::empty(),\n end_gas_left: Gas::empty(),\n }\n }\n}\n\nimpl Serialize<PUBLIC_CALL_STACK_ITEM_COMPRESSED_LENGTH> for PublicCallStackItemCompressed {\n fn serialize(self) -> [Field; PUBLIC_CALL_STACK_ITEM_COMPRESSED_LENGTH] {\n let mut fields: BoundedVec<Field, PUBLIC_CALL_STACK_ITEM_COMPRESSED_LENGTH> = BoundedVec::new();\n\n fields.push(self.contract_address.to_field());\n fields.extend_from_array(self.call_context.serialize());\n fields.extend_from_array(self.function_data.serialize());\n fields.push(self.args_hash);\n fields.push(self.returns_hash);\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\n assert_eq(fields.len(), PUBLIC_CALL_STACK_ITEM_COMPRESSED_LENGTH);\n\n fields.storage\n }\n}\n\nimpl Deserialize<PUBLIC_CALL_STACK_ITEM_COMPRESSED_LENGTH> for PublicCallStackItemCompressed {\n fn deserialize(fields: [Field; PUBLIC_CALL_STACK_ITEM_COMPRESSED_LENGTH]) -> PublicCallStackItemCompressed {\n let mut reader = Reader::new(fields);\n\n let item = PublicCallStackItemCompressed {\n contract_address: reader.read_struct(AztecAddress::deserialize),\n call_context: reader.read_struct(CallContext::deserialize),\n function_data: reader.read_struct(FunctionData::deserialize),\n args_hash: reader.read(),\n returns_hash: reader.read(),\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 };\n reader.finish();\n item\n }\n}\n"},"176":{"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"},"177":{"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"},"180":{"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"},"181":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/validation_requests/key_validation_request.nr","source":"use crate::{constants::KEY_VALIDATION_REQUEST_LENGTH, traits::{Empty, Serialize, Deserialize}, point::Point};\n\nstruct KeyValidationRequest {\n pk_m: Point,\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: Point::empty(),\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.pk_m.is_infinite as Field,\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: Point { x:fields[0], y: fields[1], is_infinite: fields[2] as bool},\n sk_app: fields[3],\n }\n }\n}\n\n"},"185":{"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"},"194":{"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"},"195":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/private_call_request.nr","source":"use crate::{\n abis::{\n private_call_stack_item::PrivateCallStackItem, call_context::CallContext,\n function_data::FunctionData, caller_context::CallerContext,\n side_effect::{Ordered, RangeOrdered, Scoped}\n},\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 target: AztecAddress,\n call_context: CallContext,\n function_data: FunctionData,\n args_hash: Field,\n returns_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.target == other.target) \n & (self.call_context == other.call_context) \n & (self.function_data == other.function_data) \n & (self.args_hash == other.args_hash) \n & (self.returns_hash == other.returns_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 target: AztecAddress::empty(),\n call_context: CallContext::empty(),\n function_data: FunctionData::empty(),\n args_hash: 0,\n returns_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.target.to_field());\n fields.extend_from_array(self.call_context.serialize());\n fields.extend_from_array(self.function_data.serialize());\n fields.push(self.args_hash);\n fields.push(self.returns_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 target: reader.read_struct(AztecAddress::deserialize),\n call_context: reader.read_struct(CallContext::deserialize),\n function_data: reader.read_struct(FunctionData::deserialize),\n args_hash: reader.read(),\n returns_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 pub fn matches_stack_item(self, stack_item: PrivateCallStackItem) -> bool {\n (self.target == stack_item.contract_address)\n & (self.call_context == stack_item.public_inputs.call_context)\n & (self.function_data == stack_item.function_data)\n & (self.args_hash == stack_item.public_inputs.args_hash)\n & (self.returns_hash == stack_item.public_inputs.returns_hash)\n & (self.start_side_effect_counter\n == stack_item.public_inputs.start_side_effect_counter)\n & (self.end_side_effect_counter\n == stack_item.public_inputs.end_side_effect_counter)\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"},"200":{"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"},"209":{"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 = 0x065f2831db9ac0db5e710bd3a865b5facd8cf83f1585e1af8fd1d6ce9c47f685;\n assert_eq(hash, test_data_empty_hash);\n}\n"},"210":{"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"},"212":{"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"},"216":{"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"},"217":{"path":"/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/abis/call_context.nr","source":"use crate::{\n abis::function_selector::FunctionSelector, address::AztecAddress,\n constants::{CALL_CONTEXT_LENGTH, GENERATOR_INDEX__CALL_CONTEXT}, hash::pedersen_hash,\n traits::{Deserialize, Hash, Serialize, Empty}, 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// docs:end:call-context\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 \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 }\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 }\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 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"},"218":{"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"},"22":{"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"},"221":{"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"},"228":{"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"},"23":{"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"},"230":{"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"},"235":{"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"},"236":{"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"},"237":{"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"},"238":{"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"},"239":{"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"},"240":{"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"},"241":{"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"},"242":{"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"},"244":{"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"},"248":{"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"},"249":{"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"},"25":{"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#[no_predicates]\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 multi_scalar_mul(generators, points)\n}\n\n#[no_predicates]\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 ).x\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"},"250":{"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"},"264":{"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"},"274":{"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"},"276":{"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"},"290":{"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"},"291":{"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,\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"},"293":{"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"},"294":{"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"},"295":{"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"},"296":{"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"},"297":{"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"},"30":{"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 #[no_predicates]\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"},"302":{"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"},"32":{"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"},"4":{"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"},"47":{"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"},"80":{"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"},"86":{"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"},"89":{"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"},"93":{"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::pack_arguments;\nuse crate::hash::hash_args;\n\ntrait CallInterface<N, T, P, Env> {\n fn get_original(self) -> fn[Env](T) -> P;\n\n fn get_args(self) -> [Field] {\n self.args\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\nimpl<N, T, P, Env> CallInterface<N, PrivateContextInputs, PrivateCircuitPublicInputs, Env> for PrivateCallInterface<N, T, Env> {\n fn get_original(self) -> fn[Env](PrivateContextInputs) -> PrivateCircuitPublicInputs {\n self.original\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 assert(self.args_hash == pack_arguments(self.args));\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 assert(self.args_hash == pack_arguments(self.args));\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 assert(self.args_hash == pack_arguments(self.args));\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_original(self) -> fn[Env](PrivateContextInputs) -> PrivateCircuitPublicInputs {\n self.original\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 assert(self.args_hash == pack_arguments(self.args));\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 assert(self.args_hash == pack_arguments(self.args));\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 assert(self.args_hash == pack_arguments(self.args));\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_original(self) -> fn[Env](PrivateContextInputs) -> PrivateCircuitPublicInputs {\n self.original\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 assert(self.args_hash == pack_arguments(self.args));\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_original(self) -> fn[Env](PrivateContextInputs) -> PrivateCircuitPublicInputs {\n self.original\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 assert(self.args_hash == pack_arguments(self.args));\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_original(self) -> fn[Env](PublicContextInputs) -> T {\n self.original\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 let args_hash = hash_args(self.args);\n assert(args_hash == 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 let args_hash = hash_args(self.args);\n assert(args_hash == 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 let args_hash = hash_args(self.args);\n assert(args_hash == 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_original(self) -> fn[Env](PublicContextInputs) -> () {\n self.original\n }\n}\n\nstruct PublicVoidCallInterface<N, Env> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<N>,\n args: [Field],\n original: fn[Env](PublicContextInputs) -> (),\n is_static: bool,\n gas_opts: GasOpts\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 let args_hash = hash_args(self.args);\n assert(args_hash == 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 let args_hash = hash_args(self.args);\n assert(args_hash == 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 let args_hash = hash_args(self.args);\n assert(args_hash == 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_original(self) -> fn[Env](PublicContextInputs) -> T {\n self.original\n }\n}\n\nstruct PublicStaticCallInterface<N, T, Env> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<N>,\n args: [Field],\n original: fn[Env](PublicContextInputs) -> T,\n is_static: bool,\n gas_opts: GasOpts\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 let args_hash = hash_args(self.args);\n assert(args_hash == 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_original(self) -> fn[Env](PublicContextInputs) -> () {\n self.original\n }\n}\n\nstruct PublicStaticVoidCallInterface<N, Env> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<N>,\n args: [Field],\n original: fn[Env](PublicContextInputs) -> (),\n is_static: bool,\n gas_opts: GasOpts\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 let args_hash = hash_args(self.args);\n assert(args_hash == 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"},"94":{"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.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 {\n target: item.contract_address,\n call_context: item.public_inputs.call_context,\n function_data: item.function_data,\n args_hash: item.public_inputs.args_hash,\n returns_hash: item.public_inputs.returns_hash,\n caller_context,\n start_side_effect_counter,\n end_side_effect_counter\n }\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.get_compressed().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.get_compressed().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.start_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"},"95":{"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"}}}
|