@aztec/accounts 0.77.0-testnet-ignition.30 → 0.77.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,118 +3,6 @@
3
3
  "noir_version": "1.0.0-beta.3+0000000000000000000000000000000000000000",
4
4
  "name": "SchnorrSingleKeyAccount",
5
5
  "functions": [
6
- {
7
- "name": "process_log",
8
- "is_unconstrained": true,
9
- "custom_attributes": [],
10
- "abi": {
11
- "error_types": {
12
- "16775516380094354375": {
13
- "error_kind": "fmtstring",
14
- "item_types": [],
15
- "length": 40
16
- },
17
- "17843811134343075018": {
18
- "error_kind": "string",
19
- "string": "Stack too deep"
20
- }
21
- },
22
- "parameters": [
23
- {
24
- "name": "_log_plaintext",
25
- "type": {
26
- "fields": [
27
- {
28
- "name": "storage",
29
- "type": {
30
- "kind": "array",
31
- "length": 18,
32
- "type": {
33
- "kind": "field"
34
- }
35
- }
36
- },
37
- {
38
- "name": "len",
39
- "type": {
40
- "kind": "integer",
41
- "sign": "unsigned",
42
- "width": 32
43
- }
44
- }
45
- ],
46
- "kind": "struct",
47
- "path": "std::collections::bounded_vec::BoundedVec"
48
- },
49
- "visibility": "private"
50
- },
51
- {
52
- "name": "_tx_hash",
53
- "type": {
54
- "kind": "field"
55
- },
56
- "visibility": "private"
57
- },
58
- {
59
- "name": "_unique_note_hashes_in_tx",
60
- "type": {
61
- "fields": [
62
- {
63
- "name": "storage",
64
- "type": {
65
- "kind": "array",
66
- "length": 64,
67
- "type": {
68
- "kind": "field"
69
- }
70
- }
71
- },
72
- {
73
- "name": "len",
74
- "type": {
75
- "kind": "integer",
76
- "sign": "unsigned",
77
- "width": 32
78
- }
79
- }
80
- ],
81
- "kind": "struct",
82
- "path": "std::collections::bounded_vec::BoundedVec"
83
- },
84
- "visibility": "private"
85
- },
86
- {
87
- "name": "_first_nullifier_in_tx",
88
- "type": {
89
- "kind": "field"
90
- },
91
- "visibility": "private"
92
- },
93
- {
94
- "name": "_recipient",
95
- "type": {
96
- "fields": [
97
- {
98
- "name": "inner",
99
- "type": {
100
- "kind": "field"
101
- }
102
- }
103
- ],
104
- "kind": "struct",
105
- "path": "authwit::aztec::protocol_types::address::aztec_address::AztecAddress"
106
- },
107
- "visibility": "private"
108
- }
109
- ],
110
- "return_type": null
111
- },
112
- "bytecode": "H4sIAAAAAAAA/+Wc6XLbNhDHKZu0TcmyZPmK3Svp3bRpKYnU0dNt0/u+lM+KYz8HHyPta7Rf2qer/jFXWsHojDteTPxPMMOhpYV2f1wuARBYuBadl8nsqFV/x9V5vTrj+060XKTucXXOrla6hrqyUIw1AsYVAsZVAsaYgDEhYFwjYFwnYNwgYEwJGOsEjA0Cxk0CxiYB4xYBY4uAsU3AuB2AMQRnh4Rzx5BTj+1D8e5G1z9G9wgY9wkYDwgYbxAwHhIwHhEwPkPA+CwB43MEjM8TML5AwHiTgPEWAeOLBIwvETC+TMD4CgHjqwSMrxEwvk7A+AYB420CxjcJGN8iYLxDwPg2AeM7BIwZAWOXgLFHwNgnYMwJGAsCxgEB45CAcUTAOCZgfJeA8T0CxvcJGD8gYPyQgPEjAsZjAsaPCRg/IWD8lIDxLgHjZwSMnxMwfkHA+CUB41cEjF8TMH5DwPgtAeN3BIzfEzD+QMD4IwHjTwSMPxMw/hKAMQTnryScv5FwTgJxRvcc6JXZgY1b2BiFjUfY2IONM9iYgo0f2FiBjQvYGIDEeyS2I3G8PTuQ+IykYiTsIgkWSaZI4kSSJJIQkeSHJDokqSEJDElWSGJCktDN2XFrdiCJBEkaSIJAkgEW8bFIjkVoLPJiERWLlFgExCIbFrGwSISrwiIHFhEwSY9JcEwyYxIXk6SYhMQkHybRMEmFSSBMsmASQyYJ8JKLl0i8pOElCC8ZGMRjkIxBKAZ5GERhkIJBADpZdGLoJNAIo5FDI4KHFA8AgmsS/XeRIPmnOqfVeUXJDTfRdVPHrqX+UTa+n3quz5C/n1Y6N4LoL4aiPw3Dn8lG27vlQr++FrG7Wp0n5cKXk3KZSeo8VHUeOnXkesLc7zwP669ur+n4KFLXIrbrYWz3a449fV+0TOzXo5Cxeb4pWdsTHtc/0nY0pU654Kk5sri8eB0iS5RM7i/s3Fb13NjacGTCgiLx21S+kXKvksk9jZVOu3gtRmHjNc8eX7zm3ScxXmNHFpcXr+P/xquOLTdek2hRpC0V2ZqS/e7I1pXsj3Jhu1Acg+rvsG3yeR+snz3rPmzHw69toayXC39IDK6q7xLlv0f+0fUdWapkcblsp159jpUdrUs4Eqd+Xn1uVec19Rv5fdtjf82xv8Tt+c71S+qpn3rqI9buVH83qgMx9Jf8Jrr47OI4rj5nVyrDwtdO2ukfdH1toaH+U9HfCKK/l4n+zTD8836qGeb+DkT/Vhj+efy0wvD3RH87DP+Z6N8Owz9/j+kE0V/Mx+U7Yfjn8b8bxv9z/r0w/HP9+2H45/f3IIz+sYw7bkSL4o4zD9X3dv1/b3zZcabYrzusocaZhw6P6x89zoTsyMPa9sjcZ/TIY+fIY8ena9NQ14Ghrm1DXQ1DXfuGutqGuuqGuvYMdbUMdaWGuizvo6W/LGN111CXZaxuGeq6ru2E5fNo6fvrGqsbhrosY8IyVi39tWOoy7KNthwDNA11WfYdls/QdY2vp6H9CtEPhV0PzDLfPFhkp987D2aoPxNfS6zquW9tU64vcer/6fh5M4ife1N5J5M2SPvCN1dlabvm2Isi//us2G96eIS77pFd5R/Mno5OTsf383wwzIuifzKsOfqF1f1OzzvrPkfX970b++bVDH098q3xtJRfUWIl23JkiZIJo17j8c07WvJfxv/aftsjc8del72XnWg51vTz2IgWz3Bc2l/7cHTeljxirPQn0fIabuTYT5z6f1ef3bbuqs/I2XDaPetPz6bF9MGD/GTacfRrH8JP/wJJ9PoyCV0AAA==",
113
- "debug_symbols": "tZbdCoMgGIbvxWMP0tKv7VbGGFY2BLGwGozo3qdjP7EdvyfRK58+HvjAu7LONsv14kI/TOx4WpkfWjO7IaS0bpw10Xnvrpf9MivyRyj93DCNJuQ8zSbO7ChKeZCc2dDl/7KS6ZDeeZtTsfG/eXoPE30mldjOPAEIDajRgAMYoAs0QKABEg0o0YAKDVBoANpkjTZZo03WaJMJbTKhTSa0yYQ2mdAmE9pkQptMaJMJavKW0s1EZxpvXw2nX0K7KzzzfbQ/3WeMQ2u7Jdrcgr4FKL/GSnIl87WzvaIuuKhVgiTQAw==",
114
- "brillig_names": [
115
- "process_log"
116
- ]
117
- },
118
6
  {
119
7
  "name": "verify_private_authwit",
120
8
  "is_unconstrained": false,
@@ -1747,7 +1635,7 @@
1747
1635
  }
1748
1636
  },
1749
1637
  "bytecode": "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",
1750
- "debug_symbols": "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h6daHjyXkwfP5WTFc7lbXa14LveT9NDxePBcTh48l5MHz+XkwXM5efBcTh48l5MVz+Vux2PFc7mfpIenWh48l5MHz+VkxXO5X109dDwePJeTB8/l5MFzOXnwXE4ePJeTB8/l5MFzOVnxXO52PFY8l/tJeniq5cFzOXnwXE5WPJe71dWK53I/SQ8djwfP5eTBczl58FxOHjyXkwfP5eTBczlZ8VzudjxWPJd7SYoHz2Xx4LksHjyXxYrncq+6yiAeknTQ8YgHz2Xx4LksHjyXxYPnsnjwXBYPnstixXO52/FY8VzuJykeknTwVEs8eC6LFc/lfnX10PF48FwWD57L4sFzWTx4LosHz2Xx4LksHjyXxYrncrfjseK53E/SwVMt8eC5LB48l8WK53K3ulrxXO4n6aHj8eC5LB48l8WD57J48FwWD57L4sFzWax4Lnc7Hiuey/0kPTzV8uC5LB48l8WK53K/unroeDx4LosHz2Xx4LksHjyXxYPnsnjwXBYPnstixXO52/FY8VzuJ+nhqZYHz2Xx4LksVjyXu9XViudyP0kPHY8Hz2Xx4LksHjyXxYPnsnjwXBYPnstixXO52/FY8VzuJunBc1k8eC6LB89lseK53K2uVjyX+0l66Hg8eC6LB89l8eC5LB48l8WD57J48FwWK57L3Y7HiudyP0nxkKSHp1oePJfFiudyv7p66Hg8eC6LB89l8eC5LB48l8WD57J48FwWD57LYsVzudvxWPFc7ifp4amWB8/l7MFzOVvxXO5V12zFc7mfpIOOJw/iIUkHHU/24LmcPXguZw+ey9mD53K24rnc7XiseC73k3TwVCt78FzOHjyXsxXP5X519dDxePBczh48l7MHz+XswXM5e/Bczh48l7MHz+VsxXO52/FY8VzuJ+ngqVb24LmcPXguZyuey93q6sFzOVvxXO4n6eEejxXP5X6S4iFJD/d4rHgu94+kh47HiudyP0kP7/F48FzOVjyXu9XViudyP0kP93iseC73k7TR8UjMU5IS602SejuePEwb5yb9JENs47xvCvPiVIcfWepteV6UZW6XLMttlnp7npdkKSlO+4rk2yz1Nj2vmKVi3+XXzFJv2/OaWerte14zS72Nz2tmKTayzMOcZUm3WeptfV4zSxu9z1aWNnqfrSyN9D4bWRrpffpZKnZgftmVJFyylNssjfQ+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",
1638
+ "debug_symbols": "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",
1751
1639
  "brillig_names": [
1752
1640
  "get_auth_witness",
1753
1641
  "decompose_hint",
@@ -1759,6 +1647,138 @@
1759
1647
  ],
1760
1648
  "verification_key": "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"
1761
1649
  },
1650
+ {
1651
+ "name": "process_log",
1652
+ "is_unconstrained": true,
1653
+ "custom_attributes": [],
1654
+ "abi": {
1655
+ "error_types": {
1656
+ "16775516380094354375": {
1657
+ "error_kind": "fmtstring",
1658
+ "item_types": [],
1659
+ "length": 40
1660
+ },
1661
+ "17843811134343075018": {
1662
+ "error_kind": "string",
1663
+ "string": "Stack too deep"
1664
+ }
1665
+ },
1666
+ "parameters": [
1667
+ {
1668
+ "name": "_log_plaintext",
1669
+ "type": {
1670
+ "fields": [
1671
+ {
1672
+ "name": "storage",
1673
+ "type": {
1674
+ "kind": "array",
1675
+ "length": 18,
1676
+ "type": {
1677
+ "kind": "field"
1678
+ }
1679
+ }
1680
+ },
1681
+ {
1682
+ "name": "len",
1683
+ "type": {
1684
+ "kind": "integer",
1685
+ "sign": "unsigned",
1686
+ "width": 32
1687
+ }
1688
+ }
1689
+ ],
1690
+ "kind": "struct",
1691
+ "path": "std::collections::bounded_vec::BoundedVec"
1692
+ },
1693
+ "visibility": "private"
1694
+ },
1695
+ {
1696
+ "name": "_tx_hash",
1697
+ "type": {
1698
+ "kind": "field"
1699
+ },
1700
+ "visibility": "private"
1701
+ },
1702
+ {
1703
+ "name": "_unique_note_hashes_in_tx",
1704
+ "type": {
1705
+ "fields": [
1706
+ {
1707
+ "name": "storage",
1708
+ "type": {
1709
+ "kind": "array",
1710
+ "length": 64,
1711
+ "type": {
1712
+ "kind": "field"
1713
+ }
1714
+ }
1715
+ },
1716
+ {
1717
+ "name": "len",
1718
+ "type": {
1719
+ "kind": "integer",
1720
+ "sign": "unsigned",
1721
+ "width": 32
1722
+ }
1723
+ }
1724
+ ],
1725
+ "kind": "struct",
1726
+ "path": "std::collections::bounded_vec::BoundedVec"
1727
+ },
1728
+ "visibility": "private"
1729
+ },
1730
+ {
1731
+ "name": "_first_nullifier_in_tx",
1732
+ "type": {
1733
+ "kind": "field"
1734
+ },
1735
+ "visibility": "private"
1736
+ },
1737
+ {
1738
+ "name": "_recipient",
1739
+ "type": {
1740
+ "fields": [
1741
+ {
1742
+ "name": "inner",
1743
+ "type": {
1744
+ "kind": "field"
1745
+ }
1746
+ }
1747
+ ],
1748
+ "kind": "struct",
1749
+ "path": "authwit::aztec::protocol_types::address::aztec_address::AztecAddress"
1750
+ },
1751
+ "visibility": "private"
1752
+ }
1753
+ ],
1754
+ "return_type": null
1755
+ },
1756
+ "bytecode": "H4sIAAAAAAAA/+Wc6XLbNhDHKZu0TcmyZPmK3Svp3bRpKYnU0dNt0/u+lM+KYz8HHyPta7Rf2qer/jFXWsHojDteTPxPMMOhpYV2f1wuARBYuBadl8nsqFV/x9V5vTrj+060XKTucXXOrla6hrqyUIw1AsYVAsZVAsaYgDEhYFwjYFwnYNwgYEwJGOsEjA0Cxk0CxiYB4xYBY4uAsU3AuB2AMQRnh4Rzx5BTj+1D8e5G1z9G9wgY9wkYDwgYbxAwHhIwHhEwPkPA+CwB43MEjM8TML5AwHiTgPEWAeOLBIwvETC+TMD4CgHjqwSMrxEwvk7A+AYB420CxjcJGN8iYLxDwPg2AeM7BIwZAWOXgLFHwNgnYMwJGAsCxgEB45CAcUTAOCZgfJeA8T0CxvcJGD8gYPyQgPEjAsZjAsaPCRg/IWD8lIDxLgHjZwSMnxMwfkHA+CUB41cEjF8TMH5DwPgtAeN3BIzfEzD+QMD4IwHjTwSMPxMw/hKAMQTnryScv5FwTgJxRvcc6JXZgY1b2BiFjUfY2IONM9iYgo0f2FiBjQvYGIDEeyS2I3G8PTuQ+IykYiTsIgkWSaZI4kSSJJIQkeSHJDokqSEJDElWSGJCktDN2XFrdiCJBEkaSIJAkgEW8bFIjkVoLPJiERWLlFgExCIbFrGwSISrwiIHFhEwSY9JcEwyYxIXk6SYhMQkHybRMEmFSSBMsmASQyYJ8JKLl0i8pOElCC8ZGMRjkIxBKAZ5GERhkIJBADpZdGLoJNAIo5FDI4KHFA8AgmsS/XeRIPmnOqfVeUXJDTfRdVPHrqX+UTa+n3quz5C/n1Y6N4LoL4aiPw3Dn8lG27vlQr++FrG7Wp0n5cKXk3KZSeo8VHUeOnXkesLc7zwP669ur+n4KFLXIrbrYWz3a449fV+0TOzXo5Cxeb4pWdsTHtc/0nY0pU654Kk5sri8eB0iS5RM7i/s3Fb13NjacGTCgiLx21S+kXKvksk9jZVOu3gtRmHjNc8eX7zm3ScxXmNHFpcXr+P/xquOLTdek2hRpC0V2ZqS/e7I1pXsj3Jhu1Acg+rvsG3yeR+snz3rPmzHw69toayXC39IDK6q7xLlv0f+0fUdWapkcblsp159jpUdrUs4Eqd+Xn1uVec19Rv5fdtjf82xv8Tt+c71S+qpn3rqI9buVH83qgMx9Jf8Jrr47OI4rj5nVyrDwtdO2ukfdH1toaH+U9HfCKK/l4n+zTD8836qGeb+DkT/Vhj+efy0wvD3RH87DP+Z6N8Owz9/j+kE0V/Mx+U7Yfjn8b8bxv9z/r0w/HP9+2H45/f3IIz+sYw7bkSL4o4zD9X3dv1/b3zZcabYrzusocaZhw6P6x89zoTsyMPa9sjcZ/TIY+fIY8ena9NQ14Ghrm1DXQ1DXfuGutqGuuqGuvYMdbUMdaWGuizvo6W/LGN111CXZaxuGeq6ru2E5fNo6fvrGqsbhrosY8IyVi39tWOoy7KNthwDNA11WfYdls/QdY2vp6H9CtEPhV0PzDLfPFhkp987D2aoPxNfS6zquW9tU64vcer/6fh5M4ife1N5J5M2SPvCN1dlabvm2Isi//us2G96eIS77pFd5R/Mno5OTsf383wwzIuifzKsOfqF1f1OzzvrPkfX970b++bVDH098q3xtJRfUWIl23JkiZIJo17j8c07WvJfxv/aftsjc8del72XnWg51vTz2IgWz3Bc2l/7cHTeljxirPQn0fIabuTYT5z6f1ef3bbuqs/I2XDaPetPz6bF9MGD/GTacfRrH8JP/wJJ9PoyCV0AAA==",
1757
+ "debug_symbols": "tZbdCoMgGIbvxWMP0tKv7VbGGFY2BLGwGozo3qdjP7EdvyfRK58+HvjAu7LONsv14kI/TOx4WpkfWjO7IaS0bpw10Xnvrpf9MivyRyj93DCNJuQ8zSbO7ChKeZCc2dDl/7KS6ZDeeZtTsfG/eXoPE30mldjOPAEIDajRgAMYoAs0QKABEg0o0YAKDVBoANpkjTZZo03WaJMJbTKhTSa0yYQ2mdAmE9pkQptMaJMJavKW0s1EZxpvXw2nX0K7KzzzfbQ/3WeMQ2u7Jdrcgr4FKL/GSnIl87WzvaIuuKhVgiTQAw==",
1758
+ "brillig_names": [
1759
+ "process_log"
1760
+ ]
1761
+ },
1762
+ {
1763
+ "name": "sync_notes",
1764
+ "is_unconstrained": true,
1765
+ "custom_attributes": [],
1766
+ "abi": {
1767
+ "error_types": {
1768
+ "17843811134343075018": {
1769
+ "error_kind": "string",
1770
+ "string": "Stack too deep"
1771
+ }
1772
+ },
1773
+ "parameters": [],
1774
+ "return_type": null
1775
+ },
1776
+ "bytecode": "H4sIAAAAAAAA/7WTyw7CIBBFqcUo0sTEx39MU0y7dOHafyCtLHVRN+766dZkJkyI0QVwEzJMgMNcHoXwKjBKESGCHDEqjAs2Xs7tjDnEqVbBvin5HRijvvhLWH+jkFnk4QPxM50/rJBzmTyfe6F913PTrF8J/z5y+af7y+l//8OzRq9bzCvh/8P4uvfXx/M2ij/SbJGc0ptoOwAqvkT+EvmhJBvn8w+Yb4Svj6KMqNO1tnaNdfZkh8H0dhfwP+KH/QbzqHp4zgQAAA==",
1777
+ "debug_symbols": "ZY5bCsMgEEX3Mt9+aExbkq2EEkwyCYKo+CgUce/VEKi0P5e5w+FyEmy4xGOWejceximBMqsI0ujSUiawOKmUPOb2DbQG4yfvrdC1+iBcgJHxgVMCqLfzfvCysUuFtdFM/ng+dBfdM/Zl731+5lJfwkmxKLxs9qjXRi68Lf54WmdW3KLDatzIlpzYjXS0zJbpDw==",
1778
+ "brillig_names": [
1779
+ "sync_notes"
1780
+ ]
1781
+ },
1762
1782
  {
1763
1783
  "name": "entrypoint",
1764
1784
  "is_unconstrained": false,
@@ -3550,7 +3570,7 @@
3550
3570
  }
3551
3571
  },
3552
3572
  "bytecode": "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",
3553
- "debug_symbols": "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",
3573
+ "debug_symbols": "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Ed9jXWqgdyIyA32PdamB3okIDfRORLYK+x7rUgPJDZQZ6J2I0EDvRIQGeiciNNA7EaGB3onIDPQ91qUGeici60R8j3Wpgd6JCA0kN1BmoHciQgO9ExGuwt6JCA30TkRooHciMgN9j3Wpgd6JCA30TkRooHciQgPJDZQZ6J2IrBPxPdalBnonIjTQOxGhgd6JyAz0PdaFq7DvsS410DsRoYHeiQgNJDdQZqB3IkIDvRMRGuidiNBA70SEBnonIutEfI91qYHeiQgN9E5EaKB3IkIDyQ0UrcK+x7rUQO9EhAZ6JyI00DsRoYHeiYgMjME3WRc76L2I1EFvRqQOejci6kYuDpI7KHTQ+xGpg96QSB30jkTqoLck0rXYexKhg77duthB70mkDnpPInXQexKpg+QOCh30nkTqoPckUge9JxH2JL7tuthB70mEDvrG62IHvSeROug9iXAt9r3XxQ6SOyh00HsSqYPek0gd9J5E6qD3JFIHvScROuhbsIsd9J5E2JP4JuxiB70nkTpI7qDQQe9JpA56TyJdi70nkTroPYnUQe9JhA76ZuxiB70nkTroPYnUQe9JpA6SOyh00HsSYU/iW7KLHfSeROqg9yRSB70nETro27JL12Lfl13soPckUge9J5E6SO6g0EHvSaQOek8iddB7EqmD3pNIHfSeRNiT+AbtYge9J5E66D2J1EHvSaQOkjsoW4t9l3axg96TSB30nkTqoPckUge9JxE66Fu1ix30nkTqoPckUge9JxH2JL5du9hB70mkDnpPInXQexKpg96TSNdi70mEDvqm7WIHvSeROug9idRB70mkDpI7KHTQexKpg96TSB30nkTYk/jm7WIHvScROujbt4sd9J5E6qD3JMK12HdwFztI7qDQQe9JpA56TyJ10HsSqYPek0gd9J5E5mD0fdzFDnpPIutJou/jLnbQexKpg+QOCh30nkTqoPck0rXYexKpg96TSB30nkTooO/jLnbQexKpg96TSB30nkTqILmDQge9JxH2JL6Pu9hB70mkDnpPInXQexKhg76Pu3Qt9n3cxQ56TyJ10HsSqYPkDgod9J5E6qD3JFIHvSeROug9idRB70mEPYnv4y520HsSqYPek0gd9J5E6iC5g7K12PdxF9+D3pNIHfSeROqg9yRSB70nETro+7hL12Lfx118D3pPInXQexKpg+QO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",
3554
3574
  "brillig_names": [
3555
3575
  "get_auth_witness",
3556
3576
  "decompose_hint",
@@ -3565,32 +3585,39 @@
3565
3585
  "directive_integer_quotient"
3566
3586
  ],
3567
3587
  "verification_key": "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"
3568
- },
3569
- {
3570
- "name": "sync_notes",
3571
- "is_unconstrained": true,
3572
- "custom_attributes": [],
3573
- "abi": {
3574
- "error_types": {
3575
- "17843811134343075018": {
3576
- "error_kind": "string",
3577
- "string": "Stack too deep"
3578
- }
3579
- },
3580
- "parameters": [],
3581
- "return_type": null
3582
- },
3583
- "bytecode": "H4sIAAAAAAAA/7WTyw7CIBBFqcUo0sTEx39MU0y7dOHafyCtLHVRN+766dZkJkyI0QVwEzJMgMNcHoXwKjBKESGCHDEqjAs2Xs7tjDnEqVbBvin5HRijvvhLWH+jkFnk4QPxM50/rJBzmTyfe6F913PTrF8J/z5y+af7y+l//8OzRq9bzCvh/8P4uvfXx/M2ij/SbJGc0ptoOwAqvkT+EvmhJBvn8w+Yb4Svj6KMqNO1tnaNdfZkh8H0dhfwP+KH/QbzqHp4zgQAAA==",
3584
- "debug_symbols": "ZY5bCsMgEEX3Mt9+aExbkq2EEkwyCYKo+CgUce/VEKi0P5e5w+FyEmy4xGOWejceximBMqsI0ujSUiawOKmUPOb2DbQG4yfvrdC1+iBcgJHxgVMCqLfzfvCysUuFtdFM/ng+dBfdM/Zl731+5lJfwkmxKLxs9qjXRi68Lf54WmdW3KLDatzIlpzYjXS0zJbpDw==",
3585
- "brillig_names": [
3586
- "sync_notes"
3587
- ]
3588
3588
  }
3589
3589
  ],
3590
3590
  "outputs": {
3591
3591
  "globals": {},
3592
3592
  "structs": {
3593
3593
  "functions": [
3594
+ {
3595
+ "fields": [
3596
+ {
3597
+ "name": "parameters",
3598
+ "type": {
3599
+ "fields": [
3600
+ {
3601
+ "name": "inner_hash",
3602
+ "type": {
3603
+ "kind": "field"
3604
+ }
3605
+ }
3606
+ ],
3607
+ "kind": "struct",
3608
+ "path": "SchnorrSingleKeyAccount::verify_private_authwit_parameters"
3609
+ }
3610
+ },
3611
+ {
3612
+ "name": "return_type",
3613
+ "type": {
3614
+ "kind": "field"
3615
+ }
3616
+ }
3617
+ ],
3618
+ "kind": "struct",
3619
+ "path": "SchnorrSingleKeyAccount::verify_private_authwit_abi"
3620
+ },
3594
3621
  {
3595
3622
  "fields": [
3596
3623
  {
@@ -3773,33 +3800,6 @@
3773
3800
  ],
3774
3801
  "kind": "struct",
3775
3802
  "path": "SchnorrSingleKeyAccount::entrypoint_abi"
3776
- },
3777
- {
3778
- "fields": [
3779
- {
3780
- "name": "parameters",
3781
- "type": {
3782
- "fields": [
3783
- {
3784
- "name": "inner_hash",
3785
- "type": {
3786
- "kind": "field"
3787
- }
3788
- }
3789
- ],
3790
- "kind": "struct",
3791
- "path": "SchnorrSingleKeyAccount::verify_private_authwit_parameters"
3792
- }
3793
- },
3794
- {
3795
- "name": "return_type",
3796
- "type": {
3797
- "kind": "field"
3798
- }
3799
- }
3800
- ],
3801
- "kind": "struct",
3802
- "path": "SchnorrSingleKeyAccount::verify_private_authwit_abi"
3803
3803
  }
3804
3804
  ]
3805
3805
  }
@@ -3871,7 +3871,7 @@
3871
3871
  },
3872
3872
  "282": {
3873
3873
  "path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/types/src/hash.nr",
3874
- "source": "use crate::{\n abis::{\n contract_class_function_leaf_preimage::ContractClassFunctionLeafPreimage,\n contract_class_log::ContractClassLog,\n function_selector::FunctionSelector,\n note_hash::ScopedNoteHash,\n nullifier::ScopedNullifier,\n private_log::{PrivateLog, PrivateLogData},\n side_effect::{OrderedValue, scoped::Scoped},\n },\n address::{AztecAddress, EthAddress},\n constants::{\n FUNCTION_TREE_HEIGHT, GENERATOR_INDEX__NOTE_HASH_NONCE, GENERATOR_INDEX__OUTER_NULLIFIER,\n GENERATOR_INDEX__SILOED_NOTE_HASH, GENERATOR_INDEX__UNIQUE_NOTE_HASH,\n },\n merkle_tree::root::root_from_sibling_path,\n messaging::l2_to_l1_message::{L2ToL1Message, ScopedL2ToL1Message},\n poseidon2::Poseidon2Sponge,\n traits::{FromField, Hash, ToField},\n utils::field::field_from_bytes_32_trunc,\n};\nuse super::{constants::TWO_POW_64, utils::{arrays::array_concat, field::field_from_bytes}};\n\npub fn sha256_to_field<let N: u32>(bytes_to_hash: [u8; N]) -> Field {\n let sha256_hashed = sha256::digest(bytes_to_hash);\n let hash_in_a_field = field_from_bytes_32_trunc(sha256_hashed);\n\n hash_in_a_field\n}\n\npub fn private_functions_root_from_siblings(\n selector: FunctionSelector,\n vk_hash: Field,\n function_leaf_index: Field,\n function_leaf_sibling_path: [Field; FUNCTION_TREE_HEIGHT],\n) -> Field {\n let function_leaf_preimage = ContractClassFunctionLeafPreimage { selector, vk_hash };\n let function_leaf = function_leaf_preimage.hash();\n root_from_sibling_path(\n function_leaf,\n function_leaf_index,\n function_leaf_sibling_path,\n )\n}\n\npub fn compute_note_hash_nonce(first_nullifier_in_tx: Field, note_index_in_tx: u32) -> Field {\n // Hashing the first nullifier with note index in tx is guaranteed to be unique (because all nullifiers are also\n // unique).\n poseidon2_hash_with_separator(\n [first_nullifier_in_tx, note_index_in_tx as Field],\n GENERATOR_INDEX__NOTE_HASH_NONCE,\n )\n}\n\npub fn compute_unique_note_hash(nonce: Field, siloed_note_hash: Field) -> Field {\n let inputs = [nonce, siloed_note_hash];\n poseidon2_hash_with_separator(inputs, GENERATOR_INDEX__UNIQUE_NOTE_HASH)\n}\n\npub fn compute_siloed_note_hash(app: AztecAddress, note_hash: Field) -> Field {\n poseidon2_hash_with_separator(\n [app.to_field(), note_hash],\n GENERATOR_INDEX__SILOED_NOTE_HASH,\n )\n}\n\n/// Computes unique note hashes from siloed note hashes\npub fn compute_unique_siloed_note_hash(\n siloed_note_hash: Field,\n first_nullifier: Field,\n note_index_in_tx: u32,\n) -> Field {\n if siloed_note_hash == 0 {\n 0\n } else {\n let nonce = compute_note_hash_nonce(first_nullifier, note_index_in_tx);\n compute_unique_note_hash(nonce, siloed_note_hash)\n }\n}\n\n/// Siloing in the context of Aztec refers to the process of hashing a note hash with a contract address (this way\n/// the note hash is scoped to a specific contract). This is used to prevent intermingling of notes between contracts.\npub fn silo_note_hash(note_hash: ScopedNoteHash) -> Field {\n if note_hash.contract_address.is_zero() {\n 0\n } else {\n compute_siloed_note_hash(note_hash.contract_address, note_hash.value())\n }\n}\n\npub fn compute_siloed_nullifier(app: AztecAddress, nullifier: Field) -> Field {\n poseidon2_hash_with_separator(\n [app.to_field(), nullifier],\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_private_log_field(contract_address: AztecAddress, field: Field) -> Field {\n poseidon2_hash([contract_address.to_field(), field])\n}\n\npub fn silo_private_log(private_log: Scoped<PrivateLogData>) -> PrivateLog {\n if private_log.contract_address.is_zero() {\n private_log.inner.log\n } else {\n let mut fields = private_log.inner.log.fields;\n fields[0] = compute_siloed_private_log_field(private_log.contract_address, fields[0]);\n PrivateLog { fields }\n }\n}\n\nfn compute_siloed_contract_class_log_field(\n contract_address: AztecAddress,\n first_field: Field,\n) -> Field {\n poseidon2_hash([contract_address.to_field(), first_field])\n}\n\npub fn silo_contract_class_log(contract_class_log: ContractClassLog) -> ContractClassLog {\n if contract_class_log.contract_address.is_zero() {\n contract_class_log\n } else {\n let mut log = contract_class_log;\n log.log.fields[0] = compute_siloed_contract_class_log_field(\n contract_class_log.contract_address,\n log.log.fields[0],\n );\n log\n }\n}\n\npub fn merkle_hash(left: Field, right: Field) -> Field {\n poseidon2_hash([left, right])\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: [u8; 160] = std::mem::zeroed();\n\n let inputs =\n [contract_address.to_field(), rollup_version_id, recipient.to_field(), chain_id, content];\n for i in 0..5 {\n // TODO are bytes be in fr.to_buffer() ?\n let item_bytes: [u8; 32] = inputs[i].to_be_bytes();\n for j in 0..32 {\n bytes[32 * i + j] = item_bytes[j];\n }\n }\n\n sha256_to_field(bytes)\n}\n\npub fn silo_l2_to_l1_message(\n msg: ScopedL2ToL1Message,\n rollup_version_id: Field,\n chain_id: Field,\n) -> Field {\n if msg.contract_address.is_zero() {\n 0\n } else {\n compute_l2_to_l1_hash(\n msg.contract_address,\n msg.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 // 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: [u8; 32] = input[offset].to_be_bytes();\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\npub fn verification_key_hash<let N: u32>(key: [Field; N]) -> Field {\n crate::hash::poseidon2_hash(key)\n}\n\n#[inline_always]\npub fn pedersen_hash<let N: u32>(inputs: [Field; N], hash_index: u32) -> Field {\n std::hash::pedersen_hash_with_separator(inputs, hash_index)\n}\n\npub fn poseidon2_hash<let N: u32>(inputs: [Field; N]) -> Field {\n std::hash::poseidon2::Poseidon2::hash(inputs, N)\n}\n\n#[no_predicates]\npub fn poseidon2_hash_with_separator<let N: u32, T>(inputs: [Field; N], separator: T) -> Field\nwhere\n T: ToField,\n{\n let inputs_with_separator = array_concat([separator.to_field()], inputs);\n poseidon2_hash(inputs_with_separator)\n}\n\n// Performs a fixed length hash with a subarray of the given input.\n// Useful for SpongeBlob in which we aborb M things and want to check it vs a hash of M elts of an N-len array.\n// Using stdlib poseidon, this will always absorb an extra 1 as a 'variable' hash, and not match spongeblob.squeeze()\n// or any ts implementation. Also checks that any remaining elts not hashed are empty.\n#[no_predicates]\npub fn poseidon2_hash_subarray<let N: u32>(input: [Field; N], in_len: u32) -> Field {\n let mut sponge = poseidon2_absorb_chunks(input, in_len, false);\n sponge.squeeze()\n}\n\n#[no_predicates]\npub fn poseidon2_hash_subarray_variable<let N: u32>(input: [Field; N], in_len: u32) -> Field {\n let mut sponge = poseidon2_absorb_chunks(input, in_len, true);\n sponge.squeeze()\n}\n\n// NB the below is the same as std::hash::poseidon2::Poseidon2::hash(), but replacing a range check with a bit check,\n// and absorbing in chunks of 3 below.\n#[no_predicates]\npub fn poseidon2_cheaper_variable_hash<let N: u32>(input: [Field; N], in_len: u32) -> Field {\n let mut sponge = poseidon2_absorb_chunks(input, in_len, true);\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 in_len != N {\n sponge.absorb(1);\n }\n sponge.squeeze()\n}\n\n// The below fn reduces gates of a conditional poseidon2 hash by approx 3x (thank you ~* Giant Brain Dev @IlyasRidhuan *~ for the idea)\n// Why? Because when we call stdlib poseidon, we call absorb for each item. When absorbing is conditional, it seems the compiler does not know\n// what cache_size will be when calling absorb, so it assigns the permutation gates for /each i/ rather than /every 3rd i/, which is actually required.\n// The below code forces the compiler to:\n// - absorb normally up to 2 times to set cache_size to 1\n// - absorb in chunks of 3 to ensure perm. only happens every 3rd absorb\n// - absorb normally up to 2 times to add any remaining values to the hash\n// In fixed len hashes, the compiler is able to tell that it will only need to perform the permutation every 3 absorbs.\n// NB: it also replaces unnecessary range checks (i < thing) with a bit check (&= i != thing), which alone reduces the gates of a var. hash by half.\n\n#[no_predicates]\nfn poseidon2_absorb_chunks<let N: u32>(\n input: [Field; N],\n in_len: u32,\n variable: bool,\n) -> Poseidon2Sponge {\n let iv: Field = (in_len as Field) * TWO_POW_64;\n let mut sponge = Poseidon2Sponge::new(iv);\n // Even though shift is always 1 here, if we input in_len = 0 we get an underflow\n // since we cannot isolate computation branches. The below is just to avoid that.\n let shift = if in_len == 0 { 0 } else { 1 };\n if in_len != 0 {\n // cache_size = 0, init absorb\n sponge.cache[0] = input[0];\n sponge.cache_size = 1;\n // shift = num elts already added to make cache_size 1 = 1 for a fresh sponge\n // M = max_chunks = (N - 1 - (N - 1) % 3) / 3: (must be written as a fn of N to compile)\n // max_remainder = (N - 1) % 3;\n // max_chunks = (N - 1 - max_remainder) / 3;\n sponge = poseidon2_absorb_chunks_loop::<N, (N - 1 - (N - 1) % 3) / 3>(\n sponge,\n input,\n in_len,\n variable,\n shift,\n );\n }\n sponge\n}\n\n// NB: If it's not required to check that the non-absorbed elts of 'input' are 0s, set skip_0_check=true\n#[no_predicates]\npub fn poseidon2_absorb_chunks_existing_sponge<let N: u32>(\n in_sponge: Poseidon2Sponge,\n input: [Field; N],\n in_len: u32,\n skip_0_check: bool,\n) -> Poseidon2Sponge {\n let mut sponge = in_sponge;\n // 'shift' is to account for already added inputs\n let mut shift = 0;\n // 'stop' is to avoid an underflow when inputting in_len = 0\n let mut stop = false;\n for i in 0..3 {\n if shift == in_len {\n stop = true;\n }\n if (sponge.cache_size != 1) & (!stop) {\n sponge.absorb(input[i]);\n shift += 1;\n }\n }\n sponge = if stop {\n sponge\n } else {\n // max_chunks = (N - (N % 3)) / 3;\n poseidon2_absorb_chunks_loop::<N, (N - (N % 3)) / 3>(\n sponge,\n input,\n in_len,\n skip_0_check,\n shift,\n )\n };\n sponge\n}\n\n// The below is the loop to absorb elts into a poseidon sponge in chunks of 3\n// shift - the num of elts already absorbed to ensure the sponge's cache_size = 1\n// M - the max number of chunks required to absorb N things (must be comptime to compile)\n// NB: The 0 checks ('Found non-zero field...') are messy, but having a separate loop over N to check\n// for 0s costs 3N gates. Current approach is approx 2N gates.\n#[no_predicates]\nfn poseidon2_absorb_chunks_loop<let N: u32, let M: u32>(\n in_sponge: Poseidon2Sponge,\n input: [Field; N],\n in_len: u32,\n variable: bool,\n shift: u32,\n) -> Poseidon2Sponge {\n assert(in_len <= N, \"Given in_len to absorb is larger than the input array len\");\n // When we have an existing sponge, we may have a shift of 0, and the final 'k+2' below = N\n // The below avoids an overflow\n let skip_last = 3 * M == N;\n // Writing in_sponge: &mut does not compile\n let mut sponge = in_sponge;\n let mut should_add = true;\n // The num of things left over after absorbing in 3s\n let remainder = (in_len - shift) % 3;\n // The num of chunks of 3 to absorb (maximum M)\n let chunks = (in_len - shift - remainder) / 3;\n for i in 0..M {\n // Now we loop through cache size = 1 -> 3\n should_add &= i != chunks;\n // This is the index at the start of the chunk (for readability)\n let k = 3 * i + shift;\n if should_add {\n // cache_size = 1, 2 => just assign\n sponge.cache[1] = input[k];\n sponge.cache[2] = input[k + 1];\n // cache_size = 3 => duplex + perm\n for j in 0..3 {\n sponge.state[j] += sponge.cache[j];\n }\n sponge.state = std::hash::poseidon2_permutation(sponge.state, 4);\n sponge.cache[0] = input[k + 2];\n // cache_size is now 1 again, repeat loop\n } else if (!variable) & (i != chunks) {\n // if we are hashing a fixed len array which is a subarray, we check the remaining elts are 0\n // NB: we don't check at i == chunks, because that chunk contains elts to be absorbed or checked below\n let last_0 = if (i == M - 1) & (skip_last) {\n 0\n } else {\n input[k + 2]\n };\n let all_0 = (input[k] == 0) & (input[k + 1] == 0) & (last_0 == 0);\n assert(all_0, \"Found non-zero field after breakpoint\");\n }\n }\n // we have 'remainder' num of items left to absorb\n should_add = true;\n // below is to avoid overflows (i.e. if inlen is close to N)\n let mut should_check = !variable;\n for i in 0..3 {\n should_add &= i != remainder;\n should_check &= in_len - remainder + i != N;\n if should_add {\n // we want to absorb the final 'remainder' items\n sponge.absorb(input[in_len - remainder + i]);\n } else if should_check {\n assert(input[in_len - remainder + i] == 0, \"Found non-zero field after breakpoint\");\n }\n }\n sponge\n}\n\npub fn poseidon2_hash_with_separator_slice<T>(inputs: [Field], separator: T) -> Field\nwhere\n T: ToField,\n{\n let in_len = inputs.len() + 1;\n let iv: Field = (in_len as Field) * TWO_POW_64;\n let mut sponge = Poseidon2Sponge::new(iv);\n sponge.absorb(separator.to_field());\n\n for i in 0..inputs.len() {\n sponge.absorb(inputs[i]);\n }\n\n sponge.squeeze()\n}\n\n#[no_predicates]\npub fn poseidon2_hash_bytes<let N: u32>(inputs: [u8; N]) -> Field {\n let mut fields = [0; (N + 30) / 31];\n let mut field_index = 0;\n let mut current_field = [0; 31];\n for i in 0..inputs.len() {\n let index = i % 31;\n current_field[index] = inputs[i];\n if index == 30 {\n fields[field_index] = field_from_bytes(current_field, false);\n current_field = [0; 31];\n field_index += 1;\n }\n }\n if field_index != fields.len() {\n fields[field_index] = field_from_bytes(current_field, false);\n }\n poseidon2_hash(fields)\n}\n\n#[test]\nfn poseidon_chunks_matches_fixed() {\n let in_len = 501;\n let mut input: [Field; 4096] = [0; 4096];\n let mut fixed_input = [3; 501];\n assert(in_len == fixed_input.len()); // sanity check\n for i in 0..in_len {\n input[i] = 3;\n }\n let sub_chunk_hash = poseidon2_hash_subarray(input, in_len);\n let fixed_len_hash = std::hash::poseidon2::Poseidon2::hash(fixed_input, fixed_input.len());\n assert(sub_chunk_hash == fixed_len_hash);\n}\n\n#[test]\nfn poseidon_chunks_matches_variable() {\n let in_len = 501;\n let mut input: [Field; 4096] = [0; 4096];\n for i in 0..in_len {\n input[i] = 3;\n }\n let variable_chunk_hash = poseidon2_cheaper_variable_hash(input, in_len);\n let variable_len_hash = std::hash::poseidon2::Poseidon2::hash(input, in_len);\n assert(variable_chunk_hash == variable_len_hash);\n}\n\n#[test]\nfn existing_sponge_poseidon_chunks_matches_fixed() {\n let in_len = 501;\n let mut input: [Field; 4096] = [0; 4096];\n let mut fixed_input = [3; 501];\n assert(in_len == fixed_input.len()); // sanity check\n for i in 0..in_len {\n input[i] = 3;\n }\n // absorb 250 of the 501 things\n let empty_sponge = Poseidon2Sponge::new((in_len as Field) * TWO_POW_64);\n let first_sponge = poseidon2_absorb_chunks_existing_sponge(empty_sponge, input, 250, true);\n // now absorb the final 251 (since they are all 3s, im being lazy and not making a new array)\n let mut final_sponge = poseidon2_absorb_chunks_existing_sponge(first_sponge, input, 251, true);\n let fixed_len_hash = Poseidon2Sponge::hash(fixed_input, fixed_input.len());\n assert(final_sponge.squeeze() == fixed_len_hash);\n}\n\n#[test]\nfn poseidon_chunks_empty_inputs() {\n let in_len = 0;\n let mut input: [Field; 4096] = [0; 4096];\n let mut constructed_empty_sponge = poseidon2_absorb_chunks(input, in_len, true);\n let mut first_sponge =\n poseidon2_absorb_chunks_existing_sponge(constructed_empty_sponge, input, in_len, true);\n assert(first_sponge.squeeze() == constructed_empty_sponge.squeeze());\n}\n\n#[test]\nfn smoke_sha256_to_field() {\n let full_buffer = [\n 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,\n 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,\n 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,\n 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93,\n 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,\n 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130,\n 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148,\n 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,\n ];\n let result = sha256_to_field(full_buffer);\n\n assert(result == 0x448ebbc9e1a31220a2f3830c18eef61b9bd070e5084b7fa2a359fe729184c7);\n\n // to show correctness of the current ver (truncate one byte) vs old ver (mod full bytes):\n let result_bytes = sha256::digest(full_buffer);\n let truncated_field = crate::utils::field::field_from_bytes_32_trunc(result_bytes);\n assert(truncated_field == result);\n let mod_res = result + (result_bytes[31] as Field);\n assert(mod_res == 0x448ebbc9e1a31220a2f3830c18eef61b9bd070e5084b7fa2a359fe729184e0);\n}\n\n#[test]\nfn compute_l2_l1_hash() {\n // All zeroes\n let hash_result =\n compute_l2_to_l1_hash(AztecAddress::from_field(0), EthAddress::zero(), 0, 0, 0);\n assert(hash_result == 0xb393978842a0fa3d3e1470196f098f473f9678e72463cb65ec4ab5581856c2);\n\n // Non-zero case\n let hash_result = compute_l2_to_l1_hash(\n AztecAddress::from_field(1),\n EthAddress::from_field(3),\n 5,\n 2,\n 4,\n );\n assert(hash_result == 0x3f88c1044a05e5340ed20466276500f6d45ca5603913b9091e957161734e16);\n}\n\n#[test]\nfn silo_l2_to_l1_message_matches_typescript() {\n let version = 4;\n let chainId = 5;\n\n let hash = silo_l2_to_l1_message(\n ScopedL2ToL1Message {\n message: L2ToL1Message { recipient: EthAddress::from_field(1), content: 2, counter: 0 },\n contract_address: AztecAddress::from_field(3),\n },\n version,\n chainId,\n );\n\n // The following value was generated by `l2_to_l1_message.test.ts`\n let hash_from_typescript = 0x00c6155d69febb9d5039b374dd4f77bf57b7c881709aa524a18acaa0bd57476a;\n\n assert_eq(hash, hash_from_typescript);\n}\n"
3874
+ "source": "use crate::{\n abis::{\n contract_class_function_leaf_preimage::ContractClassFunctionLeafPreimage,\n contract_class_log::ContractClassLog,\n function_selector::FunctionSelector,\n note_hash::ScopedNoteHash,\n nullifier::ScopedNullifier,\n private_log::{PrivateLog, PrivateLogData},\n side_effect::{OrderedValue, scoped::Scoped},\n },\n address::{AztecAddress, EthAddress},\n constants::{\n FUNCTION_TREE_HEIGHT, GENERATOR_INDEX__NOTE_HASH_NONCE, GENERATOR_INDEX__OUTER_NULLIFIER,\n GENERATOR_INDEX__SILOED_NOTE_HASH, GENERATOR_INDEX__UNIQUE_NOTE_HASH, TWO_POW_64,\n },\n merkle_tree::root::root_from_sibling_path,\n messaging::l2_to_l1_message::{L2ToL1Message, ScopedL2ToL1Message},\n poseidon2::Poseidon2Sponge,\n traits::{FromField, Hash, ToField},\n utils::{\n arrays::{array_concat, unsafe_padded_array_length},\n field::{field_from_bytes, field_from_bytes_32_trunc},\n },\n};\n\npub fn sha256_to_field<let N: u32>(bytes_to_hash: [u8; N]) -> Field {\n let sha256_hashed = sha256::digest(bytes_to_hash);\n let hash_in_a_field = field_from_bytes_32_trunc(sha256_hashed);\n\n hash_in_a_field\n}\n\npub fn private_functions_root_from_siblings(\n selector: FunctionSelector,\n vk_hash: Field,\n function_leaf_index: Field,\n function_leaf_sibling_path: [Field; FUNCTION_TREE_HEIGHT],\n) -> Field {\n let function_leaf_preimage = ContractClassFunctionLeafPreimage { selector, vk_hash };\n let function_leaf = function_leaf_preimage.hash();\n root_from_sibling_path(\n function_leaf,\n function_leaf_index,\n function_leaf_sibling_path,\n )\n}\n\npub fn compute_note_hash_nonce(first_nullifier_in_tx: Field, note_index_in_tx: u32) -> Field {\n // Hashing the first nullifier with note index in tx is guaranteed to be unique (because all nullifiers are also\n // unique).\n poseidon2_hash_with_separator(\n [first_nullifier_in_tx, note_index_in_tx as Field],\n GENERATOR_INDEX__NOTE_HASH_NONCE,\n )\n}\n\npub fn compute_unique_note_hash(nonce: Field, siloed_note_hash: Field) -> Field {\n let inputs = [nonce, siloed_note_hash];\n poseidon2_hash_with_separator(inputs, GENERATOR_INDEX__UNIQUE_NOTE_HASH)\n}\n\npub fn compute_siloed_note_hash(app: AztecAddress, note_hash: Field) -> Field {\n poseidon2_hash_with_separator(\n [app.to_field(), note_hash],\n GENERATOR_INDEX__SILOED_NOTE_HASH,\n )\n}\n\n/// Computes unique note hashes from siloed note hashes\npub fn compute_unique_siloed_note_hash(\n siloed_note_hash: Field,\n first_nullifier: Field,\n note_index_in_tx: u32,\n) -> Field {\n if siloed_note_hash == 0 {\n 0\n } else {\n let nonce = compute_note_hash_nonce(first_nullifier, note_index_in_tx);\n compute_unique_note_hash(nonce, siloed_note_hash)\n }\n}\n\n/// Siloing in the context of Aztec refers to the process of hashing a note hash with a contract address (this way\n/// the note hash is scoped to a specific contract). This is used to prevent intermingling of notes between contracts.\npub fn silo_note_hash(note_hash: ScopedNoteHash) -> Field {\n if note_hash.contract_address.is_zero() {\n 0\n } else {\n compute_siloed_note_hash(note_hash.contract_address, note_hash.value())\n }\n}\n\npub fn compute_siloed_nullifier(app: AztecAddress, nullifier: Field) -> Field {\n poseidon2_hash_with_separator(\n [app.to_field(), nullifier],\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_private_log_field(contract_address: AztecAddress, field: Field) -> Field {\n poseidon2_hash([contract_address.to_field(), field])\n}\n\npub fn silo_private_log(private_log: Scoped<PrivateLogData>) -> PrivateLog {\n if private_log.contract_address.is_zero() {\n private_log.inner.log\n } else {\n let mut fields = private_log.inner.log.fields;\n fields[0] = compute_siloed_private_log_field(private_log.contract_address, fields[0]);\n PrivateLog { fields }\n }\n}\n\nfn compute_siloed_contract_class_log_field(\n contract_address: AztecAddress,\n first_field: Field,\n) -> Field {\n poseidon2_hash([contract_address.to_field(), first_field])\n}\n\npub fn silo_contract_class_log(contract_class_log: ContractClassLog) -> ContractClassLog {\n if contract_class_log.contract_address.is_zero() {\n contract_class_log\n } else {\n let mut log = contract_class_log;\n log.log.fields[0] = compute_siloed_contract_class_log_field(\n contract_class_log.contract_address,\n log.log.fields[0],\n );\n log\n }\n}\n\npub fn compute_contract_class_log_hash(contract_class_log: ContractClassLog) -> Field {\n let array = contract_class_log.log.fields;\n // Safety: The below length is constrained in the base rollup.\n let length = unsafe { unsafe_padded_array_length(array) };\n if length == 0 {\n 0\n } else {\n poseidon2_hash(array)\n }\n}\n\npub fn merkle_hash(left: Field, right: Field) -> Field {\n poseidon2_hash([left, right])\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: [u8; 160] = std::mem::zeroed();\n\n let inputs =\n [contract_address.to_field(), rollup_version_id, recipient.to_field(), chain_id, content];\n for i in 0..5 {\n // TODO are bytes be in fr.to_buffer() ?\n let item_bytes: [u8; 32] = inputs[i].to_be_bytes();\n for j in 0..32 {\n bytes[32 * i + j] = item_bytes[j];\n }\n }\n\n sha256_to_field(bytes)\n}\n\npub fn silo_l2_to_l1_message(\n msg: ScopedL2ToL1Message,\n rollup_version_id: Field,\n chain_id: Field,\n) -> Field {\n if msg.contract_address.is_zero() {\n 0\n } else {\n compute_l2_to_l1_hash(\n msg.contract_address,\n msg.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 // 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: [u8; 32] = input[offset].to_be_bytes();\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\npub fn verification_key_hash<let N: u32>(key: [Field; N]) -> Field {\n crate::hash::poseidon2_hash(key)\n}\n\n#[inline_always]\npub fn pedersen_hash<let N: u32>(inputs: [Field; N], hash_index: u32) -> Field {\n std::hash::pedersen_hash_with_separator(inputs, hash_index)\n}\n\npub fn poseidon2_hash<let N: u32>(inputs: [Field; N]) -> Field {\n std::hash::poseidon2::Poseidon2::hash(inputs, N)\n}\n\n#[no_predicates]\npub fn poseidon2_hash_with_separator<let N: u32, T>(inputs: [Field; N], separator: T) -> Field\nwhere\n T: ToField,\n{\n let inputs_with_separator = array_concat([separator.to_field()], inputs);\n poseidon2_hash(inputs_with_separator)\n}\n\n// Performs a fixed length hash with a subarray of the given input.\n// Useful for SpongeBlob in which we aborb M things and want to check it vs a hash of M elts of an N-len array.\n// Using stdlib poseidon, this will always absorb an extra 1 as a 'variable' hash, and not match spongeblob.squeeze()\n// or any ts implementation. Also checks that any remaining elts not hashed are empty.\n#[no_predicates]\npub fn poseidon2_hash_subarray<let N: u32>(input: [Field; N], in_len: u32) -> Field {\n let mut sponge = poseidon2_absorb_chunks(input, in_len, false);\n sponge.squeeze()\n}\n\n// NB the below is the same as std::hash::poseidon2::Poseidon2::hash(), but replacing a range check with a bit check,\n// and absorbing in chunks of 3 below.\n#[no_predicates]\npub fn poseidon2_cheaper_variable_hash<let N: u32>(input: [Field; N], in_len: u32) -> Field {\n let mut sponge = poseidon2_absorb_chunks(input, in_len, true);\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 in_len != N {\n sponge.absorb(1);\n }\n sponge.squeeze()\n}\n\n// The below fn reduces gates of a conditional poseidon2 hash by approx 3x (thank you ~* Giant Brain Dev @IlyasRidhuan *~ for the idea)\n// Why? Because when we call stdlib poseidon, we call absorb for each item. When absorbing is conditional, it seems the compiler does not know\n// what cache_size will be when calling absorb, so it assigns the permutation gates for /each i/ rather than /every 3rd i/, which is actually required.\n// The below code forces the compiler to:\n// - absorb normally up to 2 times to set cache_size to 1\n// - absorb in chunks of 3 to ensure perm. only happens every 3rd absorb\n// - absorb normally up to 2 times to add any remaining values to the hash\n// In fixed len hashes, the compiler is able to tell that it will only need to perform the permutation every 3 absorbs.\n// NB: it also replaces unnecessary range checks (i < thing) with a bit check (&= i != thing), which alone reduces the gates of a var. hash by half.\n\n#[no_predicates]\nfn poseidon2_absorb_chunks<let N: u32>(\n input: [Field; N],\n in_len: u32,\n variable: bool,\n) -> Poseidon2Sponge {\n let iv: Field = (in_len as Field) * TWO_POW_64;\n let mut sponge = Poseidon2Sponge::new(iv);\n // Even though shift is always 1 here, if we input in_len = 0 we get an underflow\n // since we cannot isolate computation branches. The below is just to avoid that.\n let shift = if in_len == 0 { 0 } else { 1 };\n if in_len != 0 {\n // cache_size = 0, init absorb\n sponge.cache[0] = input[0];\n sponge.cache_size = 1;\n // shift = num elts already added to make cache_size 1 = 1 for a fresh sponge\n // M = max_chunks = (N - 1 - (N - 1) % 3) / 3: (must be written as a fn of N to compile)\n // max_remainder = (N - 1) % 3;\n // max_chunks = (N - 1 - max_remainder) / 3;\n sponge = poseidon2_absorb_chunks_loop::<N, (N - 1 - (N - 1) % 3) / 3>(\n sponge,\n input,\n in_len,\n variable,\n shift,\n );\n }\n sponge\n}\n\n// NB: If it's not required to check that the non-absorbed elts of 'input' are 0s, set skip_0_check=true\n#[no_predicates]\npub fn poseidon2_absorb_chunks_existing_sponge<let N: u32>(\n in_sponge: Poseidon2Sponge,\n input: [Field; N],\n in_len: u32,\n skip_0_check: bool,\n) -> Poseidon2Sponge {\n let mut sponge = in_sponge;\n // 'shift' is to account for already added inputs\n let mut shift = 0;\n // 'stop' is to avoid an underflow when inputting in_len = 0\n let mut stop = false;\n for i in 0..3 {\n if shift == in_len {\n stop = true;\n }\n if (sponge.cache_size != 1) & (!stop) {\n sponge.absorb(input[i]);\n shift += 1;\n }\n }\n sponge = if stop {\n sponge\n } else {\n // max_chunks = (N - (N % 3)) / 3;\n poseidon2_absorb_chunks_loop::<N, (N - (N % 3)) / 3>(\n sponge,\n input,\n in_len,\n skip_0_check,\n shift,\n )\n };\n sponge\n}\n\n// The below is the loop to absorb elts into a poseidon sponge in chunks of 3\n// shift - the num of elts already absorbed to ensure the sponge's cache_size = 1\n// M - the max number of chunks required to absorb N things (must be comptime to compile)\n// NB: The 0 checks ('Found non-zero field...') are messy, but having a separate loop over N to check\n// for 0s costs 3N gates. Current approach is approx 2N gates.\n#[no_predicates]\nfn poseidon2_absorb_chunks_loop<let N: u32, let M: u32>(\n in_sponge: Poseidon2Sponge,\n input: [Field; N],\n in_len: u32,\n variable: bool,\n shift: u32,\n) -> Poseidon2Sponge {\n assert(in_len <= N, \"Given in_len to absorb is larger than the input array len\");\n // When we have an existing sponge, we may have a shift of 0, and the final 'k+2' below = N\n // The below avoids an overflow\n let skip_last = 3 * M == N;\n // Writing in_sponge: &mut does not compile\n let mut sponge = in_sponge;\n let mut should_add = true;\n // The num of things left over after absorbing in 3s\n let remainder = (in_len - shift) % 3;\n // The num of chunks of 3 to absorb (maximum M)\n let chunks = (in_len - shift - remainder) / 3;\n for i in 0..M {\n // Now we loop through cache size = 1 -> 3\n should_add &= i != chunks;\n // This is the index at the start of the chunk (for readability)\n let k = 3 * i + shift;\n if should_add {\n // cache_size = 1, 2 => just assign\n sponge.cache[1] = input[k];\n sponge.cache[2] = input[k + 1];\n // cache_size = 3 => duplex + perm\n for j in 0..3 {\n sponge.state[j] += sponge.cache[j];\n }\n sponge.state = std::hash::poseidon2_permutation(sponge.state, 4);\n sponge.cache[0] = input[k + 2];\n // cache_size is now 1 again, repeat loop\n } else if (!variable) & (i != chunks) {\n // if we are hashing a fixed len array which is a subarray, we check the remaining elts are 0\n // NB: we don't check at i == chunks, because that chunk contains elts to be absorbed or checked below\n let last_0 = if (i == M - 1) & (skip_last) {\n 0\n } else {\n input[k + 2]\n };\n let all_0 = (input[k] == 0) & (input[k + 1] == 0) & (last_0 == 0);\n assert(all_0, \"Found non-zero field after breakpoint\");\n }\n }\n // we have 'remainder' num of items left to absorb\n should_add = true;\n // below is to avoid overflows (i.e. if inlen is close to N)\n let mut should_check = !variable;\n for i in 0..3 {\n should_add &= i != remainder;\n should_check &= in_len - remainder + i != N;\n if should_add {\n // we want to absorb the final 'remainder' items\n sponge.absorb(input[in_len - remainder + i]);\n } else if should_check {\n assert(input[in_len - remainder + i] == 0, \"Found non-zero field after breakpoint\");\n }\n }\n sponge\n}\n\npub fn poseidon2_hash_with_separator_slice<T>(inputs: [Field], separator: T) -> Field\nwhere\n T: ToField,\n{\n let in_len = inputs.len() + 1;\n let iv: Field = (in_len as Field) * TWO_POW_64;\n let mut sponge = Poseidon2Sponge::new(iv);\n sponge.absorb(separator.to_field());\n\n for i in 0..inputs.len() {\n sponge.absorb(inputs[i]);\n }\n\n sponge.squeeze()\n}\n\n#[no_predicates]\npub fn poseidon2_hash_bytes<let N: u32>(inputs: [u8; N]) -> Field {\n let mut fields = [0; (N + 30) / 31];\n let mut field_index = 0;\n let mut current_field = [0; 31];\n for i in 0..inputs.len() {\n let index = i % 31;\n current_field[index] = inputs[i];\n if index == 30 {\n fields[field_index] = field_from_bytes(current_field, false);\n current_field = [0; 31];\n field_index += 1;\n }\n }\n if field_index != fields.len() {\n fields[field_index] = field_from_bytes(current_field, false);\n }\n poseidon2_hash(fields)\n}\n\n#[test]\nfn poseidon_chunks_matches_fixed() {\n let in_len = 501;\n let mut input: [Field; 4096] = [0; 4096];\n let mut fixed_input = [3; 501];\n assert(in_len == fixed_input.len()); // sanity check\n for i in 0..in_len {\n input[i] = 3;\n }\n let sub_chunk_hash = poseidon2_hash_subarray(input, in_len);\n let fixed_len_hash = std::hash::poseidon2::Poseidon2::hash(fixed_input, fixed_input.len());\n assert(sub_chunk_hash == fixed_len_hash);\n}\n\n#[test]\nfn poseidon_chunks_matches_variable() {\n let in_len = 501;\n let mut input: [Field; 4096] = [0; 4096];\n for i in 0..in_len {\n input[i] = 3;\n }\n let variable_chunk_hash = poseidon2_cheaper_variable_hash(input, in_len);\n let variable_len_hash = std::hash::poseidon2::Poseidon2::hash(input, in_len);\n assert(variable_chunk_hash == variable_len_hash);\n}\n\n#[test]\nfn existing_sponge_poseidon_chunks_matches_fixed() {\n let in_len = 501;\n let mut input: [Field; 4096] = [0; 4096];\n let mut fixed_input = [3; 501];\n assert(in_len == fixed_input.len()); // sanity check\n for i in 0..in_len {\n input[i] = 3;\n }\n // absorb 250 of the 501 things\n let empty_sponge = Poseidon2Sponge::new((in_len as Field) * TWO_POW_64);\n let first_sponge = poseidon2_absorb_chunks_existing_sponge(empty_sponge, input, 250, true);\n // now absorb the final 251 (since they are all 3s, im being lazy and not making a new array)\n let mut final_sponge = poseidon2_absorb_chunks_existing_sponge(first_sponge, input, 251, true);\n let fixed_len_hash = Poseidon2Sponge::hash(fixed_input, fixed_input.len());\n assert(final_sponge.squeeze() == fixed_len_hash);\n}\n\n#[test]\nfn poseidon_chunks_empty_inputs() {\n let in_len = 0;\n let mut input: [Field; 4096] = [0; 4096];\n let mut constructed_empty_sponge = poseidon2_absorb_chunks(input, in_len, true);\n let mut first_sponge =\n poseidon2_absorb_chunks_existing_sponge(constructed_empty_sponge, input, in_len, true);\n assert(first_sponge.squeeze() == constructed_empty_sponge.squeeze());\n}\n\n#[test]\nfn smoke_sha256_to_field() {\n let full_buffer = [\n 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,\n 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,\n 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,\n 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93,\n 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,\n 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130,\n 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148,\n 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,\n ];\n let result = sha256_to_field(full_buffer);\n\n assert(result == 0x448ebbc9e1a31220a2f3830c18eef61b9bd070e5084b7fa2a359fe729184c7);\n\n // to show correctness of the current ver (truncate one byte) vs old ver (mod full bytes):\n let result_bytes = sha256::digest(full_buffer);\n let truncated_field = crate::utils::field::field_from_bytes_32_trunc(result_bytes);\n assert(truncated_field == result);\n let mod_res = result + (result_bytes[31] as Field);\n assert(mod_res == 0x448ebbc9e1a31220a2f3830c18eef61b9bd070e5084b7fa2a359fe729184e0);\n}\n\n#[test]\nfn compute_l2_l1_hash() {\n // All zeroes\n let hash_result =\n compute_l2_to_l1_hash(AztecAddress::from_field(0), EthAddress::zero(), 0, 0, 0);\n assert(hash_result == 0xb393978842a0fa3d3e1470196f098f473f9678e72463cb65ec4ab5581856c2);\n\n // Non-zero case\n let hash_result = compute_l2_to_l1_hash(\n AztecAddress::from_field(1),\n EthAddress::from_field(3),\n 5,\n 2,\n 4,\n );\n assert(hash_result == 0x3f88c1044a05e5340ed20466276500f6d45ca5603913b9091e957161734e16);\n}\n\n#[test]\nfn silo_l2_to_l1_message_matches_typescript() {\n let version = 4;\n let chainId = 5;\n\n let hash = silo_l2_to_l1_message(\n ScopedL2ToL1Message {\n message: L2ToL1Message { recipient: EthAddress::from_field(1), content: 2, counter: 0 },\n contract_address: AztecAddress::from_field(3),\n },\n version,\n chainId,\n );\n\n // The following value was generated by `l2_to_l1_message.test.ts`\n let hash_from_typescript = 0x00c6155d69febb9d5039b374dd4f77bf57b7c881709aa524a18acaa0bd57476a;\n\n assert_eq(hash, hash_from_typescript);\n}\n"
3875
3875
  },
3876
3876
  "299": {
3877
3877
  "path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/types/src/poseidon2.nr",
@@ -3931,7 +3931,7 @@
3931
3931
  },
3932
3932
  "81": {
3933
3933
  "path": "/home/aztec-dev/aztec-packages/noir-projects/aztec-nr/aztec/src/context/private_context.nr",
3934
- "source": "use dep::protocol_types::debug_log::debug_log_format;\n\nuse crate::{\n context::{inputs::PrivateContextInputs, returns_hash::ReturnsHash},\n hash::{ArgsHasher, hash_args_array},\n keys::constants::{NULLIFIER_INDEX, NUM_KEY_TYPES, OUTGOING_INDEX, sk_generators},\n messaging::process_l1_to_l2_message,\n oracle::{\n block_header::get_block_header_at,\n call_private_function::call_private_function_internal,\n enqueue_public_function_call::{\n enqueue_public_function_call_internal, notify_set_min_revertible_side_effect_counter,\n set_public_teardown_function_call_internal,\n },\n execution_cache,\n key_validation_request::get_key_validation_request,\n notes::{notify_created_nullifier, notify_nullified_note},\n },\n};\nuse dep::protocol_types::{\n abis::{\n call_context::CallContext,\n function_selector::FunctionSelector,\n log::Log,\n log_hash::LogHash,\n max_block_number::MaxBlockNumber,\n note_hash::NoteHash,\n nullifier::Nullifier,\n private_call_request::PrivateCallRequest,\n private_circuit_public_inputs::PrivateCircuitPublicInputs,\n private_log::PrivateLogData,\n public_call_request::PublicCallRequest,\n read_request::ReadRequest,\n side_effect::Counted,\n validation_requests::{KeyValidationRequest, KeyValidationRequestAndGenerator},\n },\n address::{AztecAddress, EthAddress},\n block_header::BlockHeader,\n constants::{\n MAX_CONTRACT_CLASS_LOGS_PER_CALL, MAX_ENQUEUED_CALLS_PER_CALL,\n MAX_KEY_VALIDATION_REQUESTS_PER_CALL, MAX_L2_TO_L1_MSGS_PER_CALL,\n MAX_NOTE_HASH_READ_REQUESTS_PER_CALL, MAX_NOTE_HASHES_PER_CALL,\n MAX_NULLIFIER_READ_REQUESTS_PER_CALL, MAX_NULLIFIERS_PER_CALL,\n MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL, MAX_PRIVATE_LOGS_PER_CALL,\n PRIVATE_LOG_SIZE_IN_FIELDS, PUBLIC_DISPATCH_SELECTOR,\n },\n messaging::l2_to_l1_message::L2ToL1Message,\n traits::Empty,\n};\n\n// When finished, one can call .finish() to convert back to the abi\npub struct PrivateContext {\n // docs:start:private-context\n pub inputs: PrivateContextInputs,\n pub side_effect_counter: u32,\n\n pub min_revertible_side_effect_counter: u32,\n pub is_fee_payer: bool,\n\n pub args_hash: Field,\n pub return_hash: Field,\n\n pub max_block_number: MaxBlockNumber,\n\n pub note_hash_read_requests: BoundedVec<ReadRequest, MAX_NOTE_HASH_READ_REQUESTS_PER_CALL>,\n pub 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 pub note_hashes: BoundedVec<NoteHash, MAX_NOTE_HASHES_PER_CALL>,\n pub nullifiers: BoundedVec<Nullifier, MAX_NULLIFIERS_PER_CALL>,\n\n pub private_call_requests: BoundedVec<PrivateCallRequest, MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL>,\n pub public_call_requests: BoundedVec<Counted<PublicCallRequest>, MAX_ENQUEUED_CALLS_PER_CALL>,\n pub public_teardown_call_request: PublicCallRequest,\n pub l2_to_l1_msgs: BoundedVec<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 pub historical_header: BlockHeader,\n\n pub private_logs: BoundedVec<PrivateLogData, MAX_PRIVATE_LOGS_PER_CALL>,\n pub contract_class_logs_hashes: BoundedVec<LogHash, MAX_CONTRACT_CLASS_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 pub 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_requests: BoundedVec::new(),\n public_teardown_call_request: PublicCallRequest::empty(),\n l2_to_l1_msgs: BoundedVec::new(),\n private_logs: BoundedVec::new(),\n contract_class_logs_hashes: BoundedVec::new(),\n last_key_validation_requests: [Option::none(); NUM_KEY_TYPES],\n }\n }\n\n pub fn msg_sender(self) -> AztecAddress {\n self.inputs.call_context.msg_sender\n }\n\n pub fn this_address(self) -> AztecAddress {\n self.inputs.call_context.contract_address\n }\n\n pub fn chain_id(self) -> Field {\n self.inputs.tx_context.chain_id\n }\n\n pub fn version(self) -> Field {\n self.inputs.tx_context.version\n }\n\n pub fn selector(self) -> FunctionSelector {\n self.inputs.call_context.function_selector\n }\n\n pub fn get_args_hash(self) -> Field {\n self.args_hash\n }\n\n pub fn push_note_hash(&mut self, note_hash: Field) {\n self.note_hashes.push(NoteHash { value: note_hash, counter: self.next_counter() });\n\n // WARNING(https://github.com/AztecProtocol/aztec-packages/issues/10558): if you delete this debug_log_format line, some tests fail.\n debug_log_format(\n \"Context.note_hashes, after pushing new note hash: {0}\",\n self.note_hashes.storage().map(|nh: NoteHash| nh.value),\n );\n }\n\n pub fn push_nullifier(&mut self, nullifier: Field) {\n notify_created_nullifier(nullifier);\n self.nullifiers.push(\n Nullifier { value: nullifier, note_hash: 0, counter: self.next_counter() },\n );\n }\n\n pub fn push_nullifier_for_note_hash(&mut self, nullifier: Field, nullified_note_hash: Field) {\n let nullifier_counter = self.next_counter();\n notify_nullified_note(nullifier, nullified_note_hash, nullifier_counter);\n self.nullifiers.push(\n Nullifier {\n value: nullifier,\n note_hash: nullified_note_hash,\n counter: nullifier_counter,\n },\n );\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 pub fn get_block_header(self) -> BlockHeader {\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_block_header_at(self, block_number: u32) -> BlockHeader {\n get_block_header_at(block_number, self)\n }\n\n pub fn set_return_hash(&mut self, returns_hasher: ArgsHasher) {\n execution_cache::store(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\n .key_validation_requests_and_generators\n .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_requests: self.public_call_requests.storage(),\n public_teardown_call_request: self.public_teardown_call_request,\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 private_logs: self.private_logs.storage(),\n contract_class_logs_hashes: self.contract_class_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(\n \"Setting {0} as fee payer\",\n [self.this_address().to_field()],\n );\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 notify_set_min_revertible_side_effect_counter(self.min_revertible_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 =\n 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 =\n 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\n // Typically we'd validate keys by showing that they are the preimage of `pk_m_hash`, but that'd require\n // the oracle returning the master secret keys, which could cause malicious contracts to leak it or learn\n // about secrets from other contracts. We therefore silo secret keys, and rely on the private kernel to\n // validate that we siloed secret key corresponds to correct siloing of the master secret key that hashes\n // to `pk_m_hash`.\n\n // Safety: Kernels verify that the key validation request is valid and below we verify that a request\n // for the correct public key has been received.\n let request = unsafe { get_key_validation_request(pk_m_hash, key_index) };\n assert_eq(request.pk_m.hash(), pk_m_hash, \"Obtained invalid key validation request\");\n\n self.key_validation_requests_and_generators.push(\n KeyValidationRequestAndGenerator {\n request,\n sk_app_generator: sk_generators[key_index],\n },\n );\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(\n &mut self,\n content: Field,\n secret: Field,\n sender: EthAddress,\n leaf_index: Field,\n ) {\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 leaf_index,\n );\n\n // Push nullifier (and the \"commitment\" corresponding to this can be \"empty\")\n self.push_nullifier(nullifier)\n }\n // docs:end:consume_l1_to_l2_message\n\n pub fn emit_private_log(&mut self, log: [Field; PRIVATE_LOG_SIZE_IN_FIELDS]) {\n let counter = self.next_counter();\n let private_log = PrivateLogData { log: Log::new(log), note_hash_counter: 0, counter };\n self.private_logs.push(private_log);\n }\n\n pub fn emit_raw_note_log(\n &mut self,\n log: [Field; PRIVATE_LOG_SIZE_IN_FIELDS],\n note_hash_counter: u32,\n ) {\n let counter = self.next_counter();\n let private_log = PrivateLogData { log: Log::new(log), note_hash_counter, counter };\n self.private_logs.push(private_log);\n }\n\n pub fn call_private_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT],\n ) -> ReturnsHash {\n let args_hash = hash_args_array(args);\n execution_cache::store(args);\n self.call_private_function_with_args_hash(\n contract_address,\n function_selector,\n args_hash,\n false,\n )\n }\n\n pub fn static_call_private_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT],\n ) -> ReturnsHash {\n let args_hash = hash_args_array(args);\n execution_cache::store(args);\n self.call_private_function_with_args_hash(\n contract_address,\n function_selector,\n args_hash,\n true,\n )\n }\n\n pub fn call_private_function_no_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n ) -> ReturnsHash {\n self.call_private_function_with_args_hash(contract_address, function_selector, 0, false)\n }\n\n pub fn static_call_private_function_no_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n ) -> ReturnsHash {\n self.call_private_function_with_args_hash(contract_address, function_selector, 0, true)\n }\n\n pub fn call_private_function_with_args_hash(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n ) -> ReturnsHash {\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n let start_side_effect_counter = self.side_effect_counter;\n\n // Safety: The oracle simulates the private call and returns the value of the side effects counter after\n // execution of the call (which means that end_side_effect_counter - start_side_effect_counter is\n // the number of side effects that took place), along with the hash of the return values. We validate these\n // by requesting a private kernel iteration in which the return values are constrained to hash\n // to `returns_hash` and the side effects counter to increment from start to end.\n let (end_side_effect_counter, returns_hash) = unsafe {\n call_private_function_internal(\n contract_address,\n function_selector,\n args_hash,\n start_side_effect_counter,\n is_static_call,\n )\n };\n\n self.private_call_requests.push(\n PrivateCallRequest {\n call_context: CallContext {\n msg_sender: self.this_address(),\n contract_address,\n function_selector,\n is_static_call,\n },\n args_hash,\n returns_hash,\n start_side_effect_counter,\n end_side_effect_counter,\n },\n );\n\n // 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 // 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 self.side_effect_counter = end_side_effect_counter + 1;\n ReturnsHash::new(returns_hash)\n }\n\n pub fn call_public_function<let ARGS_COUNT: u32>(\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 execution_cache::store(args);\n self.call_public_function_with_args_hash(\n contract_address,\n function_selector,\n args_hash,\n false,\n )\n }\n\n pub fn static_call_public_function<let ARGS_COUNT: u32>(\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 execution_cache::store(args);\n self.call_public_function_with_args_hash(\n contract_address,\n function_selector,\n args_hash,\n true,\n )\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_args_hash(contract_address, function_selector, 0, 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_args_hash(contract_address, function_selector, 0, true)\n }\n\n pub fn call_public_function_with_args_hash(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n ) {\n let counter = self.next_counter();\n\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n // Safety: TODO(https://github.com/AztecProtocol/aztec-packages/issues/8985): Fix this.\n // WARNING: This is insecure and should be temporary!\n // The oracle hashes the arguments and returns a new args_hash.\n // new_args = [selector, ...old_args], so as to make it suitable to call the public dispatch function.\n // We don't validate or compute it in the circuit because a) it's harder to do with slices, and\n // b) this is only temporary.\n let args_hash = unsafe {\n enqueue_public_function_call_internal(\n contract_address,\n function_selector,\n args_hash,\n counter,\n is_static_call,\n )\n };\n\n // Public calls are rerouted through the dispatch function.\n let function_selector = comptime { FunctionSelector::from_field(PUBLIC_DISPATCH_SELECTOR) };\n\n let call_request = PublicCallRequest {\n msg_sender: self.this_address(),\n contract_address,\n function_selector,\n is_static_call,\n args_hash,\n };\n\n self.public_call_requests.push(Counted::new(call_request, counter));\n }\n\n pub fn set_public_teardown_function<let ARGS_COUNT: u32>(\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 execution_cache::store(args);\n self.set_public_teardown_function_with_args_hash(\n contract_address,\n function_selector,\n args_hash,\n false,\n )\n }\n\n pub fn set_public_teardown_function_with_args_hash(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n ) {\n let counter = self.next_counter();\n\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n // Safety: TODO(https://github.com/AztecProtocol/aztec-packages/issues/8985): Fix this.\n // WARNING: This is insecure and should be temporary!\n // The oracle hashes the arguments and returns a new args_hash.\n // new_args = [selector, ...old_args], so as to make it suitable to call the public dispatch function.\n // We don't validate or compute it in the circuit because a) it's harder to do with slices, and\n // b) this is only temporary.\n let args_hash = unsafe {\n set_public_teardown_function_call_internal(\n contract_address,\n function_selector,\n args_hash,\n counter,\n is_static_call,\n )\n };\n\n let function_selector = comptime { FunctionSelector::from_field(PUBLIC_DISPATCH_SELECTOR) };\n\n self.public_teardown_call_request = PublicCallRequest {\n msg_sender: self.this_address(),\n contract_address,\n function_selector,\n is_static_call,\n args_hash,\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_requests: BoundedVec::new(),\n public_teardown_call_request: PublicCallRequest::empty(),\n l2_to_l1_msgs: BoundedVec::new(),\n historical_header: BlockHeader::empty(),\n private_logs: BoundedVec::new(),\n contract_class_logs_hashes: BoundedVec::new(),\n last_key_validation_requests: [Option::none(); NUM_KEY_TYPES],\n }\n }\n}\n"
3934
+ "source": "use dep::protocol_types::debug_log::debug_log_format;\n\nuse crate::{\n context::{inputs::PrivateContextInputs, returns_hash::ReturnsHash},\n hash::{ArgsHasher, hash_args_array},\n keys::constants::{NULLIFIER_INDEX, NUM_KEY_TYPES, OUTGOING_INDEX, sk_generators},\n messaging::process_l1_to_l2_message,\n oracle::{\n block_header::get_block_header_at,\n call_private_function::call_private_function_internal,\n enqueue_public_function_call::{\n enqueue_public_function_call_internal, notify_set_min_revertible_side_effect_counter,\n set_public_teardown_function_call_internal,\n },\n execution_cache,\n key_validation_request::get_key_validation_request,\n notes::{notify_created_nullifier, notify_nullified_note},\n },\n};\nuse dep::protocol_types::{\n abis::{\n call_context::CallContext,\n function_selector::FunctionSelector,\n gas_settings::GasSettings,\n log::Log,\n log_hash::LogHash,\n max_block_number::MaxBlockNumber,\n note_hash::NoteHash,\n nullifier::Nullifier,\n private_call_request::PrivateCallRequest,\n private_circuit_public_inputs::PrivateCircuitPublicInputs,\n private_log::PrivateLogData,\n public_call_request::PublicCallRequest,\n read_request::ReadRequest,\n side_effect::Counted,\n validation_requests::{KeyValidationRequest, KeyValidationRequestAndGenerator},\n },\n address::{AztecAddress, EthAddress},\n block_header::BlockHeader,\n constants::{\n MAX_CONTRACT_CLASS_LOGS_PER_CALL, MAX_ENQUEUED_CALLS_PER_CALL,\n MAX_KEY_VALIDATION_REQUESTS_PER_CALL, MAX_L2_TO_L1_MSGS_PER_CALL,\n MAX_NOTE_HASH_READ_REQUESTS_PER_CALL, MAX_NOTE_HASHES_PER_CALL,\n MAX_NULLIFIER_READ_REQUESTS_PER_CALL, MAX_NULLIFIERS_PER_CALL,\n MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL, MAX_PRIVATE_LOGS_PER_CALL,\n PRIVATE_LOG_SIZE_IN_FIELDS, PUBLIC_DISPATCH_SELECTOR,\n },\n messaging::l2_to_l1_message::L2ToL1Message,\n traits::Empty,\n};\n\n// When finished, one can call .finish() to convert back to the abi\npub struct PrivateContext {\n // docs:start:private-context\n pub inputs: PrivateContextInputs,\n pub side_effect_counter: u32,\n\n pub min_revertible_side_effect_counter: u32,\n pub is_fee_payer: bool,\n\n pub args_hash: Field,\n pub return_hash: Field,\n\n pub max_block_number: MaxBlockNumber,\n\n pub note_hash_read_requests: BoundedVec<ReadRequest, MAX_NOTE_HASH_READ_REQUESTS_PER_CALL>,\n pub 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 pub note_hashes: BoundedVec<NoteHash, MAX_NOTE_HASHES_PER_CALL>,\n pub nullifiers: BoundedVec<Nullifier, MAX_NULLIFIERS_PER_CALL>,\n\n pub private_call_requests: BoundedVec<PrivateCallRequest, MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL>,\n pub public_call_requests: BoundedVec<Counted<PublicCallRequest>, MAX_ENQUEUED_CALLS_PER_CALL>,\n pub public_teardown_call_request: PublicCallRequest,\n pub l2_to_l1_msgs: BoundedVec<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 pub historical_header: BlockHeader,\n\n pub private_logs: BoundedVec<PrivateLogData, MAX_PRIVATE_LOGS_PER_CALL>,\n pub contract_class_logs_hashes: BoundedVec<LogHash, MAX_CONTRACT_CLASS_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 pub 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_requests: BoundedVec::new(),\n public_teardown_call_request: PublicCallRequest::empty(),\n l2_to_l1_msgs: BoundedVec::new(),\n private_logs: BoundedVec::new(),\n contract_class_logs_hashes: BoundedVec::new(),\n last_key_validation_requests: [Option::none(); NUM_KEY_TYPES],\n }\n }\n\n pub fn msg_sender(self) -> AztecAddress {\n self.inputs.call_context.msg_sender\n }\n\n pub fn this_address(self) -> AztecAddress {\n self.inputs.call_context.contract_address\n }\n\n pub fn chain_id(self) -> Field {\n self.inputs.tx_context.chain_id\n }\n\n pub fn version(self) -> Field {\n self.inputs.tx_context.version\n }\n\n pub fn gas_settings(self) -> GasSettings {\n self.inputs.tx_context.gas_settings\n }\n\n pub fn selector(self) -> FunctionSelector {\n self.inputs.call_context.function_selector\n }\n\n pub fn get_args_hash(self) -> Field {\n self.args_hash\n }\n\n pub fn push_note_hash(&mut self, note_hash: Field) {\n self.note_hashes.push(NoteHash { value: note_hash, counter: self.next_counter() });\n\n // WARNING(https://github.com/AztecProtocol/aztec-packages/issues/10558): if you delete this debug_log_format line, some tests fail.\n debug_log_format(\n \"Context.note_hashes, after pushing new note hash: {0}\",\n self.note_hashes.storage().map(|nh: NoteHash| nh.value),\n );\n }\n\n pub fn push_nullifier(&mut self, nullifier: Field) {\n notify_created_nullifier(nullifier);\n self.nullifiers.push(\n Nullifier { value: nullifier, note_hash: 0, counter: self.next_counter() },\n );\n }\n\n pub fn push_nullifier_for_note_hash(&mut self, nullifier: Field, nullified_note_hash: Field) {\n let nullifier_counter = self.next_counter();\n notify_nullified_note(nullifier, nullified_note_hash, nullifier_counter);\n self.nullifiers.push(\n Nullifier {\n value: nullifier,\n note_hash: nullified_note_hash,\n counter: nullifier_counter,\n },\n );\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 pub fn get_block_header(self) -> BlockHeader {\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_block_header_at(self, block_number: u32) -> BlockHeader {\n get_block_header_at(block_number, self)\n }\n\n pub fn set_return_hash(&mut self, returns_hasher: ArgsHasher) {\n execution_cache::store(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\n .key_validation_requests_and_generators\n .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_requests: self.public_call_requests.storage(),\n public_teardown_call_request: self.public_teardown_call_request,\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 private_logs: self.private_logs.storage(),\n contract_class_logs_hashes: self.contract_class_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(\n \"Setting {0} as fee payer\",\n [self.this_address().to_field()],\n );\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 notify_set_min_revertible_side_effect_counter(self.min_revertible_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 =\n 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 =\n 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\n // Typically we'd validate keys by showing that they are the preimage of `pk_m_hash`, but that'd require\n // the oracle returning the master secret keys, which could cause malicious contracts to leak it or learn\n // about secrets from other contracts. We therefore silo secret keys, and rely on the private kernel to\n // validate that we siloed secret key corresponds to correct siloing of the master secret key that hashes\n // to `pk_m_hash`.\n\n // Safety: Kernels verify that the key validation request is valid and below we verify that a request\n // for the correct public key has been received.\n let request = unsafe { get_key_validation_request(pk_m_hash, key_index) };\n assert_eq(request.pk_m.hash(), pk_m_hash, \"Obtained invalid key validation request\");\n\n self.key_validation_requests_and_generators.push(\n KeyValidationRequestAndGenerator {\n request,\n sk_app_generator: sk_generators[key_index],\n },\n );\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(\n &mut self,\n content: Field,\n secret: Field,\n sender: EthAddress,\n leaf_index: Field,\n ) {\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 leaf_index,\n );\n\n // Push nullifier (and the \"commitment\" corresponding to this can be \"empty\")\n self.push_nullifier(nullifier)\n }\n // docs:end:consume_l1_to_l2_message\n\n pub fn emit_private_log(&mut self, log: [Field; PRIVATE_LOG_SIZE_IN_FIELDS]) {\n let counter = self.next_counter();\n let private_log = PrivateLogData { log: Log::new(log), note_hash_counter: 0, counter };\n self.private_logs.push(private_log);\n }\n\n pub fn emit_raw_note_log(\n &mut self,\n log: [Field; PRIVATE_LOG_SIZE_IN_FIELDS],\n note_hash_counter: u32,\n ) {\n let counter = self.next_counter();\n let private_log = PrivateLogData { log: Log::new(log), note_hash_counter, counter };\n self.private_logs.push(private_log);\n }\n\n pub fn call_private_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT],\n ) -> ReturnsHash {\n let args_hash = hash_args_array(args);\n execution_cache::store(args);\n self.call_private_function_with_args_hash(\n contract_address,\n function_selector,\n args_hash,\n false,\n )\n }\n\n pub fn static_call_private_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT],\n ) -> ReturnsHash {\n let args_hash = hash_args_array(args);\n execution_cache::store(args);\n self.call_private_function_with_args_hash(\n contract_address,\n function_selector,\n args_hash,\n true,\n )\n }\n\n pub fn call_private_function_no_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n ) -> ReturnsHash {\n self.call_private_function_with_args_hash(contract_address, function_selector, 0, false)\n }\n\n pub fn static_call_private_function_no_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n ) -> ReturnsHash {\n self.call_private_function_with_args_hash(contract_address, function_selector, 0, true)\n }\n\n pub fn call_private_function_with_args_hash(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n ) -> ReturnsHash {\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n let start_side_effect_counter = self.side_effect_counter;\n\n // Safety: The oracle simulates the private call and returns the value of the side effects counter after\n // execution of the call (which means that end_side_effect_counter - start_side_effect_counter is\n // the number of side effects that took place), along with the hash of the return values. We validate these\n // by requesting a private kernel iteration in which the return values are constrained to hash\n // to `returns_hash` and the side effects counter to increment from start to end.\n let (end_side_effect_counter, returns_hash) = unsafe {\n call_private_function_internal(\n contract_address,\n function_selector,\n args_hash,\n start_side_effect_counter,\n is_static_call,\n )\n };\n\n self.private_call_requests.push(\n PrivateCallRequest {\n call_context: CallContext {\n msg_sender: self.this_address(),\n contract_address,\n function_selector,\n is_static_call,\n },\n args_hash,\n returns_hash,\n start_side_effect_counter,\n end_side_effect_counter,\n },\n );\n\n // 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 // 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 self.side_effect_counter = end_side_effect_counter + 1;\n ReturnsHash::new(returns_hash)\n }\n\n pub fn call_public_function<let ARGS_COUNT: u32>(\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 execution_cache::store(args);\n self.call_public_function_with_args_hash(\n contract_address,\n function_selector,\n args_hash,\n false,\n )\n }\n\n pub fn static_call_public_function<let ARGS_COUNT: u32>(\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 execution_cache::store(args);\n self.call_public_function_with_args_hash(\n contract_address,\n function_selector,\n args_hash,\n true,\n )\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_args_hash(contract_address, function_selector, 0, 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_args_hash(contract_address, function_selector, 0, true)\n }\n\n pub fn call_public_function_with_args_hash(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n ) {\n let counter = self.next_counter();\n\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n // Safety: TODO(https://github.com/AztecProtocol/aztec-packages/issues/8985): Fix this.\n // WARNING: This is insecure and should be temporary!\n // The oracle hashes the arguments and returns a new args_hash.\n // new_args = [selector, ...old_args], so as to make it suitable to call the public dispatch function.\n // We don't validate or compute it in the circuit because a) it's harder to do with slices, and\n // b) this is only temporary.\n let args_hash = unsafe {\n enqueue_public_function_call_internal(\n contract_address,\n function_selector,\n args_hash,\n counter,\n is_static_call,\n )\n };\n\n // Public calls are rerouted through the dispatch function.\n let function_selector = comptime { FunctionSelector::from_field(PUBLIC_DISPATCH_SELECTOR) };\n\n let call_request = PublicCallRequest {\n msg_sender: self.this_address(),\n contract_address,\n function_selector,\n is_static_call,\n args_hash,\n };\n\n self.public_call_requests.push(Counted::new(call_request, counter));\n }\n\n pub fn set_public_teardown_function<let ARGS_COUNT: u32>(\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 execution_cache::store(args);\n self.set_public_teardown_function_with_args_hash(\n contract_address,\n function_selector,\n args_hash,\n false,\n )\n }\n\n pub fn set_public_teardown_function_with_args_hash(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n ) {\n let counter = self.next_counter();\n\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n // Safety: TODO(https://github.com/AztecProtocol/aztec-packages/issues/8985): Fix this.\n // WARNING: This is insecure and should be temporary!\n // The oracle hashes the arguments and returns a new args_hash.\n // new_args = [selector, ...old_args], so as to make it suitable to call the public dispatch function.\n // We don't validate or compute it in the circuit because a) it's harder to do with slices, and\n // b) this is only temporary.\n let args_hash = unsafe {\n set_public_teardown_function_call_internal(\n contract_address,\n function_selector,\n args_hash,\n counter,\n is_static_call,\n )\n };\n\n let function_selector = comptime { FunctionSelector::from_field(PUBLIC_DISPATCH_SELECTOR) };\n\n self.public_teardown_call_request = PublicCallRequest {\n msg_sender: self.this_address(),\n contract_address,\n function_selector,\n is_static_call,\n args_hash,\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_requests: BoundedVec::new(),\n public_teardown_call_request: PublicCallRequest::empty(),\n l2_to_l1_msgs: BoundedVec::new(),\n historical_header: BlockHeader::empty(),\n private_logs: BoundedVec::new(),\n contract_class_logs_hashes: BoundedVec::new(),\n last_key_validation_requests: [Option::none(); NUM_KEY_TYPES],\n }\n }\n}\n"
3935
3935
  }
3936
3936
  }
3937
3937
  }