@aztec/protocol-contracts 0.64.0 → 0.65.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/artifacts/AuthRegistry.json +352 -352
- package/artifacts/ContractClassRegisterer.json +166 -166
- package/artifacts/ContractInstanceDeployer.json +106 -106
- package/artifacts/FeeJuice.json +626 -626
- package/artifacts/MultiCallEntrypoint.json +20 -20
- package/artifacts/Router.json +283 -283
- package/dest/protocol_contract_data.js +5 -5
- package/package.json +4 -4
- package/src/protocol_contract_data.ts +5 -5
package/artifacts/FeeJuice.json
CHANGED
|
@@ -4,40 +4,52 @@
|
|
|
4
4
|
"name": "FeeJuice",
|
|
5
5
|
"functions": [
|
|
6
6
|
{
|
|
7
|
-
"name": "
|
|
8
|
-
"is_unconstrained": true,
|
|
9
|
-
"custom_attributes": [],
|
|
10
|
-
"abi": {
|
|
11
|
-
"error_types": {
|
|
12
|
-
"17843811134343075018": {
|
|
13
|
-
"error_kind": "string",
|
|
14
|
-
"string": "Stack too deep"
|
|
15
|
-
}
|
|
16
|
-
},
|
|
17
|
-
"parameters": [],
|
|
18
|
-
"return_type": null
|
|
19
|
-
},
|
|
20
|
-
"bytecode": "H4sIAAAAAAAA/9VUyw6CMBBseURBOaiJ3kz8gyIYOJJ49x8akKMe8OKNT5eabbqpVRKlJkzSbEs3szNlW0oUKESPvAH9tGnIFdhBDCA6aN/tRgFr9hviQKs7JH/O0iQw+BtQ/5OfWtIvIPktnT+bAM+xVfzYi6w77UaIesKWZ/nPbHpe9fhc/MFnh32k1caghm+uIYci3RuYR4Y8iRlRd9prh/eV5YzJei7w++RVO67va/lrWIeafvmOFV/qrDMe1wmv+YFXVVrypcYv4KBzGnMvbGHe1wvY45yo3mjul/J0vZ0b0gNB8gCVxsvQjgYAAA==",
|
|
21
|
-
"debug_symbols": "ndLBCoQgEAbgd5lzh7S09FViCSsLQTTMFpbo3deiXdqli10GRvxmDvMv0MlmHmplejsBrxbQthVeWRO6ZU2gcUprNdTnZ0i3gtD+fxqF2drJC+eB5zgBaTrgJA26V1oCzxhdHwkgHAuyWJDHAhIJ8OUGRnB5EEYI+aIS7YbcMPSGKW6YMt5kl4dnFBUfQzP6Y9bQPYVTotHyyFU/m/YUM/8a5V/iRmdb2c1Obtk7xS7UKqzCOIwNo98=",
|
|
22
|
-
"brillig_names": [
|
|
23
|
-
"sync_notes"
|
|
24
|
-
]
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
"name": "initialize",
|
|
7
|
+
"name": "claim",
|
|
28
8
|
"is_unconstrained": false,
|
|
29
9
|
"custom_attributes": [
|
|
30
10
|
"private"
|
|
31
11
|
],
|
|
32
12
|
"abi": {
|
|
33
13
|
"error_types": {
|
|
14
|
+
"14514982005979867414": {
|
|
15
|
+
"error_kind": "string",
|
|
16
|
+
"string": "attempt to bit-shift with overflow"
|
|
17
|
+
},
|
|
18
|
+
"16761564377371454734": {
|
|
19
|
+
"error_kind": "string",
|
|
20
|
+
"string": "Array index out of bounds"
|
|
21
|
+
},
|
|
22
|
+
"17288131482828810359": {
|
|
23
|
+
"error_kind": "string",
|
|
24
|
+
"string": "Message not in state"
|
|
25
|
+
},
|
|
34
26
|
"17843811134343075018": {
|
|
35
27
|
"error_kind": "string",
|
|
36
28
|
"string": "Stack too deep"
|
|
37
29
|
},
|
|
30
|
+
"2920182694213909827": {
|
|
31
|
+
"error_kind": "string",
|
|
32
|
+
"string": "attempt to subtract with overflow"
|
|
33
|
+
},
|
|
38
34
|
"5019202896831570965": {
|
|
39
35
|
"error_kind": "string",
|
|
40
36
|
"string": "attempt to add with overflow"
|
|
37
|
+
},
|
|
38
|
+
"6485997221020871071": {
|
|
39
|
+
"error_kind": "string",
|
|
40
|
+
"string": "call to assert_max_bit_size"
|
|
41
|
+
},
|
|
42
|
+
"7233212735005103307": {
|
|
43
|
+
"error_kind": "string",
|
|
44
|
+
"string": "attempt to multiply with overflow"
|
|
45
|
+
},
|
|
46
|
+
"7764445047318889914": {
|
|
47
|
+
"error_kind": "string",
|
|
48
|
+
"string": "Public data tree index doesn't match witness"
|
|
49
|
+
},
|
|
50
|
+
"9199403315589104763": {
|
|
51
|
+
"error_kind": "string",
|
|
52
|
+
"string": "Proving public value inclusion failed"
|
|
41
53
|
}
|
|
42
54
|
},
|
|
43
55
|
"parameters": [
|
|
@@ -496,7 +508,7 @@
|
|
|
496
508
|
"visibility": "private"
|
|
497
509
|
},
|
|
498
510
|
{
|
|
499
|
-
"name": "
|
|
511
|
+
"name": "to",
|
|
500
512
|
"type": {
|
|
501
513
|
"fields": [
|
|
502
514
|
{
|
|
@@ -507,7 +519,28 @@
|
|
|
507
519
|
}
|
|
508
520
|
],
|
|
509
521
|
"kind": "struct",
|
|
510
|
-
"path": "authwit::aztec::protocol_types::address::
|
|
522
|
+
"path": "authwit::aztec::protocol_types::address::aztec_address::AztecAddress"
|
|
523
|
+
},
|
|
524
|
+
"visibility": "private"
|
|
525
|
+
},
|
|
526
|
+
{
|
|
527
|
+
"name": "amount",
|
|
528
|
+
"type": {
|
|
529
|
+
"kind": "field"
|
|
530
|
+
},
|
|
531
|
+
"visibility": "private"
|
|
532
|
+
},
|
|
533
|
+
{
|
|
534
|
+
"name": "secret",
|
|
535
|
+
"type": {
|
|
536
|
+
"kind": "field"
|
|
537
|
+
},
|
|
538
|
+
"visibility": "private"
|
|
539
|
+
},
|
|
540
|
+
{
|
|
541
|
+
"name": "message_leaf_index",
|
|
542
|
+
"type": {
|
|
543
|
+
"kind": "field"
|
|
511
544
|
},
|
|
512
545
|
"visibility": "private"
|
|
513
546
|
}
|
|
@@ -1622,399 +1655,112 @@
|
|
|
1622
1655
|
"visibility": "databus"
|
|
1623
1656
|
}
|
|
1624
1657
|
},
|
|
1625
|
-
"bytecode": "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",
|
|
1626
|
-
"debug_symbols": "7VjbjtpADP2XPOdhbM/Fs79SVSsu2VUkBIhLpQrx751BzAyFaSNTygopLyiT+MjHx7EPcGjm3XT/+d4vP1bb5u3boVmsZpNdv1qG06EBOt3brifLeNzuJptd8wbWq7bplvNw6ZQ6ts1Hv+iaN/L22N5EIxOfo5FtiQbrKtFkwJ+jyXgciPbIcI726E1horASDcw28fbqIppqwYCJCIDjy+DvbQN6FKYujBmFqQtjR2Hqwrh/F0YDmnO0Bgul1JAtpuD/n8JXU6ByKQUyD6RwhCnakXYlBdPrthfVKExdGBiFqQuDjxDGFGEYB4QxnBaBhULdnwYb6RFsPCY2mobaBN5iXkzeXsZHrW5dATkXG67ZXu8m1K9fgnl2CaiQKFFSGvQNpbqhEyWbgDBkA5TYmjRj7LwdUMlxmhrGQgcJT3TqNkoOMp1BhXyZS48Xk1CnAyYLBFaVGQvdi3zqnqtzwWCUft4U+0ew+dIRIPX6JcCzSxiY4nCabvrFov98/+13r4ofuu5DoDLbsHSu3jNNd2D0HRhzB8ZKMeEAMbT+Hc6URlwsujj94YAx0FVxPq8kzzdrzIEcgnIIySFaDjFyiJVDnBzCcogXQ1jefZZ3n+XdZ3n3Wd59lnef5d1nefe53n2drZ/dDcSLIV7JISCHoBxCcogWQsKJ/vL/qYO8cp3D69WpR/M5mU84/Zhs+sl00UVTjg/3y1ny6HDc/VynJ8nF15vVrJvvN13082LlURhSrVaBCcQXU3NrKPvb6RZSi5ytKyIMt5YTwts2kC2djffAtKhyy/6U5Bhq+QU=",
|
|
1658
|
+
"bytecode": "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",
|
|
1659
|
+
"debug_symbols": "7b3djitJdqT7Ln1dF+Huy//mVQbCQNLoDBpoSANJc4CDgd79xK7aZOYuMmJ1BiNJo9m6EWqr6cmwZaTHcmP45//3L//zX/7p//yv//HXf/1//u0//vLf/vv//cvf/u2f//E///pv/7r+6//+JZXf/3//8b//8V9//PM//vMf//0///LfUpvLb3/5l3/9n+t/9mX5r9/+8v/89W//8pf/Vqb91283r86jjJ+vzqN9vDrVcefVpab589Wlzuy8emazn6+eufbrq3Npd16dLOfLdZulj+su916c8uVCUurj84v/4be/JIvC3C9MjcLcL0xDL8xI18LM6hVmjHa57rnUhwrTozD3CzOiMPcLMx8vjKVcf77aUvv4Zqdl/niLvHz/W6R7b5GXdilqXmZz3qKM8fEOn15b713OOt1dXpx7+bDrnlvVlotb1bJ9fvGPS8/ve+nlfS/d3vfS6/teenvfS+/ve+njfS99vu2ll+V9L/1976blfe+m5X3vpuV976blfe+m5X3vpuV976blfe+m5X3vpva+d1N737upve/d1N73bmrveze1972b2vveTe1976b2vndTe9+7aX3fu2l937tpfd+7aX3fu2l937tpffbdtC2X33Ot5eXPV9OgrqZDXc2Auppn35lavf441/qfr6YtUFeToK4mQ11NgboaQ/pONai5uEHNxQ1qLm4D6lMMNRd3qLm4Q83FHWou7lBzcTeoq6lQV9OgrqZDXQ3UXNyh5uIBNRcPqLl4ZKSOYhSoq4HqiwdUXzyg5uIBNRcPqLl4QM3FE2ounlBz8YTqiydUXzyh+uIJ1RdPqLl4Qs3FE2ounlBzcVoWpJYiLQnrcqBa47RA9cZpgZqQ0wI1I6cFakpOC9ScnBaoSTktWLNygmqRU4LqkVOCapJTguqSU8KalRPWrJywZuWENSsnqEcrUppQl5OxeuWM1StnrFk5Y83KGWtWzlizcsaalTPWrJyxeuWM1SsXrF65YPXKBWtWLlizcsGalQvWrFygHnxLBerJt1SweuWC1Ssb1qxsWLOyYc3KhjUrG9asbFizsmH1yobVKxtWr2xYvXLFmpUr1qxcsWblijUrP31v336DgbVfL2Ft2EtYO/ZSxZqVsfbsJaxNewlr117C2raXsPbtpedv3Nu/HKxeuWH1yg2rV8bavJewdu8lrO17CWv/XupYT8Z1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qpXqpZS456taqV5KiXu+qhXKpVa1QrnUqlYql2LjnjtqpXopJe75qlaql1Linq9qhZgIq1ohJsKqViqXYuOeO2qleikl7vmqVqqXUuKer2qleikl7vmqViqXYuOeO2qlcik27rmjVqqXUuKer2qleikl7vmqVoiJsKo1KbVSuRQb99xRK9VLKXHPV7VSvZQS93xVK9VLKXHPV7VSuRQb99xRK5VLsXHPHbVSvZQS93xVK9VLKXHPV7VCTIRVrRATYVUrlUuxcc8dtVK9lBL3fFUr1Uspcc9XtVK9lBL3fFUrlUuxcc8dtVK5FBv33FEr1Uspcc9XtVK9lBL3fFUrxURg4547aqVyKTbuuaNWqpdS4p6vaqV6KSXu+apWqpdS4p6vaqVyKTbuuaNWKpdi4547aqV6KSXu+apWqpdS4p6vaqWYCGzcc0etUi6V2LjnjlqlXipJcc+TFPc8LSalVqmXSlLc88TGPXfUKuVSiY17XnfVsnHPHbVSvZQU9zxJcc+TFPc8sXHP91d8bNxzR61SLpXYuOeOWqleSop7nqS450mKe56kuOdJinue2LjnjlqpXIqNe+6olcqlpLjnSYp7nqS450mKe57YuOf7Kz427rmjViqXYuOeO2qleikp7nmS4p4nKe55kuKeJynueWLjnjtqTUqtVC7Fxj131Er1UlLc8yTFPU9S3PPExj3fX/Gxcc8dtVK5FBv33FEr1UtJcc+TFPc8SXHPkxT3PElxzxMb99xRK5VLsXHPHbUmpVaql5Linicp7nmS4p4nNu75/oqPjXvuqJXKpdi4545aqV5KinuepLjnSYp7nqS450mKe57YuOf7atm4545aqVyKjXvuqJXqpaS450mKe56kuOeJjXu+v+Jj4547aqVyKTbuuaNWqpeS4p4nKe55kuKeJynueZLinic27rmjViqXYuOe76rNbNxzR61SL5WluOdZinueF5NSq8REyGzcc0etUi6V2bjnjlqpXkqKe56luOdZinuepbjnWYp7ntm4545apVwqs3HPHbVKuVSW4p5nKe55luKeZynueWbjnu+v+Ni4545aqVxKinuepbjnWYp7nqW451mKe56luOeZjXu+fweS4p5nKe55ZuOeO99bqV5KinuepbjnWYp7nqW455mNe75/B2LjnjtqpXopNu65o1aql5Linmcp7nmW4p5nKe55luKeZzbuuaNW6jc+Nu65o9ak1HL1Un2ki9o+yq1a+F5qXq4kzVQ9teu7X9Tm/ova2xdXWy5/uq634tvSwDderysNfJf2utLAt3QvKw0+q/11pYFvFl9XGvjO8nWlgW9DX1cai9JslQa+wX1daaIb3ixNdMObpYlueLM00Q1vlQaftv+60kQ3vFma6IY3SxPd8GZpLEqzVZrohjdLE93wZmmiG94sTXTDm6WJbnirNPjnJbyuNNENb5YmuuHN0kQ3vFkai9JslSa64c3SRDe8WZrohjdLE93wZmmiG94qDf6JF18qjbN7Af/Ei1PVcvWsnlquNtRTa1xq95+UxT/x4lS1XP2fp5arpfPUcnVpnlquxmt/Ti74J16cqlaplyr4J16cqpasl9qdpcpiUmqVeqmCf+LFqWqVeqmCf+LFqWrJeql9tfgnXpyqlqyXctSS9VKOWqleCv/Ei1PVSvVS+CdenKqWrJfaX/Hhn3hxqlqpXAr/xItT1Ur1UvgnXpyqVqqXwj/x4lS1Ur0U/okXp6qVyqXwT7w4Va1ULoV/4sWpaqV6KfwTL05VK9VL4Z94capasl5qf8WHf+LFqWqlcin8Ey9OVSvVS+GfeHGqWqleCv/Ei1PVSvVS+CdenKpWKpfCP/HiVLVSuRT+iRenqpXqpfBPvDhVrVQvhX/ixalqlfbxFfwTL05VK5VLkZ144amV6qXIzqXw1Er1UmSnR3hqpXopsjMePLVSuRTZSQyeWqlciuy8BE+tVC9FdqqBp1aqlyI7e8BTK8VEIDshwFMrlUuRcfw9tVK9FBlt31Mr1UuRMfE9tVK9FBm53lMrlUuR8eU9tVK5FBkF3lMr1UuRsdo9tVK9FBlR3VMrxUSQ4p4XKe55keKeFzbu+f4sJcU9L1Lc8yLFPS9S3PMixT0vbNzzXbXGxj131CrlUsbGPXfUKvVStpiUWqVeyqS458bGPd9d8Rkb99xRq5RLGRv33FEr1UtJcc9NintuUtxzk+KemxT33Ni4545apVzK2Ljn+2rZuOeOWqleSop7blLcc5Pinhsb93x/xcfGPXfUSuVSbNxzR61ULyXFPTcp7rlJcc9NintuUtxzY+OeO2qlcik27rmjViqXkuKemxT33KS45ybFPTc27vn+io+Ne+6olcql2LjnjlqpXkqKe25S3HOT4p6bFPfcpLjnxsY9d9SalFqpXIqNe+6oleqlpLjnJsU9NynuubFxz/dXfGzcc0etVC7Fxj131Er1UlLcc5PinpsU99ykuOcmxT03Nu65o1Yql2LjnjtqTUqtVC8lxT03Ke65SXHPjY17vr/iY+OeO2qlcik27rmjVqqXkuKemxT33KS45ybFPTcp7rmxcc/31bJxzx21UrkUG/fcUSvVS0lxz02Ke25S3HNj457vr/jYuOeOWqVcqrJxzx21Sr1UleKeVynueV1MSq1SL1WluOeVjXvuqFXKpSob93xfLRv33FEr1UtJcc+rFPe8SnHPKxv3fH/Fx8Y9d9Qq5VKVjXvuqJXqpaS451WKe16luOdVintepbjnlY177qiVyqXYuOeOWqlcSop7XqW451WKe16luOeVjXu+v+Jj4547aqVyKTbuuaNWqpeS4p5XKe55leKeVynueZXinlc27rmj1qTUSuVSbNxzR61ULyXFPa9S3PMqxT2vbNzz/RUfG/fcUSuVS7Fxzx21Ur2UFPe8SnHPqxT3vEpxz6sU97yycc8dtVK5FBv33FFrUmqleikp7nmV4p5XKe55ZeOe76/42LjnjlqpXIqNe+6oleqlpLjnVYp7XqW451WKe16luOeVjXu+r5aNe+6olcql2LjnjlqpXkqKe16luOdVinte2bjn+ys+Nu65o1Yql2LjnjtqpXopKe55leKeVynueZXinlcp7nll4547aqVyKTbu+a7axsY9d9Qq9VJNinvepLjn65pBSq0SE6Gxcc8dtUq5VGPjnjtqpXopKe55k+KeNynueZPinjcp7nlj4547apVyqcbGPXfUKuVSTYp73qS4502Ke96kuOeNjXu+v+Jj4547aqVyKTbuuaNWqpeS4p43Ke55k+KeNynueZPinjc27rmj1qTUSuVSbNxzR61ULyXFPW9S3PMmxT1vbNzz/RUfG/fcUSuVS7Fxzx21Ur2UFPe8SXHPmxT3vElxz5sU97yxcc8dtVK5FBv33FFrUmqleikp7nmT4p43Ke55Y+Oe76/42LjnjlqpXIqNe+6oleqlpLjnTYp73qS4502Ke96kuOeNjXu+r5aNe+6olcql2LjnjlqpXkqKe96kuOdNinve2Ljn+ys+Nu65o1Yql2LjnjtqpXopKe55k+KeNynueZPinjcp7nlj4547aqVyKTbu+b5aNu65o1aql5Linjcp7nmT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eikp7vmQ4p4PKe75YOOe76/42LjnjlqpXIqNe+6oleqlpLjnQ4p7PqS450OKez6kuOeDjXu+r5aNe+6olcql2LjnjlqpXkqKez6kuOdDins+2Ljn+ys+Nu65o1Yql2LjnjtqpXopKe75kOKeDynu+ZDing8p7vlg4547aqVyKTbu+b5aNu65o1aql5Ling8p7vmQ4p4PNu75/oqPjXvuqJXKpdi4545aqV5Kins+pLjnQ4p7PqS450OKez7YuOeOWqlcio177qiVyqWkuOdDins+pLjnQ4p7Pti45/srPjbuuaNWKpdi4547aqV6KSnu+ZDing8p7vmQ4p4PKe75YOOeO2pNSq1ULsXGPXfUSvVSUtzzIcU9H1Lc88HGPd9f8bFxzx21UrkUG/fcUSvVS0lxz4cU93xIcc+HFPd8SnHPJxv33FGrlEtNNu65o9ak1Cr1UlOKez6luOdTins+2bjnuyu+ycY9d9Qq5VKTjXvuqJXqpaS451OKez6luOdTins+pbjnk417vq+WjXvuqJXKpdi4545aqV5Kins+pbjnU4p7Ptm45/srPjbuuaNWKpdi4547aqV6KSnu+ZTink8p7vmU4p5PKe75ZOOeO2qlcik27vm+WjbuuaNWqpeS4p5PKe75lOKeTzbu+f6Kj4177qiVyqXYuOeOWqleSop7PqW451OKez6luOdTins+2bjnjlqpXIqNe+6olcqlpLjnU4p7PqW451OKez7ZuOf7Kz427rmjViqXkuKeTynu+ZTink8p7vmU4p5PKe75ZOOe79+BpLjnU4p7Ptm45873VqqXkuKeTynu+ZTink8p7vlk457v34HYuOeOWqleio177qiV6qWkuOdTins+pbjnU4p7PqW455ONe+6olfqNj4177qg1KbVcvVQfl1ev/1lu1aL3UpauV2Ku2tEvL57Lx1/Opd276pYul5Fa/vjL5a7EkfvlxaPm/Rfnmi/lWOs4P7/4j5qjd3SMNUfvKxlrjt7d0tW8LfA8fMaao3f6jDVHX28w1hx91cNYc4uaP73m6CtAxprHOvT5NY916PNrHuvQ59c81qFPrzn8WSKMNY916PNrHuvQ59c81qHPr7lFzU+v+UjXX/JGG/svHt0utVuvftwaFItWcINihftig+r1p/Cx2uFchlkrl+sw63dmxFg9c/kZK3PwCTSW8dgGwZ95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",
|
|
1627
1660
|
"brillig_names": [
|
|
1661
|
+
"build_msg_block",
|
|
1662
|
+
"attach_len_to_msg_block",
|
|
1663
|
+
"get_public_data_witness",
|
|
1664
|
+
"field_less_than",
|
|
1665
|
+
"decompose_hint",
|
|
1666
|
+
"lte_hint",
|
|
1667
|
+
"build_msg_block",
|
|
1668
|
+
"get_l1_to_l2_membership_witness",
|
|
1628
1669
|
"pack_arguments_oracle_wrapper",
|
|
1629
1670
|
"enqueue_public_function_call_internal",
|
|
1630
|
-
"
|
|
1631
|
-
"
|
|
1632
|
-
"
|
|
1671
|
+
"directive_to_radix",
|
|
1672
|
+
"directive_invert",
|
|
1673
|
+
"directive_integer_quotient"
|
|
1633
1674
|
],
|
|
1634
|
-
"verification_key": "
|
|
1635
|
-
"artifact_hash": "
|
|
1675
|
+
"verification_key": "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",
|
|
1676
|
+
"artifact_hash": "7cb5566fe25622a27de9406180c3ef36c08c61ac-af95062002b9c90922e822b574aaf078-mega-honk-true"
|
|
1636
1677
|
},
|
|
1637
1678
|
{
|
|
1638
|
-
"name": "
|
|
1639
|
-
"is_unconstrained":
|
|
1679
|
+
"name": "initialize",
|
|
1680
|
+
"is_unconstrained": false,
|
|
1640
1681
|
"custom_attributes": [
|
|
1641
|
-
"
|
|
1642
|
-
"view"
|
|
1682
|
+
"private"
|
|
1643
1683
|
],
|
|
1644
1684
|
"abi": {
|
|
1645
1685
|
"error_types": {
|
|
1646
|
-
"15238796416211288225": {
|
|
1647
|
-
"error_kind": "string",
|
|
1648
|
-
"string": "Balance too low"
|
|
1649
|
-
},
|
|
1650
|
-
"16761564377371454734": {
|
|
1651
|
-
"error_kind": "string",
|
|
1652
|
-
"string": "Array index out of bounds"
|
|
1653
|
-
},
|
|
1654
1686
|
"17843811134343075018": {
|
|
1655
1687
|
"error_kind": "string",
|
|
1656
1688
|
"string": "Stack too deep"
|
|
1657
1689
|
},
|
|
1658
|
-
"206160798890201757": {
|
|
1659
|
-
"error_kind": "string",
|
|
1660
|
-
"string": "Storage slot 0 not allowed. Storage slots must start from 1."
|
|
1661
|
-
},
|
|
1662
|
-
"3219842053230618354": {
|
|
1663
|
-
"error_kind": "string",
|
|
1664
|
-
"string": "Function check_balance can only be called statically"
|
|
1665
|
-
},
|
|
1666
1690
|
"5019202896831570965": {
|
|
1667
1691
|
"error_kind": "string",
|
|
1668
1692
|
"string": "attempt to add with overflow"
|
|
1669
|
-
},
|
|
1670
|
-
"6485997221020871071": {
|
|
1671
|
-
"error_kind": "string",
|
|
1672
|
-
"string": "call to assert_max_bit_size"
|
|
1673
|
-
}
|
|
1674
|
-
},
|
|
1675
|
-
"parameters": [
|
|
1676
|
-
{
|
|
1677
|
-
"name": "fee_limit",
|
|
1678
|
-
"type": {
|
|
1679
|
-
"kind": "field"
|
|
1680
|
-
},
|
|
1681
|
-
"visibility": "private"
|
|
1682
|
-
}
|
|
1683
|
-
],
|
|
1684
|
-
"return_type": null
|
|
1685
|
-
},
|
|
1686
|
-
"bytecode": "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",
|
|
1687
|
-
"debug_symbols": "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",
|
|
1688
|
-
"brillig_names": [
|
|
1689
|
-
"check_balance"
|
|
1690
|
-
]
|
|
1691
|
-
},
|
|
1692
|
-
{
|
|
1693
|
-
"name": "set_portal",
|
|
1694
|
-
"is_unconstrained": true,
|
|
1695
|
-
"custom_attributes": [
|
|
1696
|
-
"public"
|
|
1697
|
-
],
|
|
1698
|
-
"abi": {
|
|
1699
|
-
"error_types": {
|
|
1700
|
-
"13380390304262695167": {
|
|
1701
|
-
"error_kind": "string",
|
|
1702
|
-
"string": "SharedImmutable already initialized"
|
|
1703
|
-
},
|
|
1704
|
-
"17843811134343075018": {
|
|
1705
|
-
"error_kind": "string",
|
|
1706
|
-
"string": "Stack too deep"
|
|
1707
|
-
},
|
|
1708
|
-
"6485997221020871071": {
|
|
1709
|
-
"error_kind": "string",
|
|
1710
|
-
"string": "call to assert_max_bit_size"
|
|
1711
1693
|
}
|
|
1712
1694
|
},
|
|
1713
1695
|
"parameters": [
|
|
1714
1696
|
{
|
|
1715
|
-
"name": "
|
|
1697
|
+
"name": "inputs",
|
|
1716
1698
|
"type": {
|
|
1717
1699
|
"fields": [
|
|
1718
1700
|
{
|
|
1719
|
-
"name": "
|
|
1701
|
+
"name": "call_context",
|
|
1720
1702
|
"type": {
|
|
1721
|
-
"
|
|
1703
|
+
"fields": [
|
|
1704
|
+
{
|
|
1705
|
+
"name": "msg_sender",
|
|
1706
|
+
"type": {
|
|
1707
|
+
"fields": [
|
|
1708
|
+
{
|
|
1709
|
+
"name": "inner",
|
|
1710
|
+
"type": {
|
|
1711
|
+
"kind": "field"
|
|
1712
|
+
}
|
|
1713
|
+
}
|
|
1714
|
+
],
|
|
1715
|
+
"kind": "struct",
|
|
1716
|
+
"path": "authwit::aztec::protocol_types::address::aztec_address::AztecAddress"
|
|
1717
|
+
}
|
|
1718
|
+
},
|
|
1719
|
+
{
|
|
1720
|
+
"name": "contract_address",
|
|
1721
|
+
"type": {
|
|
1722
|
+
"fields": [
|
|
1723
|
+
{
|
|
1724
|
+
"name": "inner",
|
|
1725
|
+
"type": {
|
|
1726
|
+
"kind": "field"
|
|
1727
|
+
}
|
|
1728
|
+
}
|
|
1729
|
+
],
|
|
1730
|
+
"kind": "struct",
|
|
1731
|
+
"path": "authwit::aztec::protocol_types::address::aztec_address::AztecAddress"
|
|
1732
|
+
}
|
|
1733
|
+
},
|
|
1734
|
+
{
|
|
1735
|
+
"name": "function_selector",
|
|
1736
|
+
"type": {
|
|
1737
|
+
"fields": [
|
|
1738
|
+
{
|
|
1739
|
+
"name": "inner",
|
|
1740
|
+
"type": {
|
|
1741
|
+
"kind": "integer",
|
|
1742
|
+
"sign": "unsigned",
|
|
1743
|
+
"width": 32
|
|
1744
|
+
}
|
|
1745
|
+
}
|
|
1746
|
+
],
|
|
1747
|
+
"kind": "struct",
|
|
1748
|
+
"path": "authwit::aztec::protocol_types::abis::function_selector::FunctionSelector"
|
|
1749
|
+
}
|
|
1750
|
+
},
|
|
1751
|
+
{
|
|
1752
|
+
"name": "is_static_call",
|
|
1753
|
+
"type": {
|
|
1754
|
+
"kind": "boolean"
|
|
1755
|
+
}
|
|
1756
|
+
}
|
|
1757
|
+
],
|
|
1758
|
+
"kind": "struct",
|
|
1759
|
+
"path": "authwit::aztec::protocol_types::abis::call_context::CallContext"
|
|
1722
1760
|
}
|
|
1723
|
-
}
|
|
1724
|
-
],
|
|
1725
|
-
"kind": "struct",
|
|
1726
|
-
"path": "authwit::aztec::protocol_types::address::eth_address::EthAddress"
|
|
1727
|
-
},
|
|
1728
|
-
"visibility": "private"
|
|
1729
|
-
}
|
|
1730
|
-
],
|
|
1731
|
-
"return_type": null
|
|
1732
|
-
},
|
|
1733
|
-
"bytecode": "JgAEAQInAASARAABJgAEAwAmAgQBAiYCBAADHxgAAwACgEMtCIBDAAEkAAAAQCcCBIBEAAEmAgQAAjoNAAEAAiQAAADcJgIAAgIuDAACAAMcDAADBCsCAAAAAAAAAAAAAAAAAP//////////////////////////AAUOOAQFBiMCAAAAjAAGJAAAAQUmAgAABAo4AwQFIwIAAACnAAUmAgQABjsJAQYoAgA7msoCAAMuDAADAAUKOAUEBiMCAAAAyAAGJAAAARcnAgDerQAELwwABAADLwwAAQACJScABHgAgAQNAAAAgASAAyMAAAABBIADKQEF96Hzr6Wt1MoAATsBAQIlKQEFWgLkG7UeqZ8AATsBAQIlKQEFubCyFuGoqP8AATsBAQIlLQAYyhjK",
|
|
1734
|
-
"debug_symbols": "7ZfdisIwEIXfJde9yORnJvFVlkWqVimUVmpdWMR338Q1qVqXQNFFsDdtp3zJ9BwmU+bAVsViv5mX9brZsdnHgVXNMu/KpnbR4ZixRVtWVbmZX75m3F/QnvjdNq99uOvytmMzMAIyVtQr/6i122FdVgWbSYvHbEgT8UCT7WlQ6g5NAvBMk5DU03Rvb+KcAs0VJmgAjiZ8igvgiv/MGKm3kmv4/8vlEOVqkZILOsDKRFZIe4c1NmxsAROswuCisrJnfz3Rkye3noAQkylDU2gyZWCKnI7P0BSV7rNIV6acVukxq/SoXNqMWYVy1Ko/zg3Ff5UFSJWI1DbQ0qhX/sm623vpNeIBepUQgVaXCpzeUw56fg6rn55DcP6AHMhju0SBqdpAjO0SjUzVhkIZaA0qWRuudcfaEGBua0Nwei+9IB+hF3XUa+F19R5d+JW3Zb6oivNkud7Xy4tBs/veFjcz57ZtlsVq3xZ++uwHT/AHQ8pMGn8UwQc2U+ByuDw/",
|
|
1735
|
-
"brillig_names": [
|
|
1736
|
-
"set_portal"
|
|
1737
|
-
]
|
|
1738
|
-
},
|
|
1739
|
-
{
|
|
1740
|
-
"name": "compute_note_hash_and_optionally_a_nullifier",
|
|
1741
|
-
"is_unconstrained": true,
|
|
1742
|
-
"custom_attributes": [],
|
|
1743
|
-
"abi": {
|
|
1744
|
-
"error_types": {
|
|
1745
|
-
"16957488177269924912": {
|
|
1746
|
-
"error_kind": "fmtstring",
|
|
1747
|
-
"item_types": [],
|
|
1748
|
-
"length": 16
|
|
1749
|
-
},
|
|
1750
|
-
"17843811134343075018": {
|
|
1751
|
-
"error_kind": "string",
|
|
1752
|
-
"string": "Stack too deep"
|
|
1753
|
-
}
|
|
1754
|
-
},
|
|
1755
|
-
"parameters": [
|
|
1756
|
-
{
|
|
1757
|
-
"name": "contract_address",
|
|
1758
|
-
"type": {
|
|
1759
|
-
"fields": [
|
|
1761
|
+
},
|
|
1760
1762
|
{
|
|
1761
|
-
"name": "
|
|
1762
|
-
"type": {
|
|
1763
|
-
"kind": "field"
|
|
1764
|
-
}
|
|
1765
|
-
}
|
|
1766
|
-
],
|
|
1767
|
-
"kind": "struct",
|
|
1768
|
-
"path": "authwit::aztec::protocol_types::address::aztec_address::AztecAddress"
|
|
1769
|
-
},
|
|
1770
|
-
"visibility": "private"
|
|
1771
|
-
},
|
|
1772
|
-
{
|
|
1773
|
-
"name": "nonce",
|
|
1774
|
-
"type": {
|
|
1775
|
-
"kind": "field"
|
|
1776
|
-
},
|
|
1777
|
-
"visibility": "private"
|
|
1778
|
-
},
|
|
1779
|
-
{
|
|
1780
|
-
"name": "storage_slot",
|
|
1781
|
-
"type": {
|
|
1782
|
-
"kind": "field"
|
|
1783
|
-
},
|
|
1784
|
-
"visibility": "private"
|
|
1785
|
-
},
|
|
1786
|
-
{
|
|
1787
|
-
"name": "note_type_id",
|
|
1788
|
-
"type": {
|
|
1789
|
-
"kind": "field"
|
|
1790
|
-
},
|
|
1791
|
-
"visibility": "private"
|
|
1792
|
-
},
|
|
1793
|
-
{
|
|
1794
|
-
"name": "compute_nullifier",
|
|
1795
|
-
"type": {
|
|
1796
|
-
"kind": "boolean"
|
|
1797
|
-
},
|
|
1798
|
-
"visibility": "private"
|
|
1799
|
-
},
|
|
1800
|
-
{
|
|
1801
|
-
"name": "serialized_note",
|
|
1802
|
-
"type": {
|
|
1803
|
-
"kind": "array",
|
|
1804
|
-
"length": 0,
|
|
1805
|
-
"type": {
|
|
1806
|
-
"kind": "field"
|
|
1807
|
-
}
|
|
1808
|
-
},
|
|
1809
|
-
"visibility": "private"
|
|
1810
|
-
}
|
|
1811
|
-
],
|
|
1812
|
-
"return_type": {
|
|
1813
|
-
"abi_type": {
|
|
1814
|
-
"kind": "array",
|
|
1815
|
-
"length": 4,
|
|
1816
|
-
"type": {
|
|
1817
|
-
"kind": "field"
|
|
1818
|
-
}
|
|
1819
|
-
},
|
|
1820
|
-
"visibility": "public"
|
|
1821
|
-
}
|
|
1822
|
-
},
|
|
1823
|
-
"bytecode": "H4sIAAAAAAAA/9VZS27bMBClLcmy5Mh27RsE6K4FxFj+ZGegn5xDTewT9ABadNOeuiHMkZ5Hk8KAh0U8QEBZQ715fDMiKWZgTjZ+/Rv469i3I9M36rP3bXmdWUWsMiTPwY3wHN4Iz+hGeMaKPAcCT9fS+5aY0zuXmtP72HPiwy7REfjNv4BY0D++zXw7BL9iYmwmDFYLf1dWz5k5N2X+q8xjpmHw14Q/DoNfEu8vTYePY6G4kW+fmk7LJ3jGWeGvsYgJl3xD8H1lvgh835gPa/g782HdEyfSbQRjUayrXei80NhSGNvgjdaYTju8R1rnJmiNWsp5xvhw/sSnoD5Nx2fEfDH4MuZLwEf6u/Ye+vHcp9DvM9znNRmZfg2Tn3KOWoeoqTgA/qtVku48J3FzHht9qHsMet4zfUKsFahPCP2dPss3+NO1s7QxrUVMT9SINBtjf+bLwBc353Fy/zuGOIhFPBLW/5P/PfPtCJ6h5+dC/BGLf8ZbuIcacaxIuEf93Tv50V9PzKl+flF/05+n9DbVm0qas/Xwty1+Fob/kfDzMPgbwp+EwW/3MndB8B9Kwi/C8H8k/GmY+mn3krMw/A+EPw+CXx1o3f1gOmvnB3+9gPt6c7e1l+yJMH7OuIbaEy0YH64Prr/OtxS4zgUfz+FSiLMU4khYmSLWnSLW7J2OcayINVHEmipiaeYxVcTS1CtXxCoUsTTrXlMvyqO0T3O29215pUn7NEV8K+3TNL/dSWuqr1jQEMeXsP4/mc6TIDztA6059K5TDIxdBIp96XpN8QuBD/HOBd81h7KHH+u1fay31pbHTbVq81kwrvwefhPhfIz9pbVf2vcpal1K3/1T0NVZDL6C+RLwEUfpu38aiP8l+mP8ueDj6/+luVyY/no4YePGM669ypi78z/pbD7w/LW+9N2k+Lnpz9f/63wR9eF76VzgOhd8fH+SC3FyIc4tYvEzetTQ1TXpFDedXyuX2133Dy6aixJzfu5vWPyE9f/tf+PYqL1mzj9ua3tc1cd6Xb+8VM/1guE7G4JOfwHiE0IYFR8AAA==",
|
|
1824
|
-
"debug_symbols": "tdfNaoQwFAXgd8k6C29+jPFVShmixiEQokQtFPHdG4dpO8wsh7MRrly/gHiQs7PBd9v1EtI4Laz92FmcereGKZVpPzjrcogxXC+Pt1l1Xqy87S+zS+e4rC6vrFWCM58G1uqqPD2G6FkrbX3wl03zu2nM36Zujk/OrILJGibXMNnA5AYmW5RMVYWjCUcLHC1xtMLRGkfXONrg6AZH49JIuDQSLo2ESyPh0ki4NBIujfRmGq28b5ZX+2IboN0AbYuzRQW0CWgLoC2BtgLaGmgDcymAuRTAXApULo8yfbkcXBf9vViNW+ofetb6PfunyjXnqffDlv1Zvv571/ktS8WVuv3ay0BScJKmHFIO+gE=",
|
|
1825
|
-
"brillig_names": [
|
|
1826
|
-
"compute_note_hash_and_optionally_a_nullifier"
|
|
1827
|
-
]
|
|
1828
|
-
},
|
|
1829
|
-
{
|
|
1830
|
-
"name": "public_dispatch",
|
|
1831
|
-
"is_unconstrained": true,
|
|
1832
|
-
"custom_attributes": [
|
|
1833
|
-
"public"
|
|
1834
|
-
],
|
|
1835
|
-
"abi": {
|
|
1836
|
-
"error_types": {
|
|
1837
|
-
"10502589790419500451": {
|
|
1838
|
-
"error_kind": "string",
|
|
1839
|
-
"string": "Function _increase_public_balance can only be called internally"
|
|
1840
|
-
},
|
|
1841
|
-
"13380390304262695167": {
|
|
1842
|
-
"error_kind": "string",
|
|
1843
|
-
"string": "SharedImmutable already initialized"
|
|
1844
|
-
},
|
|
1845
|
-
"15238796416211288225": {
|
|
1846
|
-
"error_kind": "string",
|
|
1847
|
-
"string": "Balance too low"
|
|
1848
|
-
},
|
|
1849
|
-
"16761564377371454734": {
|
|
1850
|
-
"error_kind": "string",
|
|
1851
|
-
"string": "Array index out of bounds"
|
|
1852
|
-
},
|
|
1853
|
-
"16957488177269924912": {
|
|
1854
|
-
"error_kind": "fmtstring",
|
|
1855
|
-
"item_types": [],
|
|
1856
|
-
"length": 16
|
|
1857
|
-
},
|
|
1858
|
-
"17843811134343075018": {
|
|
1859
|
-
"error_kind": "string",
|
|
1860
|
-
"string": "Stack too deep"
|
|
1861
|
-
},
|
|
1862
|
-
"206160798890201757": {
|
|
1863
|
-
"error_kind": "string",
|
|
1864
|
-
"string": "Storage slot 0 not allowed. Storage slots must start from 1."
|
|
1865
|
-
},
|
|
1866
|
-
"3219842053230618354": {
|
|
1867
|
-
"error_kind": "string",
|
|
1868
|
-
"string": "Function check_balance can only be called statically"
|
|
1869
|
-
},
|
|
1870
|
-
"5019202896831570965": {
|
|
1871
|
-
"error_kind": "string",
|
|
1872
|
-
"string": "attempt to add with overflow"
|
|
1873
|
-
},
|
|
1874
|
-
"6067862452620309358": {
|
|
1875
|
-
"error_kind": "string",
|
|
1876
|
-
"string": "Function balance_of_public can only be called statically"
|
|
1877
|
-
},
|
|
1878
|
-
"6485997221020871071": {
|
|
1879
|
-
"error_kind": "string",
|
|
1880
|
-
"string": "call to assert_max_bit_size"
|
|
1881
|
-
}
|
|
1882
|
-
},
|
|
1883
|
-
"parameters": [
|
|
1884
|
-
{
|
|
1885
|
-
"name": "selector",
|
|
1886
|
-
"type": {
|
|
1887
|
-
"kind": "field"
|
|
1888
|
-
},
|
|
1889
|
-
"visibility": "private"
|
|
1890
|
-
}
|
|
1891
|
-
],
|
|
1892
|
-
"return_type": null
|
|
1893
|
-
},
|
|
1894
|
-
"bytecode": "JgAEAQInAASARAABJgAEAwAmAgQBAiYCBAADHxgAAwACgEMtCIBDAAEkAAAAQCcCBIBEAAEmAgQAAjoNAAEAAiQAAAqqKAIA7Lr/VgACCjgBAgMmAgQBAiYCAAAEJgIEAAUjAgAAAG8AAyIAAAH2LAgBAyYCBAIGABABBgEmAwQBAwAoAwIGHzwAAgACAAYsDQMGACgGAgYsDgYDLAgBBgAAAQIBLA4DBiwIAQcAAAECASwOBQcsDQMIACgIAggsDggDJgIECQgsCAAJLAwGCiwMBwsAEAAIACQAAArTLAQAACwMCgMmAgAEBiYCBAkILAgACSwMBgosDAMLABAACAAkAAALYywEAAAsDAoHJgIAAgMuDAADAAYcDAAGCCsCAAAAAAAAAAAAAAAAAP//////////////////////////AAkOOAgJCiMCAAABVQAKJAAADEUKOAYECCMCAAABawAIJgIEAAk7CQEJKAIAO5rKAgAGLgwABgAICjgIBAkjAgAAAYwACSQAAAxXJwIA3q0ACC8MAAgABi8MAAcAAyYCBAAGJgIEAwgAOAYIBywIAQMAEAEHASYDBAEDACgDAgcsDgYHACgHAgcsDgYHJgIEAwcAOAMHBgAoAwIILA0IByYCBAIJADgICQY6DQAGAAciAAAB9igCAK0S8KMAAwo4AQMGJgIACgMmAgEAByYCAAwIJgIAAQkqAgAAAAAAAAAAAQAAAAAAAAAAAAomAgAsCyMCAAACPwAGIgAABOImAgQCBiwIAQwmAgQDDQAQAQ0BJgMEAQwAKAwCDR88AAIABgANLA0MBgAoBgIGLA4GDCwIAQYAAAECASwODAYsCAENAAABAgEsDgUNLA0MDgAoDgIOLA4ODCYCBA8OLAgADywMBhAsDA0RABAADgAkAAAMaSwEAAAsDBAMJgIEEA8sCAAQLAwDESwMDBIAEAAPACQAAAtjLAQAACwMEQ4mAgQQDywIABAsDAYRLAwNEgAQAA8AJAAADGksBAAALAwRDCYCBA8NLAgADywMCBAsDAwRABAADQAkAAALYywEAAAsDBAGLAgBDAAAAQIBLA4HDCwIAQ0AAAECASwOBA0sCAEPAAABAgEmAgA+ECwOEA8eAgEAEB4CAAARCjgQERIjAgAAA2wAEiQAAAz5JgIEFRQsCAAVLAwMFiwMDRcsDA8YLAwJGSwMCxosDA4bABAAFAAkAAANCywEAAAsDBYQLAwXESwMGBIsDBkTJgIEFxYsCAAXLAwQGCwMERksDBIaLAwTGwAQABYAJAAAD5EsBAAALAwYFCwMGRUmAgQWEiwIABYsDAYXABAAEgAkAAAPyCwEAAAsDBcQLAwYEQA4FBAGHAwFBhIcDAASEAI4BhASCDgSCgYAOBUREgA4EgYRHAwFERIcDAASBgo4BhESIwIAAAQ8ABIkAAAQKyYCBBYVLAgAFiwMDBcsDA0YLAwPGSwMCRosDAsbLAwOHAAQABUAJAAADQssBAAALAwXESwMGBIsDBkTLAwaFAQ4BgoMADgQDAYvDAAGABQmAgQADCYCBAMOADgMDg0sCAEGABABDQEmAwQBBgAoBgINLA4MDQAoDQINLA4MDSYCBAMNADgGDQwAKAYCDiwNDg0mAgQCDwA4Dg8MOg0ADAANIgAABOIoAgAILNgwAAYKOAEGDCMCAAAE/QAMIgAAB4QsCAEMJgIEAg0AEAENASYDBAEMACgMAg0fPAACAAIADSwNDA0AKA0CDSwODQwsCAENAAABAgEsDgwNLAgBDgAAAQIBLA4FDiwNDA8AKA8CDywODwwmAgQQDywIABAsDA0RLAwOEgAQAA8AJAAACtMsBAAALAwRDCYCBA8OLAgADywMCBAsDAwRABAADgAkAAALYywEAAAsDBANLAgBCAAAAQIBLA4HCCwIAQwAAAECASwOBAwsCAEOAAABAgEmAgA1DywODw4eAgoADwo4DwkQIwIAAAXaABAkAAAQPSYCBBIRLAgAEiwMDRMAEAARACQAAA/ILAQAACwMEw8sDBQQHgIBAA0mAgQWFSwIABYsDAgXLAwMGCwMDhksDAkaLAwLGywMDRwAEAAVACQAAA0LLAQAACwMFxEsDBgSLAwZEywMGhQmAgQVDSwIABUsDBEWLAwSFywMExgsDBQZABAADQAkAAAPkSwEAAAsDBYILAwXDBwMBQwOHAwADg0cDAUNDBwMBRAOHAwADg0cDAUNDiYCBBEQLAgAESwMDBIsDA4TABAAEAAkAAAQTywEAAAsDBINHAwFCA4cDAAODBwMBQwIHAwFDw4cDAAODBwMBQwOJgIEEA8sCAAQLAwIESwMDhIAEAAPACQAABBPLAQAACwMEQwKOA0JCCMCAAAHDQAIIgAABwQsDA0GIgAABxYsDAwGIgAABxYKOAYECAo4CAcGIwIAAActAAYkAAAQsCYCBAAIJgIEAw0AOAgNDCwIAQYAEAEMASYDBAEGACgGAgwsDggMACgMAgwsDggMJgIEAwwAOAYMCAAoBgINLA0NDCYCBAIOADgNDgg6DQAIAAwiAAAHhCgCAP95SfIABgo4AQYIIwIAAAefAAgiAAAJUywIAQEmAgQCBgAQAQYBJgMEAQEAKAECBh88AAIAAgAGLA0BBgAoBgIGLA4GASwIAQYAAAECASwOAQYsCAEIAAABAgEsDgUILA0BDAAoDAIMLA4MASYCBA0MLAgADSwMBg4sDAgPABAADAAkAAAK0ywEAAAsDA4BJgIEDAgsCAAMLAwDDSwMAQ4AEAAIACQAAAtjLAQAACwMDQYsCAEBAAABAgEsDgcBLAgBAwAAAQIBLA4EAywIAQQAAAECASYCABUILA4IBB4CCgAICjgICQwjAgAACHwADCQAABDCJgIEEA8sCAAQLAwBESwMAxIsDAQTLAwJFCwMCxUsDAYWABAADwAkAAANCywEAAAsDBEILAwSDCwMEw0sDBQOJgIEDwQsCAAPLAwIECwMDBEsDA0SLAwOEwAQAAQAJAAAD5EsBAAALAwQASwMEQMEOAMKBAA4AQQDJgIEAQQmAgQDCAA4BAgGLAgBAQAQAQYBJgMEAQEAKAECBiwOBAYAKAYCBiwOBAYmAgQDBgA4AQYELAwEBiwOAwYAKAECBiwNBgQmAgQCCAA4BggDOg0AAwAEIgAACVMmAgIgASYCAmsCJgICYwMmAgJvBCYCAlUGJgICcwgmAgJ0CSYCAmUKJgICdwsmAgJuDCYCAnINJgICbA4sCAEPJgIEERAAEAEQASYDBAEPACgPAhAsDBARLA4GEQAoEQIRLA4MEQAoEQIRLA4CEQAoEQIRLA4MEQAoEQIRLA4EEQAoEQIRLA4LEQAoEQIRLA4MEQAoEQIRLA4BEQAoEQIRLA4IEQAoEQIRLA4KEQAoEQIRLA4OEQAoEQIRLA4KEQAoEQIRLA4DEQAoEQIRLA4JEQAoEQIRLA4EEQAoEQIRLA4NESYCAQEBCjgHAQIjAgAACqkAAiYCBBIDLAgBBCYCBBIGABABBgEsDAQGKQMF61UZpxEPZDAABgAoBgIGACgPAggmAgQQCS0EAAiAAy0EAAaABC0EAAmABSQAABDUJgIEEAgAOAYIBiwOBQYAKAYCBjsNBAMlJwAEeACABA0AAACABIADIwAAAArSgAMpAQX3ofOvpa3UygABOwEBAiUkAAAKqiwNAQMsDQIEJgIEAQYMOAQGByMCAAAK9wAHJAAAERoAKAMCBgA4BgQHLA0HBSwIAQMmAgQCBAAQAQQBJgMEAQMAKAMCBCwMBAYsDgUGLA0BBCwNAgUmAgQBBgA4BQYHDjgFBwgjAgAAC0kACCQAABArLA4EASwOBwIsDQQBAigBAgEsDgEELAwDASUkAAAKqiYCAAQECjgBBAUmAgQABCMCAAAL7QAFIgAAC4QmAgAKBgo4AQYHIwIAAAvNAAciAAALmyYCAAwGCjgBBgcjAgAAC7YAByYCBAAIOwkBCAAoAgIGADgGBAcsDQcBLAwBBSIAAAvkACgCAgYAOAYEBywNBwEsDAEFIgAAC+QsDAUDIgAADEAAKAICBQA4BQQGLA0GARwMAAECKwIAAAAAAAAAAAAAAAAA//////////////////////////8ABA44AgQFIwIAAAw3AAUkAAAMRSwMAQMiAAAMQCwMAwElKQEFWgLkG7UeqZ8AATsBAQIlKQEFubCyFuGoqP8AATsBAQIlJAAACqosDQEDLA0CBCYCBAIGDDgEBgcjAgAADI0AByQAABEaACgDAgYAOAYEBywNBwUsCAEDJgIEAgQAEAEEASYDBAEDACgDAgQsDAQGLA4FBiwNAQQsDQIFJgIEAQYAOAUGBw44BQcIIwIAAAzfAAgkAAAQKywOBAEsDgcCLA0EAQIoAQIBLA4BBCwMAwElKQEFkcCxxO+ZPaMAATsBAQIlJAAACqosCAEIJgIEAwkAEAEJASYDBAEIACgIAgksDAkKLA4ECgAoCgIKLA4GCiYCAAAELAgBBiYCBAQJABABCQEmAwQBBgAoBgIJLAwJCiwOBAoAKAoCCiwOBAoAKAoCCiwOBAosDQYJACgJAgksDgkGLA0GCQAoCQIJLA4JBiwNBgkAKAkCCSwOCQYqAgAAAAAAAAAAAgAAAAAAAAAAAAksCAEKJgIEBQsAEAELASYDBAEKACgKAgssDAsMLA4EDAAoDAIMLA4EDAAoDAIMLA4EDAAoDAIMLA4JDCwNBgkAKAkCCSwOCQYsCAEJAAABAgEsDgYJLA0KBgAoBgIGLA4GCiwIAQYAAAECASwOCgYsCAEKAAABAgEmAgQACywOCwosCAEMAAABAgEmAgEADSwODQwmAgQCDiYCBAEPLAwLByIAAA5SDDgHDgUjAgAADwoABSIAAA5kLA0MBQo4BQ0HIwIAAA5+AAcmAgQACDsJAQgmAgQOBSwIAA4sDAkPLAwGECwMChEsDAwSABAABQAkAAARLCwEAAAsDQkFLA0GBywNCggsDgUJLA4HBiwOCAomAgEBBiwOBgwAKAcCCAA4CAsJLA0JBiwNBQgCKAgCCCwOCAUsDQcFAigFAgUsDgUHCjgGBAUKOAUNBCMCAAAPBQAEJAAAEqUsDAYEJQw4Bw4FIwIAAA8cAAUiAAAPcSYCBAIQDDgHEBEjAgAADzMAESQAABEaACgIAhAAOBAHESwNEQUmAgQRECwIABEsDAkSLAwGEywMChQsDAwVLAwFFgAQABAAJAAAErcsBAAAIgAAD3EAOAcPBQ44BwUQIwIAAA+IABAkAAAQKywMBQciAAAOUiQAAAqqLgwABAAFJgIECAcsCAAILAwFCQAQAAcAJAAAD8gsBAAALAwJBCwMCgYsDAYCLAwEASUkAAAKqhwMAAECKgIA/////////////////////wADDjgCAwQjAgAAD/kABCQAAAxFHAwFAQMcDAADAgI4AQIDKgIAAAAAAAAAAAEAAAAAAAAAAAABCDgDAQQsDAIBLAwEAiUpAQVFp8pxGUHkFQABOwEBAiUpAQUsry1Jt6zm8gABOwEBAiUkAAAKqgw4AQIEIwIAABCdAAQiAAAQZgw4AgEFIwIAABCGAAUiAAAQeCYCAAEBLAwBBCIAABCUJgIAAgEsDAEEIgAAEJQsDAQDIgAAEKsmAgAAASwMAQMiAAAQqywMAwElKQEF03sUmhjFAKEAATsBAQIlKQEFVDVgwHJdM24AATsBAQIlAQCAA4AFgActAIADgAgtAIAEgAkLAIAIgAeACiMAAAARGYAKLQGACIAGLQKABoAJAQCACAACgAgBAIAJAAKACSIAABDoJSkBBeidCf6hES0OAAE7AQECJSQAAAqqJgIEAwYmAgQAByYCBAEILAwHBSIAABFJDDgFBgcjAgAAEbYAByIAABFbLA0BBSwNAwYsDQQHLA0CCCYCBAQJLAgBCiYCBAULABABCwEmAwQBCgAoCAILJgIEBAwAKAoCDT4PAAsADSwOBQEsDgoCLA4GAywOBwQsDQUBAigBAgEsDgEFJSwNAwcMOAUHCSMCAAARzAAJIgAAEoUsDQEHLA0CCSwNAwosDQQLLA0CDCYCBAQODDgFDg8jAgAAEfcADyQAABEaACgMAg4AOA4FDywNDw0sDQEMJgIEAw8MOAUPECMCAAASIAAQJAAAERoAKAwCDwA4DwUQLA0QDgA4DQ4MJgIEBA4MOAUODyMCAAASSgAPJAAAERotBAAJgAMnAAQABYAEJAAAFCAtCIAFAA0AKA0CDgA4DgUPLA4MDywOBwEsDg0CLA4KAywOCwQiAAAShQA4BQgHDjgFBwkjAgAAEpwACSQAABArLAwHBSIAABFJKQEFAtxuJ4B2Ep0AATsBAQIlJAAACqosDQQGJgIBAAcKOAYHCCMCAAAS2wAIJgIEAAk7CQEJLA0DBiYCBAMHCjgGBwgmAgQBBiMCAAATkgAIIgAAEvssDQEHLA0CCCwNAwksDQQKLA0DCyYCBAMNDDgLDQ4jAgAAEyYADiQAABEaLQQAB4ADJwAEAASABCQAABQgLQiABQAMACgMAg0AOA0LDiwOBQ4sDQwFACgFAgUsDgUMLA0IBQAoBQIFLA4FCAA4CQYFDjgJBQcjAgAAE30AByQAABArLA4MASwOCAIsDgUDLA4KBCIAABQfJgIECAcsCAAILAwBCSwMAgosDAMLLAwEDAAQAAcAJAAAESwsBAAALA0BBywNAggsDQQJJgIEAAotBAAHgAMnAAQABIAEJAAAFCAtCIAFAAsAKAsCDAA4DAoNLA4FDSwNCwUAKAUCBSwOBQssDQgFACgFAgUsDgUILA4LASwOCAIsDgYDLA4JBCIAABQfJS0BgAOABgsAgAYAAoAHIwAAABQ7gAciAAAURi0AgAOABSIAABSlLQAAAYAFAQAAAYAEAAEBAIADgASACS0AgAOACi0AgAWACwsAgAqACYAMIwAAABSZgAwtAYAKgAgtAoAIgAsBAIAKAAKACgEAgAsAAoALIgAAFGgnAQQAAYAFIgAAFKUlLQAYyhjK",
|
|
1895
|
-
"debug_symbols": "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",
|
|
1896
|
-
"brillig_names": [
|
|
1897
|
-
"public_dispatch"
|
|
1898
|
-
]
|
|
1899
|
-
},
|
|
1900
|
-
{
|
|
1901
|
-
"name": "claim",
|
|
1902
|
-
"is_unconstrained": false,
|
|
1903
|
-
"custom_attributes": [
|
|
1904
|
-
"private"
|
|
1905
|
-
],
|
|
1906
|
-
"abi": {
|
|
1907
|
-
"error_types": {
|
|
1908
|
-
"14514982005979867414": {
|
|
1909
|
-
"error_kind": "string",
|
|
1910
|
-
"string": "attempt to bit-shift with overflow"
|
|
1911
|
-
},
|
|
1912
|
-
"16761564377371454734": {
|
|
1913
|
-
"error_kind": "string",
|
|
1914
|
-
"string": "Array index out of bounds"
|
|
1915
|
-
},
|
|
1916
|
-
"17288131482828810359": {
|
|
1917
|
-
"error_kind": "string",
|
|
1918
|
-
"string": "Message not in state"
|
|
1919
|
-
},
|
|
1920
|
-
"17843811134343075018": {
|
|
1921
|
-
"error_kind": "string",
|
|
1922
|
-
"string": "Stack too deep"
|
|
1923
|
-
},
|
|
1924
|
-
"2920182694213909827": {
|
|
1925
|
-
"error_kind": "string",
|
|
1926
|
-
"string": "attempt to subtract with overflow"
|
|
1927
|
-
},
|
|
1928
|
-
"5019202896831570965": {
|
|
1929
|
-
"error_kind": "string",
|
|
1930
|
-
"string": "attempt to add with overflow"
|
|
1931
|
-
},
|
|
1932
|
-
"6485997221020871071": {
|
|
1933
|
-
"error_kind": "string",
|
|
1934
|
-
"string": "call to assert_max_bit_size"
|
|
1935
|
-
},
|
|
1936
|
-
"7233212735005103307": {
|
|
1937
|
-
"error_kind": "string",
|
|
1938
|
-
"string": "attempt to multiply with overflow"
|
|
1939
|
-
},
|
|
1940
|
-
"7764445047318889914": {
|
|
1941
|
-
"error_kind": "string",
|
|
1942
|
-
"string": "Public data tree index doesn't match witness"
|
|
1943
|
-
},
|
|
1944
|
-
"9199403315589104763": {
|
|
1945
|
-
"error_kind": "string",
|
|
1946
|
-
"string": "Proving public value inclusion failed"
|
|
1947
|
-
}
|
|
1948
|
-
},
|
|
1949
|
-
"parameters": [
|
|
1950
|
-
{
|
|
1951
|
-
"name": "inputs",
|
|
1952
|
-
"type": {
|
|
1953
|
-
"fields": [
|
|
1954
|
-
{
|
|
1955
|
-
"name": "call_context",
|
|
1956
|
-
"type": {
|
|
1957
|
-
"fields": [
|
|
1958
|
-
{
|
|
1959
|
-
"name": "msg_sender",
|
|
1960
|
-
"type": {
|
|
1961
|
-
"fields": [
|
|
1962
|
-
{
|
|
1963
|
-
"name": "inner",
|
|
1964
|
-
"type": {
|
|
1965
|
-
"kind": "field"
|
|
1966
|
-
}
|
|
1967
|
-
}
|
|
1968
|
-
],
|
|
1969
|
-
"kind": "struct",
|
|
1970
|
-
"path": "authwit::aztec::protocol_types::address::aztec_address::AztecAddress"
|
|
1971
|
-
}
|
|
1972
|
-
},
|
|
1973
|
-
{
|
|
1974
|
-
"name": "contract_address",
|
|
1975
|
-
"type": {
|
|
1976
|
-
"fields": [
|
|
1977
|
-
{
|
|
1978
|
-
"name": "inner",
|
|
1979
|
-
"type": {
|
|
1980
|
-
"kind": "field"
|
|
1981
|
-
}
|
|
1982
|
-
}
|
|
1983
|
-
],
|
|
1984
|
-
"kind": "struct",
|
|
1985
|
-
"path": "authwit::aztec::protocol_types::address::aztec_address::AztecAddress"
|
|
1986
|
-
}
|
|
1987
|
-
},
|
|
1988
|
-
{
|
|
1989
|
-
"name": "function_selector",
|
|
1990
|
-
"type": {
|
|
1991
|
-
"fields": [
|
|
1992
|
-
{
|
|
1993
|
-
"name": "inner",
|
|
1994
|
-
"type": {
|
|
1995
|
-
"kind": "integer",
|
|
1996
|
-
"sign": "unsigned",
|
|
1997
|
-
"width": 32
|
|
1998
|
-
}
|
|
1999
|
-
}
|
|
2000
|
-
],
|
|
2001
|
-
"kind": "struct",
|
|
2002
|
-
"path": "authwit::aztec::protocol_types::abis::function_selector::FunctionSelector"
|
|
2003
|
-
}
|
|
2004
|
-
},
|
|
2005
|
-
{
|
|
2006
|
-
"name": "is_static_call",
|
|
2007
|
-
"type": {
|
|
2008
|
-
"kind": "boolean"
|
|
2009
|
-
}
|
|
2010
|
-
}
|
|
2011
|
-
],
|
|
2012
|
-
"kind": "struct",
|
|
2013
|
-
"path": "authwit::aztec::protocol_types::abis::call_context::CallContext"
|
|
2014
|
-
}
|
|
2015
|
-
},
|
|
2016
|
-
{
|
|
2017
|
-
"name": "historical_header",
|
|
1763
|
+
"name": "historical_header",
|
|
2018
1764
|
"type": {
|
|
2019
1765
|
"fields": [
|
|
2020
1766
|
{
|
|
@@ -2402,7 +2148,7 @@
|
|
|
2402
2148
|
"visibility": "private"
|
|
2403
2149
|
},
|
|
2404
2150
|
{
|
|
2405
|
-
"name": "
|
|
2151
|
+
"name": "portal_address",
|
|
2406
2152
|
"type": {
|
|
2407
2153
|
"fields": [
|
|
2408
2154
|
{
|
|
@@ -2413,28 +2159,7 @@
|
|
|
2413
2159
|
}
|
|
2414
2160
|
],
|
|
2415
2161
|
"kind": "struct",
|
|
2416
|
-
"path": "authwit::aztec::protocol_types::address::
|
|
2417
|
-
},
|
|
2418
|
-
"visibility": "private"
|
|
2419
|
-
},
|
|
2420
|
-
{
|
|
2421
|
-
"name": "amount",
|
|
2422
|
-
"type": {
|
|
2423
|
-
"kind": "field"
|
|
2424
|
-
},
|
|
2425
|
-
"visibility": "private"
|
|
2426
|
-
},
|
|
2427
|
-
{
|
|
2428
|
-
"name": "secret",
|
|
2429
|
-
"type": {
|
|
2430
|
-
"kind": "field"
|
|
2431
|
-
},
|
|
2432
|
-
"visibility": "private"
|
|
2433
|
-
},
|
|
2434
|
-
{
|
|
2435
|
-
"name": "message_leaf_index",
|
|
2436
|
-
"type": {
|
|
2437
|
-
"kind": "field"
|
|
2162
|
+
"path": "authwit::aztec::protocol_types::address::eth_address::EthAddress"
|
|
2438
2163
|
},
|
|
2439
2164
|
"visibility": "private"
|
|
2440
2165
|
}
|
|
@@ -3549,39 +3274,27 @@
|
|
|
3549
3274
|
"visibility": "databus"
|
|
3550
3275
|
}
|
|
3551
3276
|
},
|
|
3552
|
-
"bytecode": "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",
|
|
3553
|
-
"debug_symbols": "7b3bjitJdqT9Ln1dF+Huy0/zKgNBkDSaQQON7oEOP/BD0LtP7KpNZlaREaszGEkazdaNsEtNT4YtIz2WG8M//68//a9//ef//D//+Oe//u+//fuf/sf//K8//eVv//JP//Hnv/11/a//+lMqv/7//v3//tNff/znv//HP/3bf/zpf6Q2l1/+9K9//V/rP/uy/Pcvf/rff/7Lv/7pf5TZ/vuXm1fnUcbPV+fRPl6dWr/z6lLT/PnqUmd2Xj2z2c9Xz1z7x5Us+c6rk+V8uW6z9PHqcu/FKV8uJKU+Pr/4H375U7IozP3C1CjM/cI09MKMdC3MrF5hxmiX655LfagwPQpzvzAjCnO/MPPxwljK9eerLbWPb/aPd1vfIi/f/xbp3lvkpV0NS0tx3qKM8fEOn15b713OOt1dXpz7x1/O9/5wteXiVrVsn1/849Lz+156ed9Lt/e99Pq+l97e99L7+176eN9Ln2976WV530t/37tped+7aXnfu2l537tped+7aXnfu2l537tped+7aXnfu6m9793U3vduau97N7X3vZva+95N7X3vpva+d1N737upve/d1N73blrf925a3/duWt/3blrf925a3/duWp99N23L5fdca3n549U0qKvpUFczoK7m2XemVq8/zrX+x6tpC9TVJKiryVBXU6CuxpC+Uw1qLm5Qc3GDmovbgPoUQ83FHWou7lBzcYeaizvUXNwN6moq1NU0qKvpUFcDNRd3qLl4QM3FA2ouHhmpoxgF6mqg+uIB1RcPqLl4QM3FA2ouHlBz8YSaiyfUXDyh+uIJ1RdPqL54QvXFE2ounlBz8YSaiyfUXJyWBamlSEvCuhyo1nh9L6zLgZqQ0wI1I6cFakpOC9ScnBaoSTktWLNygmqRU4LqkVOCapJTguqSU8KalRPWrJywZuWENSsnqEcrUppQl5OxeuWM1StnrFk5Y83KGWtWzlizcsaalTPWrJyxeuWM1SsXrF65YPXKBWtWLlizcsGalQvWrFygHnxLBerJt1SweuWC1Ssb1qxsWLOyYc3KhjUrG9asbFizsmH1yobVKxtWr2xYvXLFmpUr1qxcsWblijUrP31v336DgbVfL2Ft2EtYO/ZSxZqVsfbsJaxNewlr117C2raXsPbtpedv3Nu/HKxeuWH1yg2rV8bavJewdu8lrO17CWv/XupYT8Z1rCfj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cc+zFPc8S3HPMxv3fHfFl9m4545apVwqs3HPHbVSvZQU9zxLcc+zFPc8S3HPsxT3PLNxzx21JqVWKpdi4547aqV6KSnueZbinmcp7nlm457vr/jYuOeOWqlcio177qiV6qWkuOdZinuepbjnWYp7nqW455mNe+6olcql2LjnjlqTUivVS0lxz7MU9zxLcc8zG/d8f8XHxj131ErlUmzcc0etVC8lxT3PUtzzLMU9z1Lc8yzFPc9s3PN9tWzcc0etVC7Fxj131Er1UlLc8yzFPc9S3PPMxj3fX/Gxcc8dtVK5FBv33FEr1UtJcc+zFPc8S3HPsxT3PEtxzzMb99xRK5VLsXHP99Wycc8dtVK9lBT3PEtxz7MU9zyzcc/3V3xs3HNHrVQuxcY9d9RK9VJS3PMsxT3PUtzzLMU9z1Lc88zGPXfUSuVSbNxzR61ULiXFPS9S3PMixT0vUtzzwsY9313xlcWk1CrlUoWNe+6oVeqlihT3vEhxz4sU97xIcc+LFPe8sHHPHbUmpVYplyps3HNHrVQvJcU9L1Lc8yLFPS9s3PP9FR8b99xRK5VLsXHPHbVSvZQU97xIcc+LFPe8SHHPixT3vLBxzx21UrkUG/fcUWtSaqV6KSnueZHinhcp7nlh457vr/jYuOeOWqlcio177qiV6qWkuOdFintepLjnRYp7XqS454WNe76vlo177qiVyqXYuOeOWqleSop7XqS450WKe17YuOf7Kz427rmjViqXYuOeO2qleikp7nmR4p4XKe55keKeFynueWHjnjtqpXIpNu75vlo27rmjVqqXkuKeFynueZHinhc27vn+io+Ne+6olcql2LjnjlqpXkqKe16kuOdFintepLjnRYp7Xti4545aqVyKjXvuqJXKpaS450WKe16kuOdFinte2Ljn+ys+Nu65o1Yql2LjnjtqpXopKe55keKemxT33KS45ybFPTc27rmj1qTUKuVSxsY9d9Qq9VImxT03Ke65SXHPjY17vrviMzbuuaNWKZcyNu65o1aql5LinpsU99ykuOcmxT03Ke65sXHPHbVSuRQb99xRa1JqpXopKe65SXHPTYp7bmzc8/0VHxv33FErlUuxcc8dtVK9lBT33KS45ybFPTcp7rlJcc+NjXu+r5aNe+6olcql2LjnjlqpXkqKe25S3HOT4p4bG/d8f8XHxj131Erl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99xRa1JqpXIpNu65o1aql5LinpsU99ykuOfGxj3fX/Gxcc8dtVK5FBv33FEr1UtJcc9NintuUtxzk+KemxT33Ni4545aqVyKjXvuqDUptVK9lBT33KS45ybFPTc27vn+io+Ne+6olcql2LjnjlqpXkqKe25S3HOT4p6bFPfcpLjnxsY931fLxj131ErlUmzcc0etVC8lxT03Ke65SXHPjY17vr/iY+OeO2qVcqnKxj131Cr1UlWKe16luOd1MSm1Sr1UleKeVzbuuaNWKZeqbNzzfbVs3HNHrVQvJcU9r1Lc8yrFPa9s3PP9FR8b99xRq5RLVTbuuaNWqpeS4p5XKe55leKeVynueZXinlc27rmjViqXYuOeO2qlcikp7nmV4p5XKe55leKeVzbu+f6Kj4177qiVyqXYuOeOWqleSop7XqW451WKe16luOdVinte2bjnjlqTUiuVS7Fxzx21Ur2UFPe8SnHPqxT3vLJxz/dXfGzcc0etVC7Fxj131Er1UlLc8yrFPa9S3PMqxT2vUtzzysY9d9RK5VJs3HNHrUmpleqlpLjnVYp7XqW455WNe76/4mPjnjtqpXIpNu65o1aql5Linlcp7nmV4p5XKe55leKeVzbu+b5aNu65o1Yql2LjnjtqpXopKe55leKeVynueWXjnu+v+Ni4545aqVyKjXvuqJXqpaS451WKe16luOdVintepbjnlY177qiVyqXYuOe7ahsb99xRq9RLNSnueZPinq9rBim1SkyExsY9d9Qq5VKNjXvuqJXqpaS4502Ke96kuOdNinvepLjnjY177qhVyqUaG/fcUauUSzUp7nmT4p43Ke55k+KeNzbu+f6Kj4177qiVyqXYuOeOWqleSop73qS4502Ke96kuOdNinve2LjnjlqTUiuVS7Fxzx21Ur2UFPe8SXHPmxT3vLFxz/dXfGzcc0etVC7Fxj131Er1UlLc8ybFPW9S3PMmxT1vUtzzxsY9d9RK5VJs3HNHrUmpleqlpLjnTYp73qS4542Ne76/4mPjnjtqpXIpNu65o1aql5Linjcp7nmT4p43Ke55k+KeNzbu+b5aNu65o1Yql2LjnjtqpXopKe55k+KeNynueWPjnu+v+Ni4545aqVyKjXvuqJXqpaS4502Ke96kuOdNinvepLjnjY177qiVyqXYuOf7atm4545aqV5KinvepLjnTYp73ti45/srPjbuuaNWKpdi4547apV6qS7FPe9S3PMuxT3vUtzzvpiUWqVcqrNxzx21SrlUZ+OeO2qleikp7nmX4p53Ke55Z+Oe7674Ohv33FGrlEt1Nu65o1aql5Linncp7nmX4p53Ke55l+KedzbuuaPWpNRK5VJs3HNHrVQvJcU971Lc8y7FPe9s3PP9FR8b99xRK5VLsXHPHbVSvZQU97xLcc+7FPe8S3HPuxT3vLNxzx21UrkUG/fcUWtSaqV6KSnueZfinncp7nln457vr/jYuOeOWqlcio177qiV6qWkuOddinvepbjnXYp73qW4552Ne76vlo177qiVyqXYuOeOWqleSop73qW4512Ke97ZuOf7Kz427rmjViqXYuOeO2qleikp7nmX4p53Ke55l+KedynueWfjnjtqpXIpNu75vlo27rmjVqqXkuKedynueZfinnc27vn+io+Ne+6olcql2LjnjlqpXkqKe96luOddinvepbjnXYp73tm4545aqVyKjXvuqJXKpaS450OKez6kuOdDins+2Ljnuyu+sZiUWqVcakhxz4cU93xIcc+HFPd8SHHPhxT3fLBxz/fvQFLc8yHFPR9s3HPneyvVS0lxz4cU93xIcc+HFPd8sHHP9+9AbNxzR61UL8XGPXfUSvVSUtzzIcU9H1Lc8yHFPR9S3PPBxj131Er9xsfGPXfUmpRarl6qj8t1/9gycasWvZeatV/VjsVTm6+vttx/p/b2xdWWSyGrZbstDXrj9cLSoHdpLywNekv3utLAs9pfWBr0ZvGFpUHvLF9YGvQ29IWlsSjNVmnQG9wXlia64c3SRDe8WZrohjdLE93wVmngafsvLE10w5uliW54szTRDW+WxqI0W6WJbnizNNENb5YmuuHN0kQ3vFma6Ia3SgN/XsILSxPd8GZpohveLE10w5ulsSjNVmmiG94sTXTDm6WJbnizNNENb5YmuuGt0sCfePG10ji7F+BPvDhXLVfP6qnlakM9tcaldv9JWfgTL85Vy9X/eWq5WjpPLVeX5qnlarycORn+xItz1Ur1UvAnXpyrlqyX2p+l4E+8OFetVC8Ff+LFuWqlein4Ey/OVUvWS+2rhT/x4ly1ZL2Uo5asl3LUSvVS8CdenKtWqpeCP/HiXLVkvdT+ig/+xItz1SrlUhP+xItz1Sr1UhP+xItz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leKeVynueWXjnjtqpXIpNu75vlo27rmjVqqXkuKeVynueZXinlc27vn+io+Ne+6olcql2LjnjlqpXkqKe16luOdVintepbjnVYp7Xtm4545aqVyKjXvuqJXKpaS4502Ke96kuOdNinve2Ljnuyu+9X+VUquUSzU27rmjVqmXalLc8ybFPW9S3PMmxT1vUtzzxsY9d9SalFqlXKqxcc8dtVK9lBT3vElxz5sU97yxcc/3V3xs3HNHrVQuxcY9d9RK9VJS3PMmxT1vUtzzJsU9b1Lc88bGPXfUSuVSbNxzR61JqZXqpaS4502Ke96kuOeNjXu+v+Jj4547aqVyKTbuuaNWqpeS4p43Ke55k+KeNynueZPinjc27vm+WjbuuaNWKpdi4547aqV6KSnueZPinjcp7nlj457vr/jYuOeOWqlcio177qiV6qWkuOdNinvepLjnTYp73qS4542Ne+6olcql2Ljn+2rZuOeOWqleSop73qS4502Ke97YuOf7Kz427rmjViqXYuOeO2qleikp7nmT4p43Ke55k+KeNynueWPjnjtqpXIpNu65o1Yql5Linjcp7nmT4p43Ke55Y+Oe76/42LjnjlqpXIqNe+6oleqlpLjnTYp73qW4512Ke96luOedjXvuqDUptUq5VGfjnjtqlXqpLsU971Lc8y7FPe9s3PPdFV9n4547apVyqc7GPXfUSvVSUtzzLsU971Lc8y7FPe9S3PPOxj131ErlUmzcc0etSamV6qWkuOddinvepbjnnY17vr/iY+OeO2qlcik27rmjVqqXkuKedynueZfinncp7nmX4p53Nu75vlo27rmjViqXYuOeO2qleikp7nmX4p53Ke55Z+Oe76/42LjnjlqpXIqNe+6oleqlpLjnXYp73qW4512Ke96luOedjXvuqJXKpdi45/tq2bjnjlqpXkqKe96luOddinve2bjn+ys+Nu65o1Yql2LjnjtqpXopKe55l+KedynueZfinncp7nln4547aqVyKTbuuaNWKpeS4p53Ke55l+KedynueWfjnu+v+Ni4545aqVyKjXvuqJXqpaS4512Ke96luOddinvepbjnnY177qg1KbVSuRQb99xRK9VLSXHPuxT3fEhxzwcb93x3xTfYuOeOWqVcaiwmpVaplxpS3PMhxT0fUtzzIcU9H1Lc88HGPXfUKuVSg417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",
|
|
3277
|
+
"bytecode": "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",
|
|
3278
|
+
"debug_symbols": "7VjbjtpADP2XPOdhbM/Fw69U1YrbriIhQFwqVYh/70zEzNBl2siUskLKC8LJOZrj49gOnJrFcnb8eOvW75t9M/l2alab+fTQbdYhOjVA/bX9drqO4f4w3R2aCViv2ma5XoSvTqlz27x3q2UzIa/P7Q0amfiCRrYFDYYraDLgL2gyHgfQHhkuaI/eZDSSraCB2SbdXhU0UQ0MmIQAOL4Gf28b0KMxdWPMaEzdGDsaUzfG/bsxGtBc0BoslFSV74/g/3+Erx6ByqUjkHngCEeY0I60K0cAvm55UY3G1I2B0Zi6MfgIY0wxhnHAGMNpEFgo0oF0L4ceIcdjkqNpqE7gLebJ5O01PgybylpAztmG72w/DyfUr5+CeXYKqJAoSVIa9I2k+kYnSnsCQpcNSGJrUpOx83bAJcepbRiLnOBBL6e+R8lBljPokC+N6fG6FapywGSDwKqrJgsTIgqqb12dMwaj9BP72D9Czpc2AanXTwGencJAH4dotutWq+7j7befvip+6PoqApXVhrHz+UHTdA9J30My95CsmBQiiNj6u5wp1biad/0QCBFGpKsSfR5Nnm/GmQM5BeUUklO0nGLkFCunODmF5RQvprC8+iyvPsurz/Lqs7z6LK8+y6vP8upzvfo6vwKwu6F4McUrOQXkFJRTSE7RQkqI6C9/pDrIQ9c5vJmdetxBZQeF8Md0101nq2Vc0PHucT1P+zqEh5/bdCdt9O1uM18ujrtl3O1lrUdzSLVaBSkQH0/NraG85vpLSC1yXmCRYbi1nBjetkFtqW+8BqZFlev2p0POIZdf",
|
|
3554
3279
|
"brillig_names": [
|
|
3555
|
-
"build_msg_block",
|
|
3556
|
-
"attach_len_to_msg_block",
|
|
3557
|
-
"get_public_data_witness",
|
|
3558
|
-
"field_less_than",
|
|
3559
|
-
"decompose_hint",
|
|
3560
|
-
"lte_hint",
|
|
3561
|
-
"build_msg_block",
|
|
3562
|
-
"get_l1_to_l2_membership_witness",
|
|
3563
3280
|
"pack_arguments_oracle_wrapper",
|
|
3564
3281
|
"enqueue_public_function_call_internal",
|
|
3565
|
-
"
|
|
3566
|
-
"
|
|
3567
|
-
"
|
|
3282
|
+
"debug_log_oracle_wrapper",
|
|
3283
|
+
"notify_set_min_revertible_side_effect_counter_oracle_wrapper",
|
|
3284
|
+
"pack_arguments_oracle_wrapper"
|
|
3568
3285
|
],
|
|
3569
|
-
"verification_key": "
|
|
3570
|
-
"artifact_hash": "
|
|
3286
|
+
"verification_key": "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",
|
|
3287
|
+
"artifact_hash": "7cb5566fe25622a27de9406180c3ef36c08c61ac-6905d568780cdea21dc6c0bb43ed8b35-mega-honk-true"
|
|
3571
3288
|
},
|
|
3572
3289
|
{
|
|
3573
|
-
"name": "
|
|
3290
|
+
"name": "balance_of_public",
|
|
3574
3291
|
"is_unconstrained": true,
|
|
3575
3292
|
"custom_attributes": [
|
|
3576
3293
|
"public",
|
|
3577
|
-
"
|
|
3294
|
+
"view"
|
|
3578
3295
|
],
|
|
3579
3296
|
"abi": {
|
|
3580
3297
|
"error_types": {
|
|
3581
|
-
"10502589790419500451": {
|
|
3582
|
-
"error_kind": "string",
|
|
3583
|
-
"string": "Function _increase_public_balance can only be called internally"
|
|
3584
|
-
},
|
|
3585
3298
|
"16761564377371454734": {
|
|
3586
3299
|
"error_kind": "string",
|
|
3587
3300
|
"string": "Array index out of bounds"
|
|
@@ -3598,6 +3311,10 @@
|
|
|
3598
3311
|
"error_kind": "string",
|
|
3599
3312
|
"string": "attempt to add with overflow"
|
|
3600
3313
|
},
|
|
3314
|
+
"6067862452620309358": {
|
|
3315
|
+
"error_kind": "string",
|
|
3316
|
+
"string": "Function balance_of_public can only be called statically"
|
|
3317
|
+
},
|
|
3601
3318
|
"6485997221020871071": {
|
|
3602
3319
|
"error_kind": "string",
|
|
3603
3320
|
"string": "call to assert_max_bit_size"
|
|
@@ -3605,7 +3322,7 @@
|
|
|
3605
3322
|
},
|
|
3606
3323
|
"parameters": [
|
|
3607
3324
|
{
|
|
3608
|
-
"name": "
|
|
3325
|
+
"name": "owner",
|
|
3609
3326
|
"type": {
|
|
3610
3327
|
"fields": [
|
|
3611
3328
|
{
|
|
@@ -3619,9 +3336,62 @@
|
|
|
3619
3336
|
"path": "authwit::aztec::protocol_types::address::aztec_address::AztecAddress"
|
|
3620
3337
|
},
|
|
3621
3338
|
"visibility": "private"
|
|
3339
|
+
}
|
|
3340
|
+
],
|
|
3341
|
+
"return_type": {
|
|
3342
|
+
"abi_type": {
|
|
3343
|
+
"kind": "field"
|
|
3344
|
+
},
|
|
3345
|
+
"visibility": "public"
|
|
3346
|
+
}
|
|
3347
|
+
},
|
|
3348
|
+
"bytecode": "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",
|
|
3349
|
+
"debug_symbols": "7Z3bTis7DIbfpde9yME58SpLW4jTQpUqigpsaQvx7nsKTFo6Tq3a1VqF+AYx4L92vnoSJ5nD6+z27vrl/nLx8Hv1NLv49Tpbrm6unherh+Ho9W0+u14vlsvF/eXun2dm8yOFd/unx6uHzeHT89X6eXZhYzHz2d3D7fBrMmb4hN+L5d3swhd4m0+sYwL7aR1TSNXaWoNYF5PTp3V5t9ix/mc+y+bYgDaiwBAVjqeSGSJrPKbyLo0kvCuRoDx8SBh9mBy23ApG2eY4GpdcbZ2JH/Gk84rHujOL58z4uDPj486Mj7dnFk84r3jAnFk88MfjCWM8zrgv8Uxts3P50zi7tI3Deczal3HwA7/9ZO8RU+cNjFF4RxhHP0Ycfdo1fQdYFKAIYPAKUAYwK0ARwKgZKASoGSgDmDQDhQCTAhQBzFYBygBGBSgCWIwClAEMClAGUKdyIoDOaBkjBKiFtAzgX1i+/n4A07hDEpOdANQyRgbQaSEtBKhljBCgljEygB4UoAygljEkwFRt01fTDcCgp7AMoC7pSwHqKSwDqEv6UoCagTKAWTNQCFA3lWQAi86FhQB1NUYE0BvdVBIC1NUYIUCdyskAWlCAMoBaSPspFac7RRgVLXkRKl7rWIyKlgYIFdCKE6MCSgWhoiMzQkVvCEGp6MiMUIk6MmNUdNkIoZJ0ZMao6MiMUdFVG4RK1lzBqGgVh1Apur6CUdEqbkoFjOYKQqXbC2FhSyWEfSrQ6ewwuzJGkcGzjd8RdtoJHYPQpuTH9qWyf4UrhE57rBMijJ1Ox06JsNMR4pQIO53oHYUw7zxCykxG5F5XEE6JsNMp5AkRZh2RxQg7XTY+IcJeH2JxSoQ6nIgRalEjRBiMZqEYoRY1UoS9Ps7ilAi1qJEidFrUiBHqcCJGqMOJFKHX4USMUPdOpAih02v2jtrBM87VkP0UoRY1UoRBs1CMULefxAh1pUaKMIIilCLU0lqKMGlpLUaopbUU4Ume4m9jfYOes4lA6Ovr9oB8O2Hyo22Cnc/N8SP2+H1jL9+Y+0k2i/5O7NEAFbs3mYwd6gVCNuYvPpB4nB37jOQ89YbNZMwYSTIQCevhrzHXUKyxX+w37bXmz7fX2Nre4IgWOGvH7tdZgJ08sIg1QBg7M4C07fliwozj2EYoW1P3kQc2KBeMi4/KBeNCL0F1yqUoF4xLgB/FJdTPHn4tu1zeG/uzkuBwY+MP+2Z9ro3dsR4b+8O+WV9P2RD8fmPLz6qViMbSBZAtRGOHuaXdzi13ZrgG0P6ylvxD1xn2Akr0gxdPH1A4GFCvz0Sotz84n/dvBUu9XpcAdRbnwMGESqer8oep9PpajMNUoNOFX4JKp2u5h6n0etcoQUVzBaHS65OtwNQNDrBhQqXTKu4wlV6fbEVQAaWCUOl0r/8wlV7vHiWoaG+LUOn1Hk+CSqcXAx6kknt9/whBpdf1lYNUen3RBUFFcwWh0ut7Gg5SKfi6bYbx+roc9hfAC75QZU3dObYmTvzg9w5QosARFYYIf/mptfU6Q2tTnogyQ4Rf9UqJEkOUOZ4yx1PheCoMT9YYx1JljsqyfOF3T1Mq/IZhUgUsFYuG9yxVPrZ/sQbfHxjIQj2D/VSFPxyPVAFLlTmqxGpXihxVNsf3gpshjaMqLF8lM1RDW1kqli/L8mUTR+Ua42Ms23rDTVWRo/IsX75wVAAsFctXYPkKdG4gqsjKjcjKw8TylS1LFTmqRgFAqRiVmnUGOCprWCpOf+gcy5djtctxMsp5x1JxcsMBi2FgMQwsX6xz2XtOndd419lAqV4056KdqgJHFVi+Gv0hoWowpFSJo0p4z+ZSnZu7MiXfqKMIVaOPCrbevBPsJEJoVCmUKnFU1rJUgaXCaURfv68YzUTV6NkoFcsX/rARStWYcVCqzFE1+ihC1ZjdUKrIUTXOL0rF8pVZ7cqsjMqsjCqepeLkYTCOpWqQz3X8SmZSwYZGv0GpWL5aPQChKhxVY52CUiWOClgMG+My1PuUh67FTlWBpSocVWM0p1SJo2r0NpSKRSOzyGeeLxb5wiJfOOSjaZAPqaqSmaoiR9VYS6VUhaNq9DaEyhuWKnBUwPIFrHY1qhRCFTxLlTiqyMrDyMpD/Lo/ou6N+HVxpCpzVI1tmwOqt+Ho36v14up6efc0aDb/fHm4eV6sHj4Pn/97HP9zvV4sl4v7y8f16ubu9mV9d7lc3Wz+NzOfP355X+Y+lE00m8Pha50P49jmcPNFuQBzF+LgdfD8Pw==",
|
|
3350
|
+
"brillig_names": [
|
|
3351
|
+
"balance_of_public"
|
|
3352
|
+
]
|
|
3353
|
+
},
|
|
3354
|
+
{
|
|
3355
|
+
"name": "check_balance",
|
|
3356
|
+
"is_unconstrained": true,
|
|
3357
|
+
"custom_attributes": [
|
|
3358
|
+
"public",
|
|
3359
|
+
"view"
|
|
3360
|
+
],
|
|
3361
|
+
"abi": {
|
|
3362
|
+
"error_types": {
|
|
3363
|
+
"15238796416211288225": {
|
|
3364
|
+
"error_kind": "string",
|
|
3365
|
+
"string": "Balance too low"
|
|
3366
|
+
},
|
|
3367
|
+
"16761564377371454734": {
|
|
3368
|
+
"error_kind": "string",
|
|
3369
|
+
"string": "Array index out of bounds"
|
|
3370
|
+
},
|
|
3371
|
+
"17843811134343075018": {
|
|
3372
|
+
"error_kind": "string",
|
|
3373
|
+
"string": "Stack too deep"
|
|
3374
|
+
},
|
|
3375
|
+
"206160798890201757": {
|
|
3376
|
+
"error_kind": "string",
|
|
3377
|
+
"string": "Storage slot 0 not allowed. Storage slots must start from 1."
|
|
3378
|
+
},
|
|
3379
|
+
"3219842053230618354": {
|
|
3380
|
+
"error_kind": "string",
|
|
3381
|
+
"string": "Function check_balance can only be called statically"
|
|
3382
|
+
},
|
|
3383
|
+
"5019202896831570965": {
|
|
3384
|
+
"error_kind": "string",
|
|
3385
|
+
"string": "attempt to add with overflow"
|
|
3622
3386
|
},
|
|
3387
|
+
"6485997221020871071": {
|
|
3388
|
+
"error_kind": "string",
|
|
3389
|
+
"string": "call to assert_max_bit_size"
|
|
3390
|
+
}
|
|
3391
|
+
},
|
|
3392
|
+
"parameters": [
|
|
3623
3393
|
{
|
|
3624
|
-
"name": "
|
|
3394
|
+
"name": "fee_limit",
|
|
3625
3395
|
"type": {
|
|
3626
3396
|
"kind": "field"
|
|
3627
3397
|
},
|
|
@@ -3630,25 +3400,37 @@
|
|
|
3630
3400
|
],
|
|
3631
3401
|
"return_type": null
|
|
3632
3402
|
},
|
|
3633
|
-
"bytecode": "
|
|
3634
|
-
"debug_symbols": "
|
|
3403
|
+
"bytecode": "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",
|
|
3404
|
+
"debug_symbols": "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",
|
|
3635
3405
|
"brillig_names": [
|
|
3636
|
-
"
|
|
3406
|
+
"check_balance"
|
|
3637
3407
|
]
|
|
3638
3408
|
},
|
|
3639
3409
|
{
|
|
3640
|
-
"name": "
|
|
3410
|
+
"name": "public_dispatch",
|
|
3641
3411
|
"is_unconstrained": true,
|
|
3642
3412
|
"custom_attributes": [
|
|
3643
|
-
"public"
|
|
3644
|
-
"view"
|
|
3413
|
+
"public"
|
|
3645
3414
|
],
|
|
3646
3415
|
"abi": {
|
|
3647
3416
|
"error_types": {
|
|
3417
|
+
"10502589790419500451": {
|
|
3418
|
+
"error_kind": "string",
|
|
3419
|
+
"string": "Function _increase_public_balance can only be called internally"
|
|
3420
|
+
},
|
|
3421
|
+
"15238796416211288225": {
|
|
3422
|
+
"error_kind": "string",
|
|
3423
|
+
"string": "Balance too low"
|
|
3424
|
+
},
|
|
3648
3425
|
"16761564377371454734": {
|
|
3649
3426
|
"error_kind": "string",
|
|
3650
3427
|
"string": "Array index out of bounds"
|
|
3651
3428
|
},
|
|
3429
|
+
"16957488177269924912": {
|
|
3430
|
+
"error_kind": "fmtstring",
|
|
3431
|
+
"item_types": [],
|
|
3432
|
+
"length": 16
|
|
3433
|
+
},
|
|
3652
3434
|
"17843811134343075018": {
|
|
3653
3435
|
"error_kind": "string",
|
|
3654
3436
|
"string": "Stack too deep"
|
|
@@ -3657,6 +3439,14 @@
|
|
|
3657
3439
|
"error_kind": "string",
|
|
3658
3440
|
"string": "Storage slot 0 not allowed. Storage slots must start from 1."
|
|
3659
3441
|
},
|
|
3442
|
+
"2236649814169388962": {
|
|
3443
|
+
"error_kind": "string",
|
|
3444
|
+
"string": "PublicImmutable already initialized"
|
|
3445
|
+
},
|
|
3446
|
+
"3219842053230618354": {
|
|
3447
|
+
"error_kind": "string",
|
|
3448
|
+
"string": "Function check_balance can only be called statically"
|
|
3449
|
+
},
|
|
3660
3450
|
"5019202896831570965": {
|
|
3661
3451
|
"error_kind": "string",
|
|
3662
3452
|
"string": "attempt to add with overflow"
|
|
@@ -3672,7 +3462,45 @@
|
|
|
3672
3462
|
},
|
|
3673
3463
|
"parameters": [
|
|
3674
3464
|
{
|
|
3675
|
-
"name": "
|
|
3465
|
+
"name": "selector",
|
|
3466
|
+
"type": {
|
|
3467
|
+
"kind": "field"
|
|
3468
|
+
},
|
|
3469
|
+
"visibility": "private"
|
|
3470
|
+
}
|
|
3471
|
+
],
|
|
3472
|
+
"return_type": null
|
|
3473
|
+
},
|
|
3474
|
+
"bytecode": "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",
|
|
3475
|
+
"debug_symbols": "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",
|
|
3476
|
+
"brillig_names": [
|
|
3477
|
+
"public_dispatch"
|
|
3478
|
+
]
|
|
3479
|
+
},
|
|
3480
|
+
{
|
|
3481
|
+
"name": "set_portal",
|
|
3482
|
+
"is_unconstrained": true,
|
|
3483
|
+
"custom_attributes": [
|
|
3484
|
+
"public"
|
|
3485
|
+
],
|
|
3486
|
+
"abi": {
|
|
3487
|
+
"error_types": {
|
|
3488
|
+
"17843811134343075018": {
|
|
3489
|
+
"error_kind": "string",
|
|
3490
|
+
"string": "Stack too deep"
|
|
3491
|
+
},
|
|
3492
|
+
"2236649814169388962": {
|
|
3493
|
+
"error_kind": "string",
|
|
3494
|
+
"string": "PublicImmutable already initialized"
|
|
3495
|
+
},
|
|
3496
|
+
"6485997221020871071": {
|
|
3497
|
+
"error_kind": "string",
|
|
3498
|
+
"string": "call to assert_max_bit_size"
|
|
3499
|
+
}
|
|
3500
|
+
},
|
|
3501
|
+
"parameters": [
|
|
3502
|
+
{
|
|
3503
|
+
"name": "portal_address",
|
|
3676
3504
|
"type": {
|
|
3677
3505
|
"fields": [
|
|
3678
3506
|
{
|
|
@@ -3683,150 +3511,256 @@
|
|
|
3683
3511
|
}
|
|
3684
3512
|
],
|
|
3685
3513
|
"kind": "struct",
|
|
3686
|
-
"path": "authwit::aztec::protocol_types::address::
|
|
3514
|
+
"path": "authwit::aztec::protocol_types::address::eth_address::EthAddress"
|
|
3687
3515
|
},
|
|
3688
3516
|
"visibility": "private"
|
|
3689
3517
|
}
|
|
3690
3518
|
],
|
|
3691
|
-
"return_type":
|
|
3692
|
-
"abi_type": {
|
|
3693
|
-
"kind": "field"
|
|
3694
|
-
},
|
|
3695
|
-
"visibility": "public"
|
|
3696
|
-
}
|
|
3519
|
+
"return_type": null
|
|
3697
3520
|
},
|
|
3698
|
-
"bytecode": "
|
|
3699
|
-
"debug_symbols": "
|
|
3521
|
+
"bytecode": "JgACBAEnAAABBIBEJgAABAMmAgIEASYCAwQAHxgAAwACgEMtCIBDAAEkAAAAQCcCAAEEgEQmAgIEADoNAAEAAiQAAADcJgICAAIuDAACAAMcDAMEACsCAAUAAAAAAAAAAAAAAAAA//////////////////////////8OOAQFBiMCAAYAAACMJAAAAQUmAgQAAAo4AwQFIwIABQAAAKcmAgYEADsJAQYoAgADADuaygIuDAADAAUKOAUEBiMCAAYAAADIJAAAARcnAgAEAN6tLwwABAADLwwAAQACJScAgAQEeAANAAAAgASAAyMAgAMAAAEEKQEAAQX3ofOvpa3UyjsBAQIlKQEAAQVaAuQbtR6pnzsBAQIlKQEAAQUfCi0n3IKHojsBAQIlLQAYyhjK",
|
|
3522
|
+
"debug_symbols": "7VfbisIwEP2XPPchM0kmib+yLFK1SqG0UuvCIv77JsXES10CRUWwL6UTzuTknM6kzIGtisV+My/rdbNjs68Dq5pl3pVN7aLDMWOLtqyqcjO/XGbcP8j2+N02r3246/K2YzMwCBkr6pV/lcbtsC6rgs2ElcdsgEYw+oRGBIxoMPYOWiPQCa1R6DMa+D0052FvzSUl0G6VTDi4C+AK/50xLT9KruGvl8shylWYkgsqgC/O0bMMsMaGjS1QAispHFlaccZS74maPLn1BBAnU4am6MmUgSliap+hKTJ9zxK/MqXPUmOy1CguZcZkkRiV9U/f6JhluUyUiDtw8BvovX+yoOmz9Bp8gF5SPOoldaW359DP57Dq6RzI+QM4DMYPYpRM1QZRvC7JiFRtSBIBrUAmawN0LFNw1/htbSDXn6UXxCP0WhHRYN9X79GFP3lb5ouqOE2W6329vBg0u99tcTNzbttmWaz2beGnz/PgCb4xhMiE8a0IPrCZBMfheP4A",
|
|
3700
3523
|
"brillig_names": [
|
|
3701
|
-
"
|
|
3702
|
-
]
|
|
3703
|
-
}
|
|
3704
|
-
],
|
|
3705
|
-
"outputs": {
|
|
3706
|
-
"globals": {
|
|
3707
|
-
"storage": [
|
|
3708
|
-
{
|
|
3709
|
-
"fields": [
|
|
3710
|
-
{
|
|
3711
|
-
"name": "contract_name",
|
|
3712
|
-
"value": {
|
|
3713
|
-
"kind": "string",
|
|
3714
|
-
"value": "FeeJuice"
|
|
3715
|
-
}
|
|
3716
|
-
},
|
|
3717
|
-
{
|
|
3718
|
-
"name": "fields",
|
|
3719
|
-
"value": {
|
|
3720
|
-
"fields": [
|
|
3721
|
-
{
|
|
3722
|
-
"name": "balances",
|
|
3723
|
-
"value": {
|
|
3724
|
-
"fields": [
|
|
3725
|
-
{
|
|
3726
|
-
"name": "slot",
|
|
3727
|
-
"value": {
|
|
3728
|
-
"kind": "integer",
|
|
3729
|
-
"sign": false,
|
|
3730
|
-
"value": "0000000000000000000000000000000000000000000000000000000000000001"
|
|
3731
|
-
}
|
|
3732
|
-
}
|
|
3733
|
-
],
|
|
3734
|
-
"kind": "struct"
|
|
3735
|
-
}
|
|
3736
|
-
},
|
|
3737
|
-
{
|
|
3738
|
-
"name": "portal_address",
|
|
3739
|
-
"value": {
|
|
3740
|
-
"fields": [
|
|
3741
|
-
{
|
|
3742
|
-
"name": "slot",
|
|
3743
|
-
"value": {
|
|
3744
|
-
"kind": "integer",
|
|
3745
|
-
"sign": false,
|
|
3746
|
-
"value": "0000000000000000000000000000000000000000000000000000000000000002"
|
|
3747
|
-
}
|
|
3748
|
-
}
|
|
3749
|
-
],
|
|
3750
|
-
"kind": "struct"
|
|
3751
|
-
}
|
|
3752
|
-
}
|
|
3753
|
-
],
|
|
3754
|
-
"kind": "struct"
|
|
3755
|
-
}
|
|
3756
|
-
}
|
|
3757
|
-
],
|
|
3758
|
-
"kind": "struct"
|
|
3759
|
-
}
|
|
3524
|
+
"set_portal"
|
|
3760
3525
|
]
|
|
3761
3526
|
},
|
|
3762
|
-
|
|
3763
|
-
"
|
|
3764
|
-
|
|
3765
|
-
|
|
3766
|
-
|
|
3767
|
-
|
|
3768
|
-
|
|
3769
|
-
|
|
3770
|
-
|
|
3771
|
-
|
|
3772
|
-
|
|
3773
|
-
|
|
3774
|
-
|
|
3775
|
-
|
|
3776
|
-
|
|
3777
|
-
|
|
3778
|
-
|
|
3779
|
-
|
|
3780
|
-
|
|
3781
|
-
|
|
3782
|
-
|
|
3783
|
-
|
|
3527
|
+
{
|
|
3528
|
+
"name": "_increase_public_balance",
|
|
3529
|
+
"is_unconstrained": true,
|
|
3530
|
+
"custom_attributes": [
|
|
3531
|
+
"public",
|
|
3532
|
+
"internal"
|
|
3533
|
+
],
|
|
3534
|
+
"abi": {
|
|
3535
|
+
"error_types": {
|
|
3536
|
+
"10502589790419500451": {
|
|
3537
|
+
"error_kind": "string",
|
|
3538
|
+
"string": "Function _increase_public_balance can only be called internally"
|
|
3539
|
+
},
|
|
3540
|
+
"16761564377371454734": {
|
|
3541
|
+
"error_kind": "string",
|
|
3542
|
+
"string": "Array index out of bounds"
|
|
3543
|
+
},
|
|
3544
|
+
"17843811134343075018": {
|
|
3545
|
+
"error_kind": "string",
|
|
3546
|
+
"string": "Stack too deep"
|
|
3547
|
+
},
|
|
3548
|
+
"206160798890201757": {
|
|
3549
|
+
"error_kind": "string",
|
|
3550
|
+
"string": "Storage slot 0 not allowed. Storage slots must start from 1."
|
|
3551
|
+
},
|
|
3552
|
+
"5019202896831570965": {
|
|
3553
|
+
"error_kind": "string",
|
|
3554
|
+
"string": "attempt to add with overflow"
|
|
3555
|
+
},
|
|
3556
|
+
"6485997221020871071": {
|
|
3557
|
+
"error_kind": "string",
|
|
3558
|
+
"string": "call to assert_max_bit_size"
|
|
3559
|
+
}
|
|
3560
|
+
},
|
|
3561
|
+
"parameters": [
|
|
3562
|
+
{
|
|
3563
|
+
"name": "to",
|
|
3564
|
+
"type": {
|
|
3565
|
+
"fields": [
|
|
3566
|
+
{
|
|
3567
|
+
"name": "inner",
|
|
3568
|
+
"type": {
|
|
3569
|
+
"kind": "field"
|
|
3784
3570
|
}
|
|
3785
|
-
|
|
3786
|
-
|
|
3787
|
-
|
|
3571
|
+
}
|
|
3572
|
+
],
|
|
3573
|
+
"kind": "struct",
|
|
3574
|
+
"path": "authwit::aztec::protocol_types::address::aztec_address::AztecAddress"
|
|
3575
|
+
},
|
|
3576
|
+
"visibility": "private"
|
|
3577
|
+
},
|
|
3578
|
+
{
|
|
3579
|
+
"name": "amount",
|
|
3580
|
+
"type": {
|
|
3581
|
+
"kind": "field"
|
|
3582
|
+
},
|
|
3583
|
+
"visibility": "private"
|
|
3584
|
+
}
|
|
3585
|
+
],
|
|
3586
|
+
"return_type": null
|
|
3587
|
+
},
|
|
3588
|
+
"bytecode": "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",
|
|
3589
|
+
"debug_symbols": "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",
|
|
3590
|
+
"brillig_names": [
|
|
3591
|
+
"_increase_public_balance"
|
|
3592
|
+
]
|
|
3593
|
+
},
|
|
3594
|
+
{
|
|
3595
|
+
"name": "sync_notes",
|
|
3596
|
+
"is_unconstrained": true,
|
|
3597
|
+
"custom_attributes": [],
|
|
3598
|
+
"abi": {
|
|
3599
|
+
"error_types": {
|
|
3600
|
+
"17843811134343075018": {
|
|
3601
|
+
"error_kind": "string",
|
|
3602
|
+
"string": "Stack too deep"
|
|
3603
|
+
}
|
|
3604
|
+
},
|
|
3605
|
+
"parameters": [],
|
|
3606
|
+
"return_type": null
|
|
3607
|
+
},
|
|
3608
|
+
"bytecode": "H4sIAAAAAAAA/9VUyw6CMBBseURBOaiJ3kz8gyIYOJJ49x8akKMe8OKNT5eabbqpVRKlJkzSbEs3szNlW0oUKESPvAH9tGnIFdhBDCA6aN/tRgFr9hviQKs7JH/O0iQw+BtQ/5OfWtIvIPktnT+bAM+xVfzYi6w77UaIesKWZ/nPbHpe9fhc/MFnh32k1caghm+uIYci3RuYR4Y8iRlRd9prh/eV5YzJei7w++RVO67va/lrWIeafvmOFV/qrDMe1wmv+YFXVVrypcYv4KBzGnMvbGHe1wvY45yo3mjul/J0vZ0b0gNB8gCVxsvQjgYAAA==",
|
|
3609
|
+
"debug_symbols": "ndLBCoQgEAbgd5lzh7Ss9FViCSsLQTTMFpbo3deiXdqli14GRvxmDvOv0It2GRupBzMDq1dQpuNOGu27dUugtVIpOTbXZ0j3gtDxf5643tvZceuA5TgBoXtgJPV6kEoAy2i+PRJAOBRkoSAPBSQQ4NsNlODqJJQQ8kUIVwciMaiIQWUMqiJQdnt9WqDyg4qs+EWbb5/cSt4qcaZrWHR3CZt7TeIvd5M1negXK/YEXsLna+13YezH+tFv",
|
|
3610
|
+
"brillig_names": [
|
|
3611
|
+
"sync_notes"
|
|
3612
|
+
]
|
|
3613
|
+
},
|
|
3614
|
+
{
|
|
3615
|
+
"name": "compute_note_hash_and_optionally_a_nullifier",
|
|
3616
|
+
"is_unconstrained": true,
|
|
3617
|
+
"custom_attributes": [],
|
|
3618
|
+
"abi": {
|
|
3619
|
+
"error_types": {
|
|
3620
|
+
"16957488177269924912": {
|
|
3621
|
+
"error_kind": "fmtstring",
|
|
3622
|
+
"item_types": [],
|
|
3623
|
+
"length": 16
|
|
3624
|
+
},
|
|
3625
|
+
"17843811134343075018": {
|
|
3626
|
+
"error_kind": "string",
|
|
3627
|
+
"string": "Stack too deep"
|
|
3628
|
+
}
|
|
3629
|
+
},
|
|
3630
|
+
"parameters": [
|
|
3631
|
+
{
|
|
3632
|
+
"name": "contract_address",
|
|
3633
|
+
"type": {
|
|
3634
|
+
"fields": [
|
|
3635
|
+
{
|
|
3636
|
+
"name": "inner",
|
|
3637
|
+
"type": {
|
|
3638
|
+
"kind": "field"
|
|
3639
|
+
}
|
|
3640
|
+
}
|
|
3641
|
+
],
|
|
3642
|
+
"kind": "struct",
|
|
3643
|
+
"path": "authwit::aztec::protocol_types::address::aztec_address::AztecAddress"
|
|
3644
|
+
},
|
|
3645
|
+
"visibility": "private"
|
|
3646
|
+
},
|
|
3647
|
+
{
|
|
3648
|
+
"name": "nonce",
|
|
3649
|
+
"type": {
|
|
3650
|
+
"kind": "field"
|
|
3651
|
+
},
|
|
3652
|
+
"visibility": "private"
|
|
3653
|
+
},
|
|
3654
|
+
{
|
|
3655
|
+
"name": "storage_slot",
|
|
3656
|
+
"type": {
|
|
3657
|
+
"kind": "field"
|
|
3658
|
+
},
|
|
3659
|
+
"visibility": "private"
|
|
3660
|
+
},
|
|
3661
|
+
{
|
|
3662
|
+
"name": "note_type_id",
|
|
3663
|
+
"type": {
|
|
3664
|
+
"kind": "field"
|
|
3665
|
+
},
|
|
3666
|
+
"visibility": "private"
|
|
3667
|
+
},
|
|
3668
|
+
{
|
|
3669
|
+
"name": "compute_nullifier",
|
|
3670
|
+
"type": {
|
|
3671
|
+
"kind": "boolean"
|
|
3672
|
+
},
|
|
3673
|
+
"visibility": "private"
|
|
3674
|
+
},
|
|
3675
|
+
{
|
|
3676
|
+
"name": "serialized_note",
|
|
3677
|
+
"type": {
|
|
3678
|
+
"kind": "array",
|
|
3679
|
+
"length": 0,
|
|
3680
|
+
"type": {
|
|
3681
|
+
"kind": "field"
|
|
3788
3682
|
}
|
|
3683
|
+
},
|
|
3684
|
+
"visibility": "private"
|
|
3685
|
+
}
|
|
3686
|
+
],
|
|
3687
|
+
"return_type": {
|
|
3688
|
+
"abi_type": {
|
|
3689
|
+
"kind": "array",
|
|
3690
|
+
"length": 4,
|
|
3691
|
+
"type": {
|
|
3692
|
+
"kind": "field"
|
|
3789
3693
|
}
|
|
3790
|
-
|
|
3791
|
-
"
|
|
3792
|
-
|
|
3793
|
-
|
|
3694
|
+
},
|
|
3695
|
+
"visibility": "public"
|
|
3696
|
+
}
|
|
3697
|
+
},
|
|
3698
|
+
"bytecode": "H4sIAAAAAAAA/9VZS27bMBClLcmy5Mh27RsE6K4FxFj+ZGegn5xDTewT9ABadNOeuiHMkZ5Hk8KAh0U8QEBZQ715fDMiKWZgTjZ+/Rv469i3I9M36rP3bXmdWUWsMiTPwY3wHN4Iz+hGeMaKPAcCT9fS+5aY0zuXmtP72HPiwy7REfjNv4BY0D++zXw7BL9iYmwmDFYLf1dWz5k5N2X+q8xjpmHw14Q/DoNfEu8vTYePY6G4kW+fmk7LJ3jGWeGvsYgJl3xD8H1lvgh835gPa/g782HdEyfSbQRjUayrXei80NhSGNvgjdaYTju8R1rnJmiNWsp5xvhw/sSnoD5Nx2fEfDH4MuZLwEf6u/Ye+vHcp9DvM9znNRmZfg2Tn3KOWoeoqTgA/qtVku48J3FzHht9qHsMet4zfUKsFahPCP2dPss3+NO1s7QxrUVMT9SINBtjf+bLwBc353Fy/zuGOIhFPBLW/5P/PfPtCJ6h5+dC/BGLf8ZbuIcacaxIuEf93Tv50V9PzKl+flF/05+n9DbVm0qas/Xwty1+Fob/kfDzMPgbwp+EwW/3MndB8B9Kwi/C8H8k/GmY+mn3krMw/A+EPw+CXx1o3f1gOmvnB3+9gPt6c7e1l+yJMH7OuIbaEy0YH64Prr/OtxS4zgUfz+FSiLMU4khYmSLWnSLW7J2OcayINVHEmipiaeYxVcTS1CtXxCoUsTTrXlMvyqO0T3O29215pUn7NEV8K+3TNL/dSWuqr1jQEMeXsP4/mc6TIDztA6059K5TDIxdBIp96XpN8QuBD/HOBd81h7KHH+u1fay31pbHTbVq81kwrvwefhPhfIz9pbVf2vcpal1K3/1T0NVZDL6C+RLwEUfpu38aiP8l+mP8ueDj6/+luVyY/no4YePGM669ypi78z/pbD7w/LW+9N2k+Lnpz9f/63wR9eF76VzgOhd8fH+SC3FyIc4tYvEzetTQ1TXpFDedXyuX2133Dy6aixJzfu5vWPyE9f/tf+PYqL1mzj9ua3tc1cd6Xb+8VM/1guE7G4JOfwHiE0IYFR8AAA==",
|
|
3699
|
+
"debug_symbols": "tdfNaoQwFAXgd8k6i9z8TIyvUsoQNQ6BECVqoYjv3jhM26GzLGcjXLl+AfEgZ2dD6LbbNeZxWlj7trM09X6NU67TfnDWlZhSvF2fbzNxXpy67y+zz+e4rL6srNWSs5AH1hpRnx5jCqxVTh/8ZdN+b1r7s2ma450zp2GygckXmGxhcgOTHUomIXA04WiJoxWO1jja4OgLjrY4usHRuDQSLo2ESyPh0ki4NBIujYRLI/0zjU49NuurfbEt0G6AtsPZUgBtAtoSaCugrYG2AdrAXEpgLiUwlxKVy6NOH75E36XwKFbjlvunnrV+zuFP5ZrL1IdhK+EsX7+96/yWleZa33/tdSAlOSlbD6kHfQE=",
|
|
3700
|
+
"brillig_names": [
|
|
3701
|
+
"compute_note_hash_and_optionally_a_nullifier"
|
|
3702
|
+
]
|
|
3703
|
+
}
|
|
3704
|
+
],
|
|
3705
|
+
"outputs": {
|
|
3706
|
+
"globals": {
|
|
3707
|
+
"storage": [
|
|
3794
3708
|
{
|
|
3795
3709
|
"fields": [
|
|
3796
3710
|
{
|
|
3797
|
-
"name": "
|
|
3798
|
-
"
|
|
3711
|
+
"name": "contract_name",
|
|
3712
|
+
"value": {
|
|
3713
|
+
"kind": "string",
|
|
3714
|
+
"value": "FeeJuice"
|
|
3715
|
+
}
|
|
3716
|
+
},
|
|
3717
|
+
{
|
|
3718
|
+
"name": "fields",
|
|
3719
|
+
"value": {
|
|
3799
3720
|
"fields": [
|
|
3800
3721
|
{
|
|
3801
|
-
"name": "
|
|
3802
|
-
"
|
|
3722
|
+
"name": "balances",
|
|
3723
|
+
"value": {
|
|
3803
3724
|
"fields": [
|
|
3804
3725
|
{
|
|
3805
|
-
"name": "
|
|
3806
|
-
"
|
|
3807
|
-
"kind": "
|
|
3726
|
+
"name": "slot",
|
|
3727
|
+
"value": {
|
|
3728
|
+
"kind": "integer",
|
|
3729
|
+
"sign": false,
|
|
3730
|
+
"value": "0000000000000000000000000000000000000000000000000000000000000001"
|
|
3808
3731
|
}
|
|
3809
3732
|
}
|
|
3810
3733
|
],
|
|
3811
|
-
"kind": "struct"
|
|
3812
|
-
"path": "authwit::aztec::protocol_types::address::aztec_address::AztecAddress"
|
|
3734
|
+
"kind": "struct"
|
|
3813
3735
|
}
|
|
3814
3736
|
},
|
|
3815
3737
|
{
|
|
3816
|
-
"name": "
|
|
3817
|
-
"
|
|
3818
|
-
"
|
|
3738
|
+
"name": "portal_address",
|
|
3739
|
+
"value": {
|
|
3740
|
+
"fields": [
|
|
3741
|
+
{
|
|
3742
|
+
"name": "slot",
|
|
3743
|
+
"value": {
|
|
3744
|
+
"kind": "integer",
|
|
3745
|
+
"sign": false,
|
|
3746
|
+
"value": "0000000000000000000000000000000000000000000000000000000000000002"
|
|
3747
|
+
}
|
|
3748
|
+
}
|
|
3749
|
+
],
|
|
3750
|
+
"kind": "struct"
|
|
3819
3751
|
}
|
|
3820
3752
|
}
|
|
3821
3753
|
],
|
|
3822
|
-
"kind": "struct"
|
|
3823
|
-
"path": "FeeJuice::_increase_public_balance_parameters"
|
|
3754
|
+
"kind": "struct"
|
|
3824
3755
|
}
|
|
3825
3756
|
}
|
|
3826
3757
|
],
|
|
3827
|
-
"kind": "struct"
|
|
3828
|
-
|
|
3829
|
-
|
|
3758
|
+
"kind": "struct"
|
|
3759
|
+
}
|
|
3760
|
+
]
|
|
3761
|
+
},
|
|
3762
|
+
"structs": {
|
|
3763
|
+
"functions": [
|
|
3830
3764
|
{
|
|
3831
3765
|
"fields": [
|
|
3832
3766
|
{
|
|
@@ -3898,12 +3832,12 @@
|
|
|
3898
3832
|
}
|
|
3899
3833
|
],
|
|
3900
3834
|
"kind": "struct",
|
|
3901
|
-
"path": "FeeJuice::
|
|
3835
|
+
"path": "FeeJuice::initialize_parameters"
|
|
3902
3836
|
}
|
|
3903
3837
|
}
|
|
3904
3838
|
],
|
|
3905
3839
|
"kind": "struct",
|
|
3906
|
-
"path": "FeeJuice::
|
|
3840
|
+
"path": "FeeJuice::initialize_abi"
|
|
3907
3841
|
},
|
|
3908
3842
|
{
|
|
3909
3843
|
"fields": [
|
|
@@ -3961,6 +3895,72 @@
|
|
|
3961
3895
|
],
|
|
3962
3896
|
"kind": "struct",
|
|
3963
3897
|
"path": "FeeJuice::balance_of_public_abi"
|
|
3898
|
+
},
|
|
3899
|
+
{
|
|
3900
|
+
"fields": [
|
|
3901
|
+
{
|
|
3902
|
+
"name": "parameters",
|
|
3903
|
+
"type": {
|
|
3904
|
+
"fields": [
|
|
3905
|
+
{
|
|
3906
|
+
"name": "to",
|
|
3907
|
+
"type": {
|
|
3908
|
+
"fields": [
|
|
3909
|
+
{
|
|
3910
|
+
"name": "inner",
|
|
3911
|
+
"type": {
|
|
3912
|
+
"kind": "field"
|
|
3913
|
+
}
|
|
3914
|
+
}
|
|
3915
|
+
],
|
|
3916
|
+
"kind": "struct",
|
|
3917
|
+
"path": "authwit::aztec::protocol_types::address::aztec_address::AztecAddress"
|
|
3918
|
+
}
|
|
3919
|
+
},
|
|
3920
|
+
{
|
|
3921
|
+
"name": "amount",
|
|
3922
|
+
"type": {
|
|
3923
|
+
"kind": "field"
|
|
3924
|
+
}
|
|
3925
|
+
}
|
|
3926
|
+
],
|
|
3927
|
+
"kind": "struct",
|
|
3928
|
+
"path": "FeeJuice::_increase_public_balance_parameters"
|
|
3929
|
+
}
|
|
3930
|
+
}
|
|
3931
|
+
],
|
|
3932
|
+
"kind": "struct",
|
|
3933
|
+
"path": "FeeJuice::_increase_public_balance_abi"
|
|
3934
|
+
},
|
|
3935
|
+
{
|
|
3936
|
+
"fields": [
|
|
3937
|
+
{
|
|
3938
|
+
"name": "parameters",
|
|
3939
|
+
"type": {
|
|
3940
|
+
"fields": [
|
|
3941
|
+
{
|
|
3942
|
+
"name": "portal_address",
|
|
3943
|
+
"type": {
|
|
3944
|
+
"fields": [
|
|
3945
|
+
{
|
|
3946
|
+
"name": "inner",
|
|
3947
|
+
"type": {
|
|
3948
|
+
"kind": "field"
|
|
3949
|
+
}
|
|
3950
|
+
}
|
|
3951
|
+
],
|
|
3952
|
+
"kind": "struct",
|
|
3953
|
+
"path": "authwit::aztec::protocol_types::address::eth_address::EthAddress"
|
|
3954
|
+
}
|
|
3955
|
+
}
|
|
3956
|
+
],
|
|
3957
|
+
"kind": "struct",
|
|
3958
|
+
"path": "FeeJuice::set_portal_parameters"
|
|
3959
|
+
}
|
|
3960
|
+
}
|
|
3961
|
+
],
|
|
3962
|
+
"kind": "struct",
|
|
3963
|
+
"path": "FeeJuice::set_portal_abi"
|
|
3964
3964
|
}
|
|
3965
3965
|
]
|
|
3966
3966
|
}
|
|
@@ -3998,117 +3998,117 @@
|
|
|
3998
3998
|
"path": "std/uint128.nr",
|
|
3999
3999
|
"source": "use crate::cmp::{Eq, Ord, Ordering};\nuse crate::ops::{Add, BitAnd, BitOr, BitXor, Div, Mul, Not, Rem, Shl, Shr, Sub};\n\nglobal pow64: Field = 18446744073709551616; //2^64;\nglobal pow63: Field = 9223372036854775808; // 2^63;\npub struct U128 {\n pub(crate) lo: Field,\n pub(crate) hi: Field,\n}\n\nimpl U128 {\n\n pub fn from_u64s_le(lo: u64, hi: u64) -> U128 {\n // in order to handle multiplication, we need to represent the product of two u64 without overflow\n assert(crate::field::modulus_num_bits() as u32 > 128);\n U128 { lo: lo as Field, hi: hi as Field }\n }\n\n pub fn from_u64s_be(hi: u64, lo: u64) -> U128 {\n U128::from_u64s_le(lo, hi)\n }\n\n pub fn zero() -> U128 {\n U128 { lo: 0, hi: 0 }\n }\n\n pub fn one() -> U128 {\n U128 { lo: 1, hi: 0 }\n }\n pub fn from_le_bytes(bytes: [u8; 16]) -> U128 {\n let mut lo = 0;\n let mut base = 1;\n for i in 0..8 {\n lo += (bytes[i] as Field) * base;\n base *= 256;\n }\n let mut hi = 0;\n base = 1;\n for i in 8..16 {\n hi += (bytes[i] as Field) * base;\n base *= 256;\n }\n U128 { lo, hi }\n }\n\n pub fn to_be_bytes(self: Self) -> [u8; 16] {\n let lo: [u8; 8] = self.lo.to_be_bytes();\n let hi: [u8; 8] = self.hi.to_be_bytes();\n let mut bytes = [0; 16];\n for i in 0..8 {\n bytes[i] = hi[i];\n bytes[i + 8] = lo[i];\n }\n bytes\n }\n\n pub fn to_le_bytes(self: Self) -> [u8; 16] {\n let lo: [u8; 8] = self.lo.to_le_bytes();\n let hi: [u8; 8] = self.hi.to_le_bytes();\n let mut bytes = [0; 16];\n for i in 0..8 {\n bytes[i] = lo[i];\n bytes[i + 8] = hi[i];\n }\n bytes\n }\n\n pub fn from_hex<let N: u32>(hex: str<N>) -> U128 {\n let N = N as u32;\n let bytes = hex.as_bytes();\n // string must starts with \"0x\"\n assert((bytes[0] == 48) & (bytes[1] == 120), \"Invalid hexadecimal string\");\n assert(N < 35, \"Input does not fit into a U128\");\n\n let mut lo = 0;\n let mut hi = 0;\n let mut base = 1;\n if N <= 18 {\n for i in 0..N - 2 {\n lo += U128::decode_ascii(bytes[N - i - 1]) * base;\n base = base * 16;\n }\n } else {\n for i in 0..16 {\n lo += U128::decode_ascii(bytes[N - i - 1]) * base;\n base = base * 16;\n }\n base = 1;\n for i in 17..N - 1 {\n hi += U128::decode_ascii(bytes[N - i]) * base;\n base = base * 16;\n }\n }\n U128 { lo: lo as Field, hi: hi as Field }\n }\n\n unconstrained fn uconstrained_check_is_upper_ascii(ascii: u8) -> bool {\n ((ascii >= 65) & (ascii <= 90)) // Between 'A' and 'Z'\n }\n\n pub(crate) fn decode_ascii(ascii: u8) -> Field {\n (\n if ascii < 58 {\n ascii - 48\n } else {\n let ascii =\n ascii + 32 * (unsafe { U128::uconstrained_check_is_upper_ascii(ascii) as u8 });\n assert(ascii >= 97); // enforce >= 'a'\n assert(ascii <= 102); // enforce <= 'f'\n ascii - 87\n }\n ) as Field\n }\n\n // TODO: Replace with a faster version.\n // A circuit that uses this function can be slow to compute\n // (we're doing up to 127 calls to compute the quotient)\n unconstrained fn unconstrained_div(self: Self, b: U128) -> (U128, U128) {\n if b == U128::zero() {\n // Return 0,0 to avoid eternal loop\n (U128::zero(), U128::zero())\n } else if self < b {\n (U128::zero(), self)\n } else if self == b {\n (U128::one(), U128::zero())\n } else {\n let (q, r) = if b.hi as u64 >= pow63 as u64 {\n // The result of multiplication by 2 would overflow\n (U128::zero(), self)\n } else {\n self.unconstrained_div(b * U128::from_u64s_le(2, 0))\n };\n let q_mul_2 = q * U128::from_u64s_le(2, 0);\n if r < b {\n (q_mul_2, r)\n } else {\n (q_mul_2 + U128::one(), r - b)\n }\n }\n }\n\n pub fn from_integer<T>(i: T) -> U128 {\n let f = crate::as_field(i);\n // Reject values which would overflow a u128\n f.assert_max_bit_size::<128>();\n let lo = f as u64 as Field;\n let hi = (f - lo) / pow64;\n U128 { lo, hi }\n }\n\n pub fn to_integer<T>(self) -> T {\n crate::from_field(self.lo + self.hi * pow64)\n }\n\n fn wrapping_mul(self: Self, b: U128) -> U128 {\n let low = self.lo * b.lo;\n let lo = low as u64 as Field;\n let carry = (low - lo) / pow64;\n let high = self.lo * b.hi + self.hi * b.lo + carry;\n let hi = high as u64 as Field;\n U128 { lo, hi }\n }\n}\n\nimpl Add for U128 {\n fn add(self: Self, b: U128) -> U128 {\n let low = self.lo + b.lo;\n let lo = low as u64 as Field;\n let carry = (low - lo) / pow64;\n let high = self.hi + b.hi + carry;\n let hi = high as u64 as Field;\n assert(hi == high, \"attempt to add with overflow\");\n U128 { lo, hi }\n }\n}\n\nimpl Sub for U128 {\n fn sub(self: Self, b: U128) -> U128 {\n let low = pow64 + self.lo - b.lo;\n let lo = low as u64 as Field;\n let borrow = (low == lo) as Field;\n let high = self.hi - b.hi - borrow;\n let hi = high as u64 as Field;\n assert(hi == high, \"attempt to subtract with underflow\");\n U128 { lo, hi }\n }\n}\n\nimpl Mul for U128 {\n fn mul(self: Self, b: U128) -> U128 {\n assert(self.hi * b.hi == 0, \"attempt to multiply with overflow\");\n let low = self.lo * b.lo;\n let lo = low as u64 as Field;\n let carry = (low - lo) / pow64;\n let high = if crate::field::modulus_num_bits() as u32 > 196 {\n (self.lo + self.hi) * (b.lo + b.hi) - low + carry\n } else {\n self.lo * b.hi + self.hi * b.lo + carry\n };\n let hi = high as u64 as Field;\n assert(hi == high, \"attempt to multiply with overflow\");\n U128 { lo, hi }\n }\n}\n\nimpl Div for U128 {\n fn div(self: Self, b: U128) -> U128 {\n unsafe {\n let (q, r) = self.unconstrained_div(b);\n let a = b * q + r;\n assert_eq(self, a);\n assert(r < b);\n q\n }\n }\n}\n\nimpl Rem for U128 {\n fn rem(self: Self, b: U128) -> U128 {\n unsafe {\n let (q, r) = self.unconstrained_div(b);\n let a = b * q + r;\n assert_eq(self, a);\n assert(r < b);\n\n r\n }\n }\n}\n\nimpl Eq for U128 {\n fn eq(self: Self, b: U128) -> bool {\n (self.lo == b.lo) & (self.hi == b.hi)\n }\n}\n\nimpl Ord for U128 {\n fn cmp(self, other: Self) -> Ordering {\n let hi_ordering = (self.hi as u64).cmp((other.hi as u64));\n let lo_ordering = (self.lo as u64).cmp((other.lo as u64));\n\n if hi_ordering == Ordering::equal() {\n lo_ordering\n } else {\n hi_ordering\n }\n }\n}\n\nimpl Not for U128 {\n fn not(self) -> U128 {\n U128 { lo: (!(self.lo as u64)) as Field, hi: (!(self.hi as u64)) as Field }\n }\n}\n\nimpl BitOr for U128 {\n fn bitor(self, other: U128) -> U128 {\n U128 {\n lo: ((self.lo as u64) | (other.lo as u64)) as Field,\n hi: ((self.hi as u64) | (other.hi as u64)) as Field,\n }\n }\n}\n\nimpl BitAnd for U128 {\n fn bitand(self, other: U128) -> U128 {\n U128 {\n lo: ((self.lo as u64) & (other.lo as u64)) as Field,\n hi: ((self.hi as u64) & (other.hi as u64)) as Field,\n }\n }\n}\n\nimpl BitXor for U128 {\n fn bitxor(self, other: U128) -> U128 {\n U128 {\n lo: ((self.lo as u64) ^ (other.lo as u64)) as Field,\n hi: ((self.hi as u64) ^ (other.hi as u64)) as Field,\n }\n }\n}\n\nimpl Shl for U128 {\n fn shl(self, other: u8) -> U128 {\n assert(other < 128, \"attempt to shift left with overflow\");\n let exp_bits: [u1; 7] = (other as Field).to_be_bits();\n\n let mut r: Field = 2;\n let mut y: Field = 1;\n for i in 1..8 {\n let bit = exp_bits[7 - i] as Field;\n y = bit * (r * y) + (1 - bit) * y;\n r *= r;\n }\n self.wrapping_mul(U128::from_integer(y))\n }\n}\n\nimpl Shr for U128 {\n fn shr(self, other: u8) -> U128 {\n assert(other < 128, \"attempt to shift right with overflow\");\n let exp_bits: [u1; 7] = (other as Field).to_be_bits();\n\n let mut r: Field = 2;\n let mut y: Field = 1;\n for i in 1..8 {\n let bit = exp_bits[7 - i] as Field;\n y = bit * (r * y) + (1 - bit) * y;\n r *= r;\n }\n self / U128::from_integer(y)\n }\n}\n\nmod tests {\n use crate::uint128::{pow63, pow64, U128};\n\n #[test]\n fn test_not(lo: u64, hi: u64) {\n let num = U128::from_u64s_le(lo, hi);\n let not_num = num.not();\n\n assert_eq(not_num.hi, (hi.not() as Field));\n assert_eq(not_num.lo, (lo.not() as Field));\n\n let not_not_num = not_num.not();\n assert_eq(num, not_not_num);\n }\n #[test]\n fn test_construction() {\n // Check little-endian u64 is inversed with big-endian u64 construction\n let a = U128::from_u64s_le(2, 1);\n let b = U128::from_u64s_be(1, 2);\n assert_eq(a, b);\n // Check byte construction is equivalent\n let c = U128::from_le_bytes([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]);\n let d = U128::from_u64s_le(0x0706050403020100, 0x0f0e0d0c0b0a0908);\n assert_eq(c, d);\n }\n #[test]\n fn test_byte_decomposition() {\n let a = U128::from_u64s_le(0x0706050403020100, 0x0f0e0d0c0b0a0908);\n // Get big-endian and little-endian byte decompostions\n let le_bytes_a = a.to_le_bytes();\n let be_bytes_a = a.to_be_bytes();\n\n // Check equivalence\n for i in 0..16 {\n assert_eq(le_bytes_a[i], be_bytes_a[15 - i]);\n }\n // Reconstruct U128 from byte decomposition\n let b = U128::from_le_bytes(le_bytes_a);\n // Check that it's the same element\n assert_eq(a, b);\n }\n #[test]\n fn test_hex_constuction() {\n let a = U128::from_u64s_le(0x1, 0x2);\n let b = U128::from_hex(\"0x20000000000000001\");\n assert_eq(a, b);\n\n let c = U128::from_hex(\"0xffffffffffffffffffffffffffffffff\");\n let d = U128::from_u64s_le(0xffffffffffffffff, 0xffffffffffffffff);\n assert_eq(c, d);\n\n let e = U128::from_hex(\"0x00000000000000000000000000000000\");\n let f = U128::from_u64s_le(0, 0);\n assert_eq(e, f);\n }\n\n // Ascii decode tests\n\n #[test]\n fn test_ascii_decode_correct_range() {\n // '0'..'9' range\n for i in 0..10 {\n let decoded = U128::decode_ascii(48 + i);\n assert_eq(decoded, i as Field);\n }\n // 'A'..'F' range\n for i in 0..6 {\n let decoded = U128::decode_ascii(65 + i);\n assert_eq(decoded, (i + 10) as Field);\n }\n // 'a'..'f' range\n for i in 0..6 {\n let decoded = U128::decode_ascii(97 + i);\n assert_eq(decoded, (i + 10) as Field);\n }\n }\n\n #[test(should_fail)]\n fn test_ascii_decode_range_less_than_48_fails_0() {\n crate::println(U128::decode_ascii(0));\n }\n #[test(should_fail)]\n fn test_ascii_decode_range_less_than_48_fails_1() {\n crate::println(U128::decode_ascii(47));\n }\n\n #[test(should_fail)]\n fn test_ascii_decode_range_58_64_fails_0() {\n let _ = U128::decode_ascii(58);\n }\n #[test(should_fail)]\n fn test_ascii_decode_range_58_64_fails_1() {\n let _ = U128::decode_ascii(64);\n }\n #[test(should_fail)]\n fn test_ascii_decode_range_71_96_fails_0() {\n let _ = U128::decode_ascii(71);\n }\n #[test(should_fail)]\n fn test_ascii_decode_range_71_96_fails_1() {\n let _ = U128::decode_ascii(96);\n }\n #[test(should_fail)]\n fn test_ascii_decode_range_greater_than_102_fails() {\n let _ = U128::decode_ascii(103);\n }\n\n #[test(should_fail)]\n fn test_ascii_decode_regression() {\n // This code will actually fail because of ascii_decode,\n // but in the past it was possible to create a value > (1<<128)\n let a = U128::from_hex(\"0x~fffffffffffffffffffffffffffffff\");\n let b: Field = a.to_integer();\n let c: [u8; 17] = b.to_le_bytes();\n assert(c[16] != 0);\n }\n\n #[test]\n fn test_unconstrained_div() {\n // Test the potential overflow case\n let a = U128::from_u64s_le(0x0, 0xffffffffffffffff);\n let b = U128::from_u64s_le(0x0, 0xfffffffffffffffe);\n let c = U128::one();\n let d = U128::from_u64s_le(0x0, 0x1);\n unsafe {\n let (q, r) = a.unconstrained_div(b);\n assert_eq(q, c);\n assert_eq(r, d);\n }\n\n let a = U128::from_u64s_le(2, 0);\n let b = U128::one();\n // Check the case where a is a multiple of b\n unsafe {\n let (c, d) = a.unconstrained_div(b);\n assert_eq((c, d), (a, U128::zero()));\n }\n\n // Check where b is a multiple of a\n unsafe {\n let (c, d) = b.unconstrained_div(a);\n assert_eq((c, d), (U128::zero(), b));\n }\n\n // Dividing by zero returns 0,0\n let a = U128::from_u64s_le(0x1, 0x0);\n let b = U128::zero();\n unsafe {\n let (c, d) = a.unconstrained_div(b);\n assert_eq((c, d), (U128::zero(), U128::zero()));\n }\n // Dividing 1<<127 by 1<<127 (special case)\n let a = U128::from_u64s_le(0x0, pow63 as u64);\n let b = U128::from_u64s_le(0x0, pow63 as u64);\n unsafe {\n let (c, d) = a.unconstrained_div(b);\n assert_eq((c, d), (U128::one(), U128::zero()));\n }\n }\n\n #[test]\n fn integer_conversions() {\n // Maximum\n let start: Field = 0xffffffffffffffffffffffffffffffff;\n let a = U128::from_integer(start);\n let end = a.to_integer();\n assert_eq(start, end);\n\n // Minimum\n let start: Field = 0x0;\n let a = U128::from_integer(start);\n let end = a.to_integer();\n assert_eq(start, end);\n\n // Low limb\n let start: Field = 0xffffffffffffffff;\n let a = U128::from_integer(start);\n let end = a.to_integer();\n assert_eq(start, end);\n\n // High limb\n let start: Field = 0xffffffffffffffff0000000000000000;\n let a = U128::from_integer(start);\n let end = a.to_integer();\n assert_eq(start, end);\n }\n\n #[test]\n fn integer_conversions_fuzz(lo: u64, hi: u64) {\n let start: Field = (lo as Field) + pow64 * (hi as Field);\n let a = U128::from_integer(start);\n let end = a.to_integer();\n assert_eq(start, end);\n }\n\n #[test]\n fn test_wrapping_mul() {\n // 1*0==0\n assert_eq(U128::zero(), U128::zero().wrapping_mul(U128::one()));\n\n // 0*1==0\n assert_eq(U128::zero(), U128::one().wrapping_mul(U128::zero()));\n\n // 1*1==1\n assert_eq(U128::one(), U128::one().wrapping_mul(U128::one()));\n\n // 0 * ( 1 << 64 ) == 0\n assert_eq(U128::zero(), U128::zero().wrapping_mul(U128::from_u64s_le(0, 1)));\n\n // ( 1 << 64 ) * 0 == 0\n assert_eq(U128::zero(), U128::from_u64s_le(0, 1).wrapping_mul(U128::zero()));\n\n // 1 * ( 1 << 64 ) == 1 << 64\n assert_eq(U128::from_u64s_le(0, 1), U128::from_u64s_le(0, 1).wrapping_mul(U128::one()));\n\n // ( 1 << 64 ) * 1 == 1 << 64\n assert_eq(U128::from_u64s_le(0, 1), U128::one().wrapping_mul(U128::from_u64s_le(0, 1)));\n\n // ( 1 << 64 ) * ( 1 << 64 ) == 1 << 64\n assert_eq(U128::zero(), U128::from_u64s_le(0, 1).wrapping_mul(U128::from_u64s_le(0, 1)));\n // -1 * -1 == 1\n assert_eq(\n U128::one(),\n U128::from_u64s_le(0xffffffffffffffff, 0xffffffffffffffff).wrapping_mul(\n U128::from_u64s_le(0xffffffffffffffff, 0xffffffffffffffff),\n ),\n );\n }\n}\n"
|
|
4000
4000
|
},
|
|
4001
|
-
"
|
|
4002
|
-
"path": "/usr/src/noir-projects/aztec-nr/aztec/src/
|
|
4003
|
-
"source": "use crate::note::{note_header::NoteHeader, note_interface::NoteInterface};\n\nuse dep::protocol_types::{\n address::AztecAddress,\n indexed_tagging_secret::{INDEXED_TAGGING_SECRET_LENGTH, IndexedTaggingSecret},\n utils::arr_copy_slice,\n};\n\n/// Notifies the simulator that a note has been created, so that it can be returned in future read requests in the same\n/// transaction. This note should only be added to the non-volatile database if found in an actual block.\npub fn notify_created_note<let N: u32>(\n storage_slot: Field,\n note_type_id: Field,\n serialized_note: [Field; N],\n note_hash: Field,\n counter: u32,\n) {\n // This oracle call returns nothing: we only call it for its side effects. It is therefore always safe to call.\n unsafe {\n notify_created_note_oracle_wrapper(\n storage_slot,\n note_type_id,\n serialized_note,\n note_hash,\n counter,\n )\n };\n}\n\n/// Notifies the simulator that a note has been nullified, so that it is no longer returned in future read requests in\n/// the same transaction. This note should only be removed to the non-volatile database if its nullifier is found in an\n/// actual block.\npub fn notify_nullified_note(nullifier: Field, note_hash: Field, counter: u32) {\n // This oracle call returns nothing: we only call it for its side effects. It is therefore always safe to call.\n unsafe { notify_nullified_note_oracle_wrapper(nullifier, note_hash, counter) };\n}\n\nunconstrained fn notify_created_note_oracle_wrapper<let N: u32>(\n storage_slot: Field,\n note_type_id: Field,\n serialized_note: [Field; N],\n note_hash: Field,\n counter: u32,\n) {\n let _ = notify_created_note_oracle(\n storage_slot,\n note_type_id,\n serialized_note,\n note_hash,\n counter,\n );\n}\n\n#[oracle(notifyCreatedNote)]\nunconstrained fn notify_created_note_oracle<let N: u32>(\n _storage_slot: Field,\n _note_type_id: Field,\n _serialized_note: [Field; N],\n _note_hash: Field,\n _counter: u32,\n) -> Field {}\n\nunconstrained fn notify_nullified_note_oracle_wrapper(\n nullifier: Field,\n note_hash: Field,\n counter: u32,\n) {\n let _ = notify_nullified_note_oracle(nullifier, note_hash, counter);\n}\n\n#[oracle(notifyNullifiedNote)]\nunconstrained fn notify_nullified_note_oracle(\n _nullifier: Field,\n _note_hash: Field,\n _counter: u32,\n) -> Field {}\n\n#[oracle(getNotes)]\nunconstrained fn get_notes_oracle<let N: u32, let S: u32>(\n _storage_slot: Field,\n _num_selects: u8,\n _select_by_indexes: [u8; N],\n _select_by_offsets: [u8; N],\n _select_by_lengths: [u8; N],\n _select_values: [Field; N],\n _select_comparators: [u8; N],\n _sort_by_indexes: [u8; N],\n _sort_by_offsets: [u8; N],\n _sort_by_lengths: [u8; N],\n _sort_order: [u8; N],\n _limit: u32,\n _offset: u32,\n _status: u8,\n _return_size: u32,\n _placeholder_fields: [Field; S],\n) -> [Field; S] {}\n\nunconstrained fn get_notes_oracle_wrapper<let N: u32, let S: u32>(\n storage_slot: Field,\n num_selects: u8,\n select_by_indexes: [u8; N],\n select_by_offsets: [u8; N],\n select_by_lengths: [u8; N],\n select_values: [Field; N],\n select_comparators: [u8; N],\n sort_by_indexes: [u8; N],\n sort_by_offsets: [u8; N],\n sort_by_lengths: [u8; N],\n sort_order: [u8; N],\n limit: u32,\n offset: u32,\n status: u8,\n mut placeholder_fields: [Field; S],\n) -> [Field; S] {\n let return_size = placeholder_fields.len() as u32;\n get_notes_oracle(\n storage_slot,\n num_selects,\n select_by_indexes,\n select_by_offsets,\n select_by_lengths,\n select_values,\n select_comparators,\n sort_by_indexes,\n sort_by_offsets,\n sort_by_lengths,\n sort_order,\n limit,\n offset,\n status,\n return_size,\n placeholder_fields,\n )\n}\n\npub unconstrained fn get_notes<Note, let N: u32, let M: u32, let S: u32, let NS: u32>(\n storage_slot: Field,\n num_selects: u8,\n select_by_indexes: [u8; M],\n select_by_offsets: [u8; M],\n select_by_lengths: [u8; M],\n select_values: [Field; M],\n select_comparators: [u8; M],\n sort_by_indexes: [u8; M],\n sort_by_offsets: [u8; M],\n sort_by_lengths: [u8; M],\n sort_order: [u8; M],\n limit: u32,\n offset: u32,\n status: u8,\n mut placeholder_opt_notes: [Option<Note>; S], // TODO: Remove it and use `limit` to initialize the note array.\n placeholder_fields: [Field; NS], // TODO: Remove it and use `limit` to initialize the note array.\n _placeholder_note_length: [Field; N], // Turbofish hack? Compiler breaks calculating read_offset unless we add this parameter\n) -> [Option<Note>; S]\nwhere\n Note: NoteInterface<N>,\n{\n sync_notes_oracle_wrapper();\n let fields = get_notes_oracle_wrapper(\n storage_slot,\n num_selects,\n select_by_indexes,\n select_by_offsets,\n select_by_lengths,\n select_values,\n select_comparators,\n sort_by_indexes,\n sort_by_offsets,\n sort_by_lengths,\n sort_order,\n limit,\n offset,\n status,\n placeholder_fields,\n );\n let num_notes = fields[0] as u32;\n let contract_address = AztecAddress::from_field(fields[1]);\n for i in 0..placeholder_opt_notes.len() {\n if i < num_notes {\n // lengths named as per typescript.\n let return_header_length: u32 = 2; // num_notes & contract_address.\n let extra_preimage_length: u32 = 2; // nonce & note_hash_counter.\n let read_offset: u32 = return_header_length + i * (N + extra_preimage_length);\n let nonce = fields[read_offset];\n let note_hash_counter = fields[read_offset + 1] as u32;\n let header = NoteHeader { contract_address, nonce, storage_slot, note_hash_counter };\n let serialized_note = arr_copy_slice(fields, [0; N], read_offset + 2);\n let mut note = Note::deserialize_content(serialized_note);\n note.set_header(header);\n placeholder_opt_notes[i] = Option::some(note);\n };\n }\n placeholder_opt_notes\n}\n\n/// Returns true if the nullifier exists. Note that a `true` value can be constrained by proving existence of the\n/// nullifier, but a `false` value should not be relied upon since other transactions may emit this nullifier before the\n/// current transaction is included in a block. While this might seem of little use at first, certain design patterns\n/// benefit from this abstraction (see e.g. `PrivateMutable`).\npub unconstrained fn check_nullifier_exists(inner_nullifier: Field) -> bool {\n check_nullifier_exists_oracle(inner_nullifier) == 1\n}\n\n#[oracle(checkNullifierExists)]\nunconstrained fn check_nullifier_exists_oracle(_inner_nullifier: Field) -> Field {}\n\n/// Same as `get_app_tagging_secret_as_sender`, except it returns the derived tag as an array of bytes, ready to be included in a\n/// log.\npub unconstrained fn get_app_tag_bytes_as_sender(\n sender: AztecAddress,\n recipient: AztecAddress,\n) -> [u8; 32] {\n let tag = get_app_tagging_secret_as_sender(sender, recipient).compute_tag(recipient);\n tag.to_be_bytes()\n}\n\n/// Returns the tagging secret for a given sender and recipient pair, siloed for the current contract address.\n/// Includes the last known index used to send a note tagged with this secret.\n/// For this to work, PXE must know the ivpsk_m of the sender.\n/// For the recipient's side, only the address is needed.\npub unconstrained fn get_app_tagging_secret_as_sender(\n sender: AztecAddress,\n recipient: AztecAddress,\n) -> IndexedTaggingSecret {\n let result = get_app_tagging_secret_as_sender_oracle(sender, recipient);\n IndexedTaggingSecret::deserialize(result)\n}\n\n#[oracle(getAppTaggingSecretAsSender)]\nunconstrained fn get_app_tagging_secret_as_sender_oracle(\n _sender: AztecAddress,\n _recipient: AztecAddress,\n) -> [Field; INDEXED_TAGGING_SECRET_LENGTH] {}\n\n/// Notifies the simulator that a tag has been used in a note, and to therefore increment the associated index so that\n/// future notes get a different tag and can be discovered by the recipient.\n/// This change should only be persisted in a non-volatile database if the tagged log is found in an actual block -\n/// otherwise e.g. a reverting transaction can cause the sender to accidentally skip indices and later produce notes\n/// that are not found by the recipient.\npub fn increment_app_tagging_secret_index_as_sender(sender: AztecAddress, recipient: AztecAddress) {\n // This oracle call returns nothing: we only call it for its side effects. It is therefore always safe to call.\n unsafe {\n increment_app_tagging_secret_index_as_sender_wrapper(sender, recipient);\n }\n}\n\nunconstrained fn increment_app_tagging_secret_index_as_sender_wrapper(\n sender: AztecAddress,\n recipient: AztecAddress,\n) {\n increment_app_tagging_secret_index_as_sender_oracle(sender, recipient);\n}\n\n#[oracle(incrementAppTaggingSecretIndexAsSender)]\nunconstrained fn increment_app_tagging_secret_index_as_sender_oracle(\n _sender: AztecAddress,\n _recipient: AztecAddress,\n) {}\n\n/// Finds new notes that may have been sent to all registered accounts in PXE in the current contract and makes them available\n/// for later querying via the `get_notes` oracle.\npub fn sync_notes() {\n // This oracle call returns nothing: we only call it for its side effects. It is therefore always safe to call.\n unsafe {\n sync_notes_oracle_wrapper();\n }\n}\n\nunconstrained fn sync_notes_oracle_wrapper() {\n sync_notes_oracle();\n}\n\n#[oracle(syncNotes)]\nunconstrained fn sync_notes_oracle() {}\n"
|
|
4001
|
+
"109": {
|
|
4002
|
+
"path": "/usr/src/noir-projects/aztec-nr/aztec/src/context/private_context.nr",
|
|
4003
|
+
"source": "use crate::{\n context::{inputs::PrivateContextInputs, packed_returns::PackedReturns},\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 arguments,\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 header::get_header_at,\n key_validation_request::get_key_validation_request,\n logs::{emit_encrypted_event_log, emit_encrypted_note_log},\n returns::pack_returns,\n },\n};\nuse dep::protocol_types::{\n abis::{\n call_context::CallContext,\n function_selector::FunctionSelector,\n log_hash::{EncryptedLogHash, LogHash, NoteLogHash},\n max_block_number::MaxBlockNumber,\n note_hash::NoteHash,\n nullifier::Nullifier,\n private_call_request::PrivateCallRequest,\n private_circuit_public_inputs::PrivateCircuitPublicInputs,\n public_call_request::PublicCallRequest,\n read_request::ReadRequest,\n side_effect::Counted,\n validation_requests::{KeyValidationRequest, KeyValidationRequestAndGenerator},\n },\n address::{AztecAddress, EthAddress},\n constants::{\n MAX_CONTRACT_CLASS_LOGS_PER_CALL, MAX_ENCRYPTED_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_ENCRYPTED_LOGS_PER_CALL, MAX_NOTE_HASH_READ_REQUESTS_PER_CALL,\n MAX_NOTE_HASHES_PER_CALL, MAX_NULLIFIER_READ_REQUESTS_PER_CALL, MAX_NULLIFIERS_PER_CALL,\n MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL, PUBLIC_DISPATCH_SELECTOR,\n },\n header::Header,\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: Header,\n\n pub note_encrypted_logs_hashes: BoundedVec<NoteLogHash, MAX_NOTE_ENCRYPTED_LOGS_PER_CALL>,\n pub encrypted_logs_hashes: BoundedVec<EncryptedLogHash, MAX_ENCRYPTED_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 note_encrypted_logs_hashes: BoundedVec::new(),\n encrypted_logs_hashes: 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\n pub fn push_nullifier(&mut self, nullifier: Field) {\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 self.nullifiers.push(\n Nullifier {\n value: nullifier,\n note_hash: nullified_note_hash,\n counter: self.next_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_header(self) -> Header {\n self.historical_header\n }\n\n // Returns the header of an arbitrary block whose block number is less than or equal to the block number\n // of historical header.\n pub fn get_header_at(self, block_number: u32) -> Header {\n get_header_at(block_number, self)\n }\n\n pub fn set_return_hash(&mut self, returns_hasher: ArgsHasher) {\n pack_returns(returns_hasher.fields);\n self.return_hash = returns_hasher.hash();\n }\n\n pub fn finish(self) -> PrivateCircuitPublicInputs {\n PrivateCircuitPublicInputs {\n call_context: self.inputs.call_context,\n args_hash: self.args_hash,\n returns_hash: self.return_hash,\n min_revertible_side_effect_counter: self.min_revertible_side_effect_counter,\n is_fee_payer: self.is_fee_payer,\n max_block_number: self.max_block_number,\n note_hash_read_requests: self.note_hash_read_requests.storage(),\n nullifier_read_requests: self.nullifier_read_requests.storage(),\n key_validation_requests_and_generators: self\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 note_encrypted_logs_hashes: self.note_encrypted_logs_hashes.storage(),\n encrypted_logs_hashes: self.encrypted_logs_hashes.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 let request = unsafe { get_key_validation_request(pk_m_hash, key_index) };\n assert(request.pk_m.hash() == pk_m_hash);\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 // NB: A randomness value of 0 signals that the kernels should not mask the contract address\n // used in siloing later on e.g. 'handshaking' contract w/ known address.\n pub fn emit_raw_event_log_with_masked_address<let M: u32>(\n &mut self,\n randomness: Field,\n log: [u8; M],\n log_hash: Field,\n ) {\n let counter = self.next_counter();\n let contract_address = self.this_address();\n let len = log.len() as Field + 4;\n let side_effect = EncryptedLogHash { value: log_hash, counter, length: len, randomness };\n self.encrypted_logs_hashes.push(side_effect);\n\n emit_encrypted_event_log(contract_address, randomness, log, counter);\n }\n\n pub fn emit_raw_note_log<let M: u32>(\n &mut self,\n note_hash_counter: u32,\n log: [u8; M],\n log_hash: Field,\n ) {\n let counter = self.next_counter();\n let len = log.len() as Field + 4;\n let side_effect = NoteLogHash { value: log_hash, counter, length: len, note_hash_counter };\n self.note_encrypted_logs_hashes.push(side_effect);\n\n emit_encrypted_note_log(note_hash_counter, log, counter);\n }\n\n pub fn call_private_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT],\n ) -> PackedReturns {\n let args_hash = hash_args_array(args);\n arguments::pack_arguments_array(args);\n self.call_private_function_with_packed_args(\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 ) -> PackedReturns {\n let args_hash = hash_args_array(args);\n arguments::pack_arguments_array(args);\n self.call_private_function_with_packed_args(\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 ) -> PackedReturns {\n self.call_private_function_with_packed_args(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 ) -> PackedReturns {\n self.call_private_function_with_packed_args(contract_address, function_selector, 0, true)\n }\n\n pub fn call_private_function_with_packed_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n ) -> PackedReturns {\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n let start_side_effect_counter = self.side_effect_counter;\n\n // The oracle simulates the private call and returns the value of the side effects counter after execution of\n // the call (which means that end_side_effect_counter - start_side_effect_counter is the number of side effects\n // that took place), along with the hash of the return values. We validate these by requesting a private kernel\n // iteration in which the return values are constrained to hash to `returns_hash` and the side effects counter\n // 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 PackedReturns::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 arguments::pack_arguments_array(args);\n self.call_public_function_with_packed_args(\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 arguments::pack_arguments_array(args);\n self.call_public_function_with_packed_args(\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_packed_args(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_packed_args(contract_address, function_selector, 0, true)\n }\n\n pub fn call_public_function_with_packed_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n ) {\n let counter = self.next_counter();\n\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/8985): Fix this.\n // WARNING: This is insecure and should be temporary!\n // The oracle repacks 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 = enqueue_public_function_call_internal(\n contract_address,\n function_selector,\n args_hash,\n counter,\n is_static_call,\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 arguments::pack_arguments_array(args);\n self.set_public_teardown_function_with_packed_args(\n contract_address,\n function_selector,\n args_hash,\n false,\n )\n }\n\n pub fn set_public_teardown_function_with_packed_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n ) {\n let counter = self.next_counter();\n\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/8985): Fix this.\n // WARNING: This is insecure and should be temporary!\n // The oracle repacks 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 = set_public_teardown_function_call_internal(\n contract_address,\n function_selector,\n args_hash,\n counter,\n is_static_call,\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: Header::empty(),\n note_encrypted_logs_hashes: BoundedVec::new(),\n encrypted_logs_hashes: BoundedVec::new(),\n contract_class_logs_hashes: BoundedVec::new(),\n last_key_validation_requests: [Option::none(); NUM_KEY_TYPES],\n }\n }\n}\n"
|
|
4004
4004
|
},
|
|
4005
|
-
"
|
|
4006
|
-
"path": "/usr/src/noir-projects/aztec-nr/aztec/src/
|
|
4007
|
-
"source": "use dep::protocol_types::{abis::function_selector::FunctionSelector, address::AztecAddress};\n\n#[oracle(enqueuePublicFunctionCall)]\nunconstrained fn enqueue_public_function_call_oracle(\n _contract_address: AztecAddress,\n _function_selector: FunctionSelector,\n _args_hash: Field,\n _side_effect_counter: u32,\n _is_static_call: bool,\n) -> Field {}\n\npub unconstrained fn enqueue_public_function_call_internal(\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n side_effect_counter: u32,\n is_static_call: bool,\n) -> Field {\n enqueue_public_function_call_oracle(\n contract_address,\n function_selector,\n args_hash,\n side_effect_counter,\n is_static_call,\n )\n}\n\n#[oracle(setPublicTeardownFunctionCall)]\nunconstrained fn set_public_teardown_function_call_oracle(\n _contract_address: AztecAddress,\n _function_selector: FunctionSelector,\n _args_hash: Field,\n _side_effect_counter: u32,\n _is_static_call: bool,\n) -> Field {}\n\npub unconstrained fn set_public_teardown_function_call_internal(\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n side_effect_counter: u32,\n is_static_call: bool,\n) -> Field {\n set_public_teardown_function_call_oracle(\n contract_address,\n function_selector,\n args_hash,\n side_effect_counter,\n is_static_call,\n )\n}\n\npub fn notify_set_min_revertible_side_effect_counter(counter: u32) {\n unsafe { notify_set_min_revertible_side_effect_counter_oracle_wrapper(counter) };\n}\n\npub unconstrained fn notify_set_min_revertible_side_effect_counter_oracle_wrapper(counter: u32) {\n notify_set_min_revertible_side_effect_counter_oracle(counter);\n}\n\n#[oracle(notifySetMinRevertibleSideEffectCounter)]\nunconstrained fn notify_set_min_revertible_side_effect_counter_oracle(_counter: u32) {}\n"
|
|
4005
|
+
"110": {
|
|
4006
|
+
"path": "/usr/src/noir-projects/aztec-nr/aztec/src/context/public_context.nr",
|
|
4007
|
+
"source": "use crate::context::gas::GasOpts;\nuse crate::hash::{\n compute_l1_to_l2_message_hash, compute_l1_to_l2_message_nullifier, compute_secret_hash,\n};\nuse dep::protocol_types::abis::function_selector::FunctionSelector;\nuse dep::protocol_types::address::{AztecAddress, EthAddress};\nuse dep::protocol_types::constants::MAX_FIELD_VALUE;\nuse dep::protocol_types::traits::{Deserialize, Empty, Serialize};\n\npub struct PublicContext {\n pub args_hash: Option<Field>,\n pub compute_args_hash: fn() -> Field,\n}\n\nimpl PublicContext {\n pub fn new(compute_args_hash: fn() -> Field) -> Self {\n PublicContext { args_hash: Option::none(), compute_args_hash }\n }\n\n pub fn emit_unencrypted_log<T, let N: u32>(_self: &mut Self, log: T)\n where\n T: Serialize<N>,\n {\n // AVM opcodes are constrained by the AVM itself\n unsafe { emit_unencrypted_log(Serialize::serialize(log).as_slice()) };\n }\n\n pub fn note_hash_exists(_self: Self, note_hash: Field, leaf_index: Field) -> bool {\n // AVM opcodes are constrained by the AVM itself\n unsafe { note_hash_exists(note_hash, leaf_index) } == 1\n }\n\n pub fn l1_to_l2_msg_exists(_self: Self, msg_hash: Field, msg_leaf_index: Field) -> bool {\n // AVM opcodes are constrained by the AVM itself\n unsafe { l1_to_l2_msg_exists(msg_hash, msg_leaf_index) } == 1\n }\n\n pub fn nullifier_exists(_self: Self, unsiloed_nullifier: Field, address: AztecAddress) -> bool {\n // AVM opcodes are constrained by the AVM itself\n unsafe { nullifier_exists(unsiloed_nullifier, address.to_field()) } == 1\n }\n\n pub fn consume_l1_to_l2_message(\n &mut self,\n content: Field,\n secret: Field,\n sender: EthAddress,\n leaf_index: Field,\n ) {\n let secret_hash = compute_secret_hash(secret);\n let message_hash = compute_l1_to_l2_message_hash(\n sender,\n self.chain_id(),\n /*recipient=*/\n self.this_address(),\n self.version(),\n content,\n secret_hash,\n leaf_index,\n );\n let nullifier = compute_l1_to_l2_message_nullifier(message_hash, secret);\n\n assert(\n !self.nullifier_exists(nullifier, self.this_address()),\n \"L1-to-L2 message is already nullified\",\n );\n assert(\n self.l1_to_l2_msg_exists(message_hash, leaf_index),\n \"Tried to consume nonexistent L1-to-L2 message\",\n );\n\n self.push_nullifier(nullifier);\n }\n\n pub fn message_portal(_self: &mut Self, recipient: EthAddress, content: Field) {\n // AVM opcodes are constrained by the AVM itself\n unsafe { send_l2_to_l1_msg(recipient, content) };\n }\n\n pub unconstrained fn call_public_function(\n _self: &mut Self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field],\n gas_opts: GasOpts,\n ) -> [Field] {\n let args = args.push_front(function_selector.to_field());\n let success = call(gas_for_call(gas_opts), contract_address, args);\n\n let result_data = returndata_copy(0, returndata_size());\n if !success {\n // Rethrow the revert data.\n avm_revert(result_data);\n }\n result_data\n }\n\n pub unconstrained fn static_call_public_function(\n _self: &mut Self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field],\n gas_opts: GasOpts,\n ) -> [Field] {\n let args = args.push_front(function_selector.to_field());\n let success = call_static(gas_for_call(gas_opts), contract_address, args);\n\n let result_data = returndata_copy(0, returndata_size());\n if !success {\n // Rethrow the revert data.\n avm_revert(result_data);\n }\n result_data\n }\n\n pub fn push_note_hash(_self: &mut Self, note_hash: Field) {\n // AVM opcodes are constrained by the AVM itself\n unsafe { emit_note_hash(note_hash) };\n }\n pub fn push_nullifier(_self: &mut Self, nullifier: Field) {\n // AVM opcodes are constrained by the AVM itself\n unsafe { emit_nullifier(nullifier) };\n }\n\n pub fn this_address(_self: Self) -> AztecAddress {\n // AVM opcodes are constrained by the AVM itself\n unsafe {\n address()\n }\n }\n pub fn msg_sender(_self: Self) -> AztecAddress {\n // AVM opcodes are constrained by the AVM itself\n unsafe {\n sender()\n }\n }\n pub fn selector(_self: Self) -> FunctionSelector {\n // The selector is the first element of the calldata when calling a public function through dispatch.\n // AVM opcodes are constrained by the AVM itself.\n let raw_selector: [Field; 1] = unsafe { calldata_copy(0, 1) };\n FunctionSelector::from_field(raw_selector[0])\n }\n pub fn get_args_hash(mut self) -> Field {\n if !self.args_hash.is_some() {\n self.args_hash = Option::some((self.compute_args_hash)());\n }\n\n self.args_hash.unwrap_unchecked()\n }\n pub fn transaction_fee(_self: Self) -> Field {\n // AVM opcodes are constrained by the AVM itself\n unsafe {\n transaction_fee()\n }\n }\n\n pub fn chain_id(_self: Self) -> Field {\n // AVM opcodes are constrained by the AVM itself\n unsafe {\n chain_id()\n }\n }\n pub fn version(_self: Self) -> Field {\n // AVM opcodes are constrained by the AVM itself\n unsafe {\n version()\n }\n }\n pub fn block_number(_self: Self) -> Field {\n // AVM opcodes are constrained by the AVM itself\n unsafe {\n block_number()\n }\n }\n pub fn timestamp(_self: Self) -> u64 {\n // AVM opcodes are constrained by the AVM itself\n unsafe {\n timestamp()\n }\n }\n pub fn fee_per_l2_gas(_self: Self) -> Field {\n // AVM opcodes are constrained by the AVM itself\n unsafe {\n fee_per_l2_gas()\n }\n }\n pub fn fee_per_da_gas(_self: Self) -> Field {\n // AVM opcodes are constrained by the AVM itself\n unsafe {\n fee_per_da_gas()\n }\n }\n\n pub fn l2_gas_left(_self: Self) -> Field {\n // AVM opcodes are constrained by the AVM itself\n unsafe {\n l2_gas_left()\n }\n }\n pub fn da_gas_left(_self: Self) -> Field {\n // AVM opcodes are constrained by the AVM itself\n unsafe {\n da_gas_left()\n }\n }\n pub fn is_static_call(_self: Self) -> bool {\n // AVM opcodes are constrained by the AVM itself\n unsafe { is_static_call() } == 1\n }\n\n pub fn raw_storage_read<let N: u32>(_self: Self, storage_slot: Field) -> [Field; N] {\n let mut out = [0; N];\n for i in 0..N {\n // AVM opcodes are constrained by the AVM itself\n out[i] = unsafe { storage_read(storage_slot + i as Field) };\n }\n out\n }\n\n pub fn storage_read<T, let N: u32>(self, storage_slot: Field) -> T\n where\n T: Deserialize<N>,\n {\n T::deserialize(self.raw_storage_read(storage_slot))\n }\n\n pub fn raw_storage_write<let N: u32>(_self: Self, storage_slot: Field, values: [Field; N]) {\n for i in 0..N {\n // AVM opcodes are constrained by the AVM itself\n unsafe { storage_write(storage_slot + i as Field, values[i]) };\n }\n }\n\n pub fn storage_write<T, let N: u32>(self, storage_slot: Field, value: T)\n where\n T: Serialize<N>,\n {\n self.raw_storage_write(storage_slot, value.serialize());\n }\n}\n\n// Helper functions\nfn gas_for_call(user_gas: GasOpts) -> [Field; 2] {\n // It's ok to use the max possible gas here, because the gas will be\n // capped by the gas left in the (STATIC)CALL instruction.\n [user_gas.l2_gas.unwrap_or(MAX_FIELD_VALUE), user_gas.da_gas.unwrap_or(MAX_FIELD_VALUE)]\n}\n\n// Unconstrained opcode wrappers (do not use directly).\nunconstrained fn address() -> AztecAddress {\n address_opcode()\n}\nunconstrained fn sender() -> AztecAddress {\n sender_opcode()\n}\n// TODO(9396): Remove.\nunconstrained fn portal() -> EthAddress {\n portal_opcode()\n}\n// TODO(9396): Remove.\n//unconstrained fn function_selector() -> u32 {\n// function_selector_opcode()\n//}\nunconstrained fn transaction_fee() -> Field {\n transaction_fee_opcode()\n}\nunconstrained fn chain_id() -> Field {\n chain_id_opcode()\n}\nunconstrained fn version() -> Field {\n version_opcode()\n}\nunconstrained fn block_number() -> Field {\n block_number_opcode()\n}\nunconstrained fn timestamp() -> u64 {\n timestamp_opcode()\n}\nunconstrained fn fee_per_l2_gas() -> Field {\n fee_per_l2_gas_opcode()\n}\nunconstrained fn fee_per_da_gas() -> Field {\n fee_per_da_gas_opcode()\n}\nunconstrained fn l2_gas_left() -> Field {\n l2_gas_left_opcode()\n}\nunconstrained fn da_gas_left() -> Field {\n da_gas_left_opcode()\n}\nunconstrained fn is_static_call() -> Field {\n is_static_call_opcode()\n}\nunconstrained fn note_hash_exists(note_hash: Field, leaf_index: Field) -> u1 {\n note_hash_exists_opcode(note_hash, leaf_index)\n}\nunconstrained fn emit_note_hash(note_hash: Field) {\n emit_note_hash_opcode(note_hash)\n}\nunconstrained fn nullifier_exists(nullifier: Field, address: Field) -> u1 {\n nullifier_exists_opcode(nullifier, address)\n}\nunconstrained fn emit_nullifier(nullifier: Field) {\n emit_nullifier_opcode(nullifier)\n}\nunconstrained fn emit_unencrypted_log(message: [Field]) {\n emit_unencrypted_log_opcode(message)\n}\nunconstrained fn l1_to_l2_msg_exists(msg_hash: Field, msg_leaf_index: Field) -> u1 {\n l1_to_l2_msg_exists_opcode(msg_hash, msg_leaf_index)\n}\nunconstrained fn send_l2_to_l1_msg(recipient: EthAddress, content: Field) {\n send_l2_to_l1_msg_opcode(recipient, content)\n}\nunconstrained fn call(gas: [Field; 2], address: AztecAddress, args: [Field]) -> bool {\n call_opcode(gas, address, args)\n}\nunconstrained fn call_static(gas: [Field; 2], address: AztecAddress, args: [Field]) -> bool {\n call_static_opcode(gas, address, args)\n}\n\npub unconstrained fn calldata_copy<let N: u32>(cdoffset: u32, copy_size: u32) -> [Field; N] {\n calldata_copy_opcode(cdoffset, copy_size)\n}\n\nunconstrained fn returndata_size() -> u32 {\n returndata_size_opcode()\n}\n\nunconstrained fn returndata_copy(rdoffset: u32, copy_size: u32) -> [Field] {\n returndata_copy_opcode(rdoffset, copy_size)\n}\n\npub unconstrained fn avm_return(returndata: [Field]) {\n return_opcode(returndata)\n}\n\n// This opcode reverts using the exact data given. In general it should only be used\n// to do rethrows, where the revert data is the same as the original revert data.\n// For normal reverts, use Noir's `assert` which, on top of reverting, will also add\n// an error selector to the revert data.\nunconstrained fn avm_revert(revertdata: [Field]) {\n revert_opcode(revertdata)\n}\n\nunconstrained fn storage_read(storage_slot: Field) -> Field {\n storage_read_opcode(storage_slot)\n}\n\nunconstrained fn storage_write(storage_slot: Field, value: Field) {\n storage_write_opcode(storage_slot, value);\n}\n\nimpl Empty for PublicContext {\n fn empty() -> Self {\n PublicContext::new(|| 0)\n }\n}\n\n// AVM oracles (opcodes) follow, do not use directly.\n#[oracle(avmOpcodeAddress)]\nunconstrained fn address_opcode() -> AztecAddress {}\n\n#[oracle(avmOpcodeSender)]\nunconstrained fn sender_opcode() -> AztecAddress {}\n\n#[oracle(avmOpcodePortal)]\nunconstrained fn portal_opcode() -> EthAddress {}\n\n// TODO(9396): Remove.\n//#[oracle(avmOpcodeFunctionSelector)]\n//unconstrained fn function_selector_opcode() -> u32 {}\n\n#[oracle(avmOpcodeTransactionFee)]\nunconstrained fn transaction_fee_opcode() -> Field {}\n\n#[oracle(avmOpcodeChainId)]\nunconstrained fn chain_id_opcode() -> Field {}\n\n#[oracle(avmOpcodeVersion)]\nunconstrained fn version_opcode() -> Field {}\n\n#[oracle(avmOpcodeBlockNumber)]\nunconstrained fn block_number_opcode() -> Field {}\n\n#[oracle(avmOpcodeTimestamp)]\nunconstrained fn timestamp_opcode() -> u64 {}\n\n#[oracle(avmOpcodeFeePerL2Gas)]\nunconstrained fn fee_per_l2_gas_opcode() -> Field {}\n\n#[oracle(avmOpcodeFeePerDaGas)]\nunconstrained fn fee_per_da_gas_opcode() -> Field {}\n\n#[oracle(avmOpcodeL2GasLeft)]\nunconstrained fn l2_gas_left_opcode() -> Field {}\n\n#[oracle(avmOpcodeDaGasLeft)]\nunconstrained fn da_gas_left_opcode() -> Field {}\n\n#[oracle(avmOpcodeIsStaticCall)]\nunconstrained fn is_static_call_opcode() -> Field {}\n\n#[oracle(avmOpcodeNoteHashExists)]\nunconstrained fn note_hash_exists_opcode(note_hash: Field, leaf_index: Field) -> u1 {}\n\n#[oracle(avmOpcodeEmitNoteHash)]\nunconstrained fn emit_note_hash_opcode(note_hash: Field) {}\n\n#[oracle(avmOpcodeNullifierExists)]\nunconstrained fn nullifier_exists_opcode(nullifier: Field, address: Field) -> u1 {}\n\n#[oracle(avmOpcodeEmitNullifier)]\nunconstrained fn emit_nullifier_opcode(nullifier: Field) {}\n\n#[oracle(avmOpcodeEmitUnencryptedLog)]\nunconstrained fn emit_unencrypted_log_opcode(message: [Field]) {}\n\n#[oracle(avmOpcodeL1ToL2MsgExists)]\nunconstrained fn l1_to_l2_msg_exists_opcode(msg_hash: Field, msg_leaf_index: Field) -> u1 {}\n\n#[oracle(avmOpcodeSendL2ToL1Msg)]\nunconstrained fn send_l2_to_l1_msg_opcode(recipient: EthAddress, content: Field) {}\n\n#[oracle(avmOpcodeCalldataCopy)]\nunconstrained fn calldata_copy_opcode<let N: u32>(cdoffset: u32, copy_size: u32) -> [Field; N] {}\n\n#[oracle(avmOpcodeReturndataSize)]\nunconstrained fn returndata_size_opcode() -> u32 {}\n\n#[oracle(avmOpcodeReturndataCopy)]\nunconstrained fn returndata_copy_opcode(rdoffset: u32, copy_size: u32) -> [Field] {}\n\n#[oracle(avmOpcodeReturn)]\nunconstrained fn return_opcode(returndata: [Field]) {}\n\n// This opcode reverts using the exact data given. In general it should only be used\n// to do rethrows, where the revert data is the same as the original revert data.\n// For normal reverts, use Noir's `assert` which, on top of reverting, will also add\n// an error selector to the revert data.\n#[oracle(avmOpcodeRevert)]\nunconstrained fn revert_opcode(revertdata: [Field]) {}\n\n#[oracle(avmOpcodeCall)]\nunconstrained fn call_opcode(\n gas: [Field; 2], // gas allocation: [l2_gas, da_gas]\n address: AztecAddress,\n args: [Field],\n) -> bool {}\n\n#[oracle(avmOpcodeStaticCall)]\nunconstrained fn call_static_opcode(\n gas: [Field; 2], // gas allocation: [l2_gas, da_gas]\n address: AztecAddress,\n args: [Field],\n) -> bool {}\n\n#[oracle(avmOpcodeStorageRead)]\nunconstrained fn storage_read_opcode(storage_slot: Field) -> Field {}\n\n#[oracle(avmOpcodeStorageWrite)]\nunconstrained fn storage_write_opcode(storage_slot: Field, value: Field) {}\n"
|
|
4008
4008
|
},
|
|
4009
|
-
"
|
|
4010
|
-
"path": "/usr/src/noir-projects/aztec-nr/aztec/src/
|
|
4011
|
-
"source": "use dep::protocol_types::{\n constants::PUBLIC_DATA_TREE_HEIGHT, data::PublicDataTreeLeafPreimage, utils::arr_copy_slice,\n};\n\nglobal LEAF_PREIMAGE_LENGTH: u32 = 4;\nglobal PUBLIC_DATA_WITNESS: u32 = 45;\n\npub struct PublicDataWitness {\n pub index: Field,\n pub leaf_preimage: PublicDataTreeLeafPreimage,\n pub path: [Field; PUBLIC_DATA_TREE_HEIGHT],\n}\n\n#[oracle(getPublicDataTreeWitness)]\nunconstrained fn get_public_data_witness_oracle(\n _block_number: u32,\n _public_data_tree_index: Field,\n) -> [Field; PUBLIC_DATA_WITNESS] {}\n\npub unconstrained fn get_public_data_witness(\n block_number: u32,\n public_data_tree_index: Field,\n) -> PublicDataWitness {\n let fields = get_public_data_witness_oracle(block_number, public_data_tree_index);\n PublicDataWitness {\n index: fields[0],\n leaf_preimage: PublicDataTreeLeafPreimage {\n slot: fields[1],\n value: fields[2],\n next_index: fields[3] as u32,\n next_slot: fields[4],\n },\n path: arr_copy_slice(\n fields,\n [0; PUBLIC_DATA_TREE_HEIGHT],\n 1 + LEAF_PREIMAGE_LENGTH,\n ),\n }\n}\n"
|
|
4009
|
+
"112": {
|
|
4010
|
+
"path": "/usr/src/noir-projects/aztec-nr/aztec/src/context/call_interfaces.nr",
|
|
4011
|
+
"source": "use dep::protocol_types::{\n abis::function_selector::FunctionSelector, address::AztecAddress, traits::Deserialize,\n};\n\nuse crate::context::{gas::GasOpts, private_context::PrivateContext, public_context::PublicContext};\n\nuse crate::hash::hash_args;\nuse crate::oracle::arguments::pack_arguments;\n\npub trait CallInterface<let N: u32> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<N> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\npub struct PrivateCallInterface<let N: u32, T> {\n pub target_contract: AztecAddress,\n pub selector: FunctionSelector,\n pub name: str<N>,\n pub args_hash: Field,\n pub args: [Field],\n pub return_type: T,\n pub is_static: bool,\n}\n\nimpl<let N: u32, T> PrivateCallInterface<N, T> {\n pub fn call<let M: u32>(self, context: &mut PrivateContext) -> T\n where\n T: Deserialize<M>,\n {\n pack_arguments(self.args);\n let returns = context.call_private_function_with_packed_args(\n self.target_contract,\n self.selector,\n self.args_hash,\n false,\n );\n let unpacked: T = returns.unpack_into();\n unpacked\n }\n\n pub fn view<let M: u32>(self, context: &mut PrivateContext) -> T\n where\n T: Deserialize<M>,\n {\n pack_arguments(self.args);\n let returns = context.call_private_function_with_packed_args(\n self.target_contract,\n self.selector,\n self.args_hash,\n true,\n );\n returns.unpack_into()\n }\n}\n\nimpl<let N: u32> CallInterface<N> for PrivateVoidCallInterface<N> {}\n\npub struct PrivateVoidCallInterface<let N: u32> {\n pub target_contract: AztecAddress,\n pub selector: FunctionSelector,\n pub name: str<N>,\n pub args_hash: Field,\n pub args: [Field],\n pub return_type: (),\n pub is_static: bool,\n}\n\nimpl<let N: u32> PrivateVoidCallInterface<N> {\n pub fn call(self, context: &mut PrivateContext) {\n pack_arguments(self.args);\n context\n .call_private_function_with_packed_args(\n self.target_contract,\n self.selector,\n self.args_hash,\n false,\n )\n .assert_empty();\n }\n\n pub fn view(self, context: &mut PrivateContext) {\n pack_arguments(self.args);\n context\n .call_private_function_with_packed_args(\n self.target_contract,\n self.selector,\n self.args_hash,\n true,\n )\n .assert_empty();\n }\n}\n\nimpl<let N: u32, T> CallInterface<N> for PrivateStaticCallInterface<N, T> {}\n\npub struct PrivateStaticCallInterface<let N: u32, T> {\n pub target_contract: AztecAddress,\n pub selector: FunctionSelector,\n pub name: str<N>,\n pub args_hash: Field,\n pub args: [Field],\n pub return_type: T,\n pub is_static: bool,\n}\n\nimpl<let N: u32, T> PrivateStaticCallInterface<N, T> {\n pub fn view<let M: u32>(self, context: &mut PrivateContext) -> T\n where\n T: Deserialize<M>,\n {\n pack_arguments(self.args);\n let returns = context.call_private_function_with_packed_args(\n self.target_contract,\n self.selector,\n self.args_hash,\n true,\n );\n returns.unpack_into()\n }\n}\n\nimpl<let N: u32> CallInterface<N> for PrivateStaticVoidCallInterface<N> {}\n\npub struct PrivateStaticVoidCallInterface<let N: u32> {\n pub target_contract: AztecAddress,\n pub selector: FunctionSelector,\n pub name: str<N>,\n pub args_hash: Field,\n pub args: [Field],\n pub return_type: (),\n pub is_static: bool,\n}\n\nimpl<let N: u32> PrivateStaticVoidCallInterface<N> {\n pub fn view(self, context: &mut PrivateContext) {\n pack_arguments(self.args);\n context\n .call_private_function_with_packed_args(\n self.target_contract,\n self.selector,\n self.args_hash,\n true,\n )\n .assert_empty();\n }\n}\n\nimpl<let N: u32, T> CallInterface<N> for PublicCallInterface<N, T> {}\n\npub struct PublicCallInterface<let N: u32, T> {\n pub target_contract: AztecAddress,\n pub selector: FunctionSelector,\n pub name: str<N>,\n pub args: [Field],\n pub gas_opts: GasOpts,\n pub return_type: T,\n pub is_static: bool,\n}\n\nimpl<let N: u32, T> PublicCallInterface<N, T> {\n pub fn with_gas(self: &mut Self, gas_opts: GasOpts) -> &mut Self {\n self.gas_opts = gas_opts;\n self\n }\n\n pub unconstrained fn call<let M: u32>(self, context: &mut PublicContext) -> T\n where\n T: Deserialize<M>,\n {\n let returns = context.call_public_function(\n self.target_contract,\n self.selector,\n self.args,\n self.gas_opts,\n );\n Deserialize::deserialize(returns.as_array::<M>())\n }\n\n pub unconstrained fn view<let M: u32>(self, context: &mut PublicContext) -> T\n where\n T: Deserialize<M>,\n {\n let returns = context.static_call_public_function(\n self.target_contract,\n self.selector,\n self.args,\n self.gas_opts,\n );\n Deserialize::deserialize(returns.as_array::<M>())\n }\n\n pub fn enqueue(self, context: &mut PrivateContext) {\n let args_hash = hash_args(self.args);\n pack_arguments(self.args);\n context.call_public_function_with_packed_args(\n self.target_contract,\n self.selector,\n args_hash,\n /*static=*/\n false,\n )\n }\n\n pub fn enqueue_view(self, context: &mut PrivateContext) {\n let args_hash = hash_args(self.args);\n pack_arguments(self.args);\n context.call_public_function_with_packed_args(\n self.target_contract,\n self.selector,\n args_hash,\n /*static=*/\n true,\n )\n }\n}\n\nimpl<let N: u32> CallInterface<N> for PublicVoidCallInterface<N> {}\n\npub struct PublicVoidCallInterface<let N: u32> {\n pub target_contract: AztecAddress,\n pub selector: FunctionSelector,\n pub name: str<N>,\n pub args: [Field],\n pub return_type: (),\n pub is_static: bool,\n pub gas_opts: GasOpts,\n}\n\nimpl<let N: u32> PublicVoidCallInterface<N> {\n pub fn with_gas(self: &mut Self, gas_opts: GasOpts) -> &mut Self {\n self.gas_opts = gas_opts;\n self\n }\n\n pub unconstrained fn call(self, context: &mut PublicContext) {\n let returns = context.call_public_function(\n self.target_contract,\n self.selector,\n self.args,\n self.gas_opts,\n );\n assert(returns.len() == 0);\n }\n\n pub unconstrained fn view(self, context: &mut PublicContext) {\n let returns = context.static_call_public_function(\n self.target_contract,\n self.selector,\n self.args,\n self.gas_opts,\n );\n assert(returns.len() == 0);\n }\n\n pub fn enqueue(self, context: &mut PrivateContext) {\n let args_hash = hash_args(self.args);\n pack_arguments(self.args);\n context.call_public_function_with_packed_args(\n self.target_contract,\n self.selector,\n args_hash,\n /*static=*/\n false,\n )\n }\n\n pub fn enqueue_view(self, context: &mut PrivateContext) {\n let args_hash = hash_args(self.args);\n pack_arguments(self.args);\n context.call_public_function_with_packed_args(\n self.target_contract,\n self.selector,\n args_hash,\n /*static=*/\n true,\n )\n }\n}\n\nimpl<let N: u32, T> CallInterface<N> for PublicStaticCallInterface<N, T> {}\n\npub struct PublicStaticCallInterface<let N: u32, T> {\n pub target_contract: AztecAddress,\n pub selector: FunctionSelector,\n pub name: str<N>,\n pub args: [Field],\n pub return_type: T,\n pub is_static: bool,\n pub gas_opts: GasOpts,\n}\n\nimpl<let N: u32, T> PublicStaticCallInterface<N, T> {\n pub fn with_gas(self: &mut Self, gas_opts: GasOpts) -> &mut Self {\n self.gas_opts = gas_opts;\n self\n }\n\n pub unconstrained fn view<let M: u32>(self, context: &mut PublicContext) -> T\n where\n T: Deserialize<M>,\n {\n let returns = context.static_call_public_function(\n self.target_contract,\n self.selector,\n self.args,\n self.gas_opts,\n );\n Deserialize::deserialize(returns.as_array::<M>())\n }\n\n pub fn enqueue_view(self, context: &mut PrivateContext) {\n let args_hash = hash_args(self.args);\n pack_arguments(self.args);\n context.call_public_function_with_packed_args(\n self.target_contract,\n self.selector,\n args_hash,\n /*static=*/\n true,\n )\n }\n}\n\nimpl<let N: u32> CallInterface<N> for PublicStaticVoidCallInterface<N> {}\n\npub struct PublicStaticVoidCallInterface<let N: u32> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<N>,\n args: [Field],\n return_type: (),\n is_static: bool,\n gas_opts: GasOpts,\n}\n\nimpl<let N: u32> PublicStaticVoidCallInterface<N> {\n pub fn with_gas(self: &mut Self, gas_opts: GasOpts) -> &mut Self {\n self.gas_opts = gas_opts;\n self\n }\n\n pub unconstrained fn view(self, context: &mut PublicContext) {\n let returns = context.static_call_public_function(\n self.target_contract,\n self.selector,\n self.args,\n self.gas_opts,\n );\n assert(returns.len() == 0);\n }\n\n pub fn enqueue_view(self, context: &mut PrivateContext) {\n let args_hash = hash_args(self.args);\n pack_arguments(self.args);\n context.call_public_function_with_packed_args(\n self.target_contract,\n self.selector,\n args_hash,\n /*static=*/\n true,\n )\n }\n}\n"
|
|
4012
4012
|
},
|
|
4013
|
-
"
|
|
4014
|
-
"path": "/usr/src/noir-projects/aztec-nr/aztec/src/
|
|
4015
|
-
"source": "use dep::protocol_types::{\n address::AztecAddress, constants::
|
|
4013
|
+
"123": {
|
|
4014
|
+
"path": "/usr/src/noir-projects/aztec-nr/aztec/src/history/public_storage.nr",
|
|
4015
|
+
"source": "use dep::protocol_types::{\n address::AztecAddress, constants::GENERATOR_INDEX__PUBLIC_LEAF_INDEX,\n hash::poseidon2_hash_with_separator, header::Header, utils::field::full_field_less_than,\n};\nuse dep::protocol_types::merkle_tree::root::root_from_sibling_path;\n\nuse crate::oracle::get_public_data_witness::get_public_data_witness;\n\ntrait PublicStorageHistoricalRead {\n fn public_storage_historical_read(\n header: Header,\n storage_slot: Field,\n contract_address: AztecAddress,\n ) -> Field;\n}\n\nimpl PublicStorageHistoricalRead for Header {\n fn public_storage_historical_read(\n self,\n storage_slot: Field,\n contract_address: AztecAddress,\n ) -> Field {\n // 1) Compute the leaf index by siloing the storage slot with the contract address\n let public_data_tree_index = poseidon2_hash_with_separator(\n [contract_address.to_field(), storage_slot],\n GENERATOR_INDEX__PUBLIC_LEAF_INDEX,\n );\n\n // 2) Get the membership witness for the tree index.\n let witness = unsafe {\n get_public_data_witness(\n self.global_variables.block_number as u32,\n public_data_tree_index,\n )\n };\n\n // 3) The witness is made up of two parts: the preimage of the leaf and the proof that it exists in the tree.\n // We first prove that the witness is indeed valid for the public data tree, i.e. that the preimage is of a\n // value present in the tree. Note that `hash` returns not just the hash of the value but also the metadata\n // (slot, next index and next slot).\n assert(\n self.state.partial.public_data_tree.root\n == root_from_sibling_path(witness.leaf_preimage.hash(), witness.index, witness.path)\n ,\n \"Proving public value inclusion failed\",\n );\n\n // 4) Now that we know the preimage is valid, we determine the value that's represented by this tree entry. Here\n // we have two scenarios:\n // 1. The tree entry is initialized, and the value is the same as the one in the witness\n // 2. The entry was never initialized, and the value is default zero (the default)\n // The code below is based on the same checks in `validate_public_data_reads` in `base_rollup_inputs`.\n let preimage = witness.leaf_preimage;\n\n let is_less_than_slot = full_field_less_than(preimage.slot, public_data_tree_index);\n let is_next_greater_than =\n full_field_less_than(public_data_tree_index, preimage.next_slot);\n let is_max = ((preimage.next_index == 0) & (preimage.next_slot == 0));\n let is_in_range = is_less_than_slot & (is_next_greater_than | is_max);\n\n let value = if is_in_range {\n 0\n } else {\n assert_eq(\n preimage.slot,\n public_data_tree_index,\n \"Public data tree index doesn't match witness\",\n );\n preimage.value\n };\n\n value\n }\n}\n"
|
|
4016
|
+
},
|
|
4017
|
+
"128": {
|
|
4018
|
+
"path": "/usr/src/noir-projects/aztec-nr/aztec/src/oracle/notes.nr",
|
|
4019
|
+
"source": "use crate::note::{note_header::NoteHeader, note_interface::NoteInterface};\n\nuse dep::protocol_types::{\n address::AztecAddress,\n indexed_tagging_secret::{INDEXED_TAGGING_SECRET_LENGTH, IndexedTaggingSecret},\n utils::arr_copy_slice,\n};\n\n/// Notifies the simulator that a note has been created, so that it can be returned in future read requests in the same\n/// transaction. This note should only be added to the non-volatile database if found in an actual block.\npub fn notify_created_note<let N: u32>(\n storage_slot: Field,\n note_type_id: Field,\n serialized_note: [Field; N],\n note_hash: Field,\n counter: u32,\n) {\n // This oracle call returns nothing: we only call it for its side effects. It is therefore always safe to call.\n unsafe {\n notify_created_note_oracle_wrapper(\n storage_slot,\n note_type_id,\n serialized_note,\n note_hash,\n counter,\n )\n };\n}\n\n/// Notifies the simulator that a note has been nullified, so that it is no longer returned in future read requests in\n/// the same transaction. This note should only be removed to the non-volatile database if its nullifier is found in an\n/// actual block.\npub fn notify_nullified_note(nullifier: Field, note_hash: Field, counter: u32) {\n // This oracle call returns nothing: we only call it for its side effects. It is therefore always safe to call.\n unsafe { notify_nullified_note_oracle_wrapper(nullifier, note_hash, counter) };\n}\n\nunconstrained fn notify_created_note_oracle_wrapper<let N: u32>(\n storage_slot: Field,\n note_type_id: Field,\n serialized_note: [Field; N],\n note_hash: Field,\n counter: u32,\n) {\n let _ = notify_created_note_oracle(\n storage_slot,\n note_type_id,\n serialized_note,\n note_hash,\n counter,\n );\n}\n\n#[oracle(notifyCreatedNote)]\nunconstrained fn notify_created_note_oracle<let N: u32>(\n _storage_slot: Field,\n _note_type_id: Field,\n _serialized_note: [Field; N],\n _note_hash: Field,\n _counter: u32,\n) -> Field {}\n\nunconstrained fn notify_nullified_note_oracle_wrapper(\n nullifier: Field,\n note_hash: Field,\n counter: u32,\n) {\n let _ = notify_nullified_note_oracle(nullifier, note_hash, counter);\n}\n\n#[oracle(notifyNullifiedNote)]\nunconstrained fn notify_nullified_note_oracle(\n _nullifier: Field,\n _note_hash: Field,\n _counter: u32,\n) -> Field {}\n\n#[oracle(getNotes)]\nunconstrained fn get_notes_oracle<let N: u32, let S: u32>(\n _storage_slot: Field,\n _num_selects: u8,\n _select_by_indexes: [u8; N],\n _select_by_offsets: [u8; N],\n _select_by_lengths: [u8; N],\n _select_values: [Field; N],\n _select_comparators: [u8; N],\n _sort_by_indexes: [u8; N],\n _sort_by_offsets: [u8; N],\n _sort_by_lengths: [u8; N],\n _sort_order: [u8; N],\n _limit: u32,\n _offset: u32,\n _status: u8,\n _return_size: u32,\n _placeholder_fields: [Field; S],\n) -> [Field; S] {}\n\nunconstrained fn get_notes_oracle_wrapper<let N: u32, let S: u32>(\n storage_slot: Field,\n num_selects: u8,\n select_by_indexes: [u8; N],\n select_by_offsets: [u8; N],\n select_by_lengths: [u8; N],\n select_values: [Field; N],\n select_comparators: [u8; N],\n sort_by_indexes: [u8; N],\n sort_by_offsets: [u8; N],\n sort_by_lengths: [u8; N],\n sort_order: [u8; N],\n limit: u32,\n offset: u32,\n status: u8,\n mut placeholder_fields: [Field; S],\n) -> [Field; S] {\n let return_size = placeholder_fields.len() as u32;\n get_notes_oracle(\n storage_slot,\n num_selects,\n select_by_indexes,\n select_by_offsets,\n select_by_lengths,\n select_values,\n select_comparators,\n sort_by_indexes,\n sort_by_offsets,\n sort_by_lengths,\n sort_order,\n limit,\n offset,\n status,\n return_size,\n placeholder_fields,\n )\n}\n\npub unconstrained fn get_notes<Note, let N: u32, let M: u32, let S: u32, let NS: u32>(\n storage_slot: Field,\n num_selects: u8,\n select_by_indexes: [u8; M],\n select_by_offsets: [u8; M],\n select_by_lengths: [u8; M],\n select_values: [Field; M],\n select_comparators: [u8; M],\n sort_by_indexes: [u8; M],\n sort_by_offsets: [u8; M],\n sort_by_lengths: [u8; M],\n sort_order: [u8; M],\n limit: u32,\n offset: u32,\n status: u8,\n mut placeholder_opt_notes: [Option<Note>; S], // TODO: Remove it and use `limit` to initialize the note array.\n placeholder_fields: [Field; NS], // TODO: Remove it and use `limit` to initialize the note array.\n _placeholder_note_length: [Field; N], // Turbofish hack? Compiler breaks calculating read_offset unless we add this parameter\n) -> [Option<Note>; S]\nwhere\n Note: NoteInterface<N>,\n{\n sync_notes_oracle_wrapper();\n let fields = get_notes_oracle_wrapper(\n storage_slot,\n num_selects,\n select_by_indexes,\n select_by_offsets,\n select_by_lengths,\n select_values,\n select_comparators,\n sort_by_indexes,\n sort_by_offsets,\n sort_by_lengths,\n sort_order,\n limit,\n offset,\n status,\n placeholder_fields,\n );\n let num_notes = fields[0] as u32;\n let contract_address = AztecAddress::from_field(fields[1]);\n for i in 0..placeholder_opt_notes.len() {\n if i < num_notes {\n // lengths named as per typescript.\n let return_header_length: u32 = 2; // num_notes & contract_address.\n let extra_preimage_length: u32 = 2; // nonce & note_hash_counter.\n let read_offset: u32 = return_header_length + i * (N + extra_preimage_length);\n let nonce = fields[read_offset];\n let note_hash_counter = fields[read_offset + 1] as u32;\n let header = NoteHeader { contract_address, nonce, storage_slot, note_hash_counter };\n let serialized_note = arr_copy_slice(fields, [0; N], read_offset + 2);\n let mut note = Note::deserialize_content(serialized_note);\n note.set_header(header);\n placeholder_opt_notes[i] = Option::some(note);\n };\n }\n placeholder_opt_notes\n}\n\n/// Returns true if the nullifier exists. Note that a `true` value can be constrained by proving existence of the\n/// nullifier, but a `false` value should not be relied upon since other transactions may emit this nullifier before the\n/// current transaction is included in a block. While this might seem of little use at first, certain design patterns\n/// benefit from this abstraction (see e.g. `PrivateMutable`).\npub unconstrained fn check_nullifier_exists(inner_nullifier: Field) -> bool {\n check_nullifier_exists_oracle(inner_nullifier) == 1\n}\n\n#[oracle(checkNullifierExists)]\nunconstrained fn check_nullifier_exists_oracle(_inner_nullifier: Field) -> Field {}\n\n/// Same as `get_app_tagging_secret_as_sender`, except it returns the derived tag as an array of bytes, ready to be included in a\n/// log.\npub unconstrained fn get_app_tag_bytes_as_sender(\n sender: AztecAddress,\n recipient: AztecAddress,\n) -> [u8; 32] {\n let tag = get_app_tagging_secret_as_sender(sender, recipient).compute_tag(recipient);\n tag.to_be_bytes()\n}\n\n/// Returns the tagging secret for a given sender and recipient pair, siloed for the current contract address.\n/// Includes the last known index used to send a note tagged with this secret.\n/// For this to work, PXE must know the ivpsk_m of the sender.\n/// For the recipient's side, only the address is needed.\npub unconstrained fn get_app_tagging_secret_as_sender(\n sender: AztecAddress,\n recipient: AztecAddress,\n) -> IndexedTaggingSecret {\n let result = get_app_tagging_secret_as_sender_oracle(sender, recipient);\n IndexedTaggingSecret::deserialize(result)\n}\n\n#[oracle(getAppTaggingSecretAsSender)]\nunconstrained fn get_app_tagging_secret_as_sender_oracle(\n _sender: AztecAddress,\n _recipient: AztecAddress,\n) -> [Field; INDEXED_TAGGING_SECRET_LENGTH] {}\n\n/// Notifies the simulator that a tag has been used in a note, and to therefore increment the associated index so that\n/// future notes get a different tag and can be discovered by the recipient.\n/// This change should only be persisted in a non-volatile database if the tagged log is found in an actual block -\n/// otherwise e.g. a reverting transaction can cause the sender to accidentally skip indices and later produce notes\n/// that are not found by the recipient.\npub fn increment_app_tagging_secret_index_as_sender(sender: AztecAddress, recipient: AztecAddress) {\n // This oracle call returns nothing: we only call it for its side effects. It is therefore always safe to call.\n unsafe {\n increment_app_tagging_secret_index_as_sender_wrapper(sender, recipient);\n }\n}\n\nunconstrained fn increment_app_tagging_secret_index_as_sender_wrapper(\n sender: AztecAddress,\n recipient: AztecAddress,\n) {\n increment_app_tagging_secret_index_as_sender_oracle(sender, recipient);\n}\n\n#[oracle(incrementAppTaggingSecretIndexAsSender)]\nunconstrained fn increment_app_tagging_secret_index_as_sender_oracle(\n _sender: AztecAddress,\n _recipient: AztecAddress,\n) {}\n\n/// Finds new notes that may have been sent to all registered accounts in PXE in the current contract and makes them available\n/// for later querying via the `get_notes` oracle.\npub fn sync_notes() {\n // This oracle call returns nothing: we only call it for its side effects. It is therefore always safe to call.\n unsafe {\n sync_notes_oracle_wrapper();\n }\n}\n\nunconstrained fn sync_notes_oracle_wrapper() {\n sync_notes_oracle();\n}\n\n#[oracle(syncNotes)]\nunconstrained fn sync_notes_oracle() {}\n"
|
|
4016
4020
|
},
|
|
4017
|
-
"
|
|
4021
|
+
"134": {
|
|
4018
4022
|
"path": "/usr/src/noir-projects/aztec-nr/aztec/src/oracle/arguments.nr",
|
|
4019
4023
|
"source": "/// Notifies the simulator that `args` will later be used at some point during execution, referenced by their hash. This\n/// allows the simulator to know how to respond to this future request.\n///\n/// This is only used during private execution, since in public it is the VM itself that keeps track of arguments.\npub fn pack_arguments(args: [Field]) {\n // This oracle call returns nothing: we only call it for its side effects. It is therefore always safe to call. When\n // unpacking however the caller must check that the returned value is indeed the preimage.\n unsafe { pack_arguments_oracle_wrapper(args) };\n}\n\n/// Same as `pack_arguments`, but using arrays instead of slices.\npub fn pack_arguments_array<let N: u32>(args: [Field; N]) {\n // This oracle call returns nothing: we only call it for its side effects. It is therefore always safe to call. When\n // unpacking however the caller must check that the returned value is indeed the preimage.\n unsafe { pack_arguments_array_oracle_wrapper(args) };\n}\n\nunconstrained fn pack_arguments_oracle_wrapper(args: [Field]) {\n let _ = pack_arguments_oracle(args);\n}\n\nunconstrained fn pack_arguments_array_oracle_wrapper<let N: u32>(args: [Field; N]) {\n let _ = pack_arguments_array_oracle(args);\n}\n\n#[oracle(packArguments)]\nunconstrained fn pack_arguments_oracle(_args: [Field]) -> Field {}\n\n#[oracle(packArgumentsArray)]\nunconstrained fn pack_arguments_array_oracle<let N: u32>(_args: [Field; N]) -> Field {}\n"
|
|
4020
4024
|
},
|
|
4021
|
-
"
|
|
4022
|
-
"path": "/usr/src/noir-projects/aztec-nr/aztec/src/
|
|
4023
|
-
"source": "use
|
|
4025
|
+
"136": {
|
|
4026
|
+
"path": "/usr/src/noir-projects/aztec-nr/aztec/src/oracle/enqueue_public_function_call.nr",
|
|
4027
|
+
"source": "use dep::protocol_types::{abis::function_selector::FunctionSelector, address::AztecAddress};\n\n#[oracle(enqueuePublicFunctionCall)]\nunconstrained fn enqueue_public_function_call_oracle(\n _contract_address: AztecAddress,\n _function_selector: FunctionSelector,\n _args_hash: Field,\n _side_effect_counter: u32,\n _is_static_call: bool,\n) -> Field {}\n\npub unconstrained fn enqueue_public_function_call_internal(\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n side_effect_counter: u32,\n is_static_call: bool,\n) -> Field {\n enqueue_public_function_call_oracle(\n contract_address,\n function_selector,\n args_hash,\n side_effect_counter,\n is_static_call,\n )\n}\n\n#[oracle(setPublicTeardownFunctionCall)]\nunconstrained fn set_public_teardown_function_call_oracle(\n _contract_address: AztecAddress,\n _function_selector: FunctionSelector,\n _args_hash: Field,\n _side_effect_counter: u32,\n _is_static_call: bool,\n) -> Field {}\n\npub unconstrained fn set_public_teardown_function_call_internal(\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n side_effect_counter: u32,\n is_static_call: bool,\n) -> Field {\n set_public_teardown_function_call_oracle(\n contract_address,\n function_selector,\n args_hash,\n side_effect_counter,\n is_static_call,\n )\n}\n\npub fn notify_set_min_revertible_side_effect_counter(counter: u32) {\n unsafe { notify_set_min_revertible_side_effect_counter_oracle_wrapper(counter) };\n}\n\npub unconstrained fn notify_set_min_revertible_side_effect_counter_oracle_wrapper(counter: u32) {\n notify_set_min_revertible_side_effect_counter_oracle(counter);\n}\n\n#[oracle(notifySetMinRevertibleSideEffectCounter)]\nunconstrained fn notify_set_min_revertible_side_effect_counter_oracle(_counter: u32) {}\n"
|
|
4024
4028
|
},
|
|
4025
|
-
"
|
|
4026
|
-
"path": "/usr/src/noir-projects/aztec-nr/aztec/src/
|
|
4027
|
-
"source": "use
|
|
4029
|
+
"137": {
|
|
4030
|
+
"path": "/usr/src/noir-projects/aztec-nr/aztec/src/oracle/get_l1_to_l2_membership_witness.nr",
|
|
4031
|
+
"source": "use dep::protocol_types::{\n address::AztecAddress, constants::L1_TO_L2_MSG_TREE_HEIGHT, utils::arr_copy_slice,\n};\n\n/// Returns the leaf index and sibling path of an entry in the L1 to L2 messaging tree, which can then be used to prove\n/// its existence.\npub unconstrained fn get_l1_to_l2_membership_witness(\n contract_address: AztecAddress,\n message_hash: Field,\n secret: Field,\n) -> (Field, [Field; L1_TO_L2_MSG_TREE_HEIGHT]) {\n let returned_message =\n get_l1_to_l2_membership_witness_oracle(contract_address, message_hash, secret);\n let leaf_index = returned_message[0];\n let sibling_path = arr_copy_slice(returned_message, [0; L1_TO_L2_MSG_TREE_HEIGHT], 1);\n\n (leaf_index, sibling_path)\n}\n\n// Obtains membership witness (index and sibling path) for a message in the L1 to L2 message tree.\n#[oracle(getL1ToL2MembershipWitness)]\nunconstrained fn get_l1_to_l2_membership_witness_oracle(\n _contract_address: AztecAddress,\n _message_hash: Field,\n _secret: Field,\n) -> [Field; L1_TO_L2_MSG_TREE_HEIGHT + 1] {}\n"
|
|
4028
4032
|
},
|
|
4029
|
-
"
|
|
4030
|
-
"path": "/usr/src/noir-projects/aztec-nr/aztec/src/
|
|
4031
|
-
"source": "use
|
|
4033
|
+
"138": {
|
|
4034
|
+
"path": "/usr/src/noir-projects/aztec-nr/aztec/src/oracle/get_public_data_witness.nr",
|
|
4035
|
+
"source": "use dep::protocol_types::{\n constants::PUBLIC_DATA_TREE_HEIGHT, data::PublicDataTreeLeafPreimage, utils::arr_copy_slice,\n};\n\nglobal LEAF_PREIMAGE_LENGTH: u32 = 4;\nglobal PUBLIC_DATA_WITNESS: u32 = 45;\n\npub struct PublicDataWitness {\n pub index: Field,\n pub leaf_preimage: PublicDataTreeLeafPreimage,\n pub path: [Field; PUBLIC_DATA_TREE_HEIGHT],\n}\n\n#[oracle(getPublicDataTreeWitness)]\nunconstrained fn get_public_data_witness_oracle(\n _block_number: u32,\n _public_data_tree_index: Field,\n) -> [Field; PUBLIC_DATA_WITNESS] {}\n\npub unconstrained fn get_public_data_witness(\n block_number: u32,\n public_data_tree_index: Field,\n) -> PublicDataWitness {\n let fields = get_public_data_witness_oracle(block_number, public_data_tree_index);\n PublicDataWitness {\n index: fields[0],\n leaf_preimage: PublicDataTreeLeafPreimage {\n slot: fields[1],\n value: fields[2],\n next_index: fields[3] as u32,\n next_slot: fields[4],\n },\n path: arr_copy_slice(\n fields,\n [0; PUBLIC_DATA_TREE_HEIGHT],\n 1 + LEAF_PREIMAGE_LENGTH,\n ),\n }\n}\n"
|
|
4032
4036
|
},
|
|
4033
|
-
"
|
|
4034
|
-
"path": "/usr/src/noir-projects/aztec-nr/aztec/src/
|
|
4035
|
-
"source": "use
|
|
4037
|
+
"143": {
|
|
4038
|
+
"path": "/usr/src/noir-projects/aztec-nr/aztec/src/messaging.nr",
|
|
4039
|
+
"source": "use crate::{\n hash::{compute_l1_to_l2_message_hash, compute_l1_to_l2_message_nullifier, compute_secret_hash},\n oracle::get_l1_to_l2_membership_witness::get_l1_to_l2_membership_witness,\n};\n\nuse dep::protocol_types::{\n address::{AztecAddress, EthAddress},\n merkle_tree::root::root_from_sibling_path,\n};\n\npub fn process_l1_to_l2_message(\n l1_to_l2_root: Field,\n contract_address: AztecAddress,\n portal_contract_address: EthAddress,\n chain_id: Field,\n version: Field,\n content: Field,\n secret: Field,\n leaf_index: Field,\n) -> Field {\n let secret_hash = compute_secret_hash(secret);\n let message_hash = compute_l1_to_l2_message_hash(\n portal_contract_address,\n chain_id,\n contract_address,\n version,\n content,\n secret_hash,\n leaf_index,\n );\n\n // We prove that `message_hash` is in the tree by showing the derivation of the tree root, using a merkle path we\n // get from an oracle.\n let (_leaf_index, sibling_path) =\n unsafe { get_l1_to_l2_membership_witness(contract_address, message_hash, secret) };\n\n let root = root_from_sibling_path(message_hash, leaf_index, sibling_path);\n assert(root == l1_to_l2_root, \"Message not in state\");\n\n compute_l1_to_l2_message_nullifier(message_hash, secret)\n}\n"
|
|
4036
4040
|
},
|
|
4037
|
-
"
|
|
4041
|
+
"158": {
|
|
4038
4042
|
"path": "/usr/src/noir-projects/aztec-nr/aztec/src/hash.nr",
|
|
4039
4043
|
"source": "use crate::utils::to_bytes::{arr_to_be_bytes_arr, str_to_be_bytes_arr};\nuse dep::protocol_types::{\n address::{AztecAddress, EthAddress},\n constants::{\n GENERATOR_INDEX__FUNCTION_ARGS, GENERATOR_INDEX__MESSAGE_NULLIFIER,\n GENERATOR_INDEX__SECRET_HASH,\n },\n hash::{poseidon2_hash_with_separator, poseidon2_hash_with_separator_slice, sha256_to_field},\n point::Point,\n traits::Hash,\n};\n\npub use dep::protocol_types::hash::{compute_siloed_nullifier, pedersen_hash};\n\npub fn pedersen_commitment<let N: u32>(inputs: [Field; N], hash_index: u32) -> Point {\n std::hash::pedersen_commitment_with_separator(inputs, hash_index)\n}\n\npub fn compute_secret_hash(secret: Field) -> Field {\n poseidon2_hash_with_separator([secret], GENERATOR_INDEX__SECRET_HASH)\n}\n\npub fn compute_unencrypted_log_hash<let N: u32>(\n contract_address: AztecAddress,\n log: [u8; N],\n) -> Field {\n let mut hash_bytes = [0; N + 36];\n // Address is converted to 32 bytes in ts\n let address_bytes: [u8; 32] = contract_address.to_field().to_be_bytes();\n for i in 0..32 {\n hash_bytes[i] = address_bytes[i];\n }\n let len_bytes: [u8; 4] = (N as Field).to_be_bytes();\n for i in 0..4 {\n hash_bytes[32 + i] = len_bytes[i];\n }\n for i in 0..N {\n hash_bytes[36 + i] = log[i];\n }\n\n sha256_to_field(hash_bytes)\n}\n\npub fn compute_l1_to_l2_message_hash(\n sender: EthAddress,\n chain_id: Field,\n recipient: AztecAddress,\n version: Field,\n content: Field,\n secret_hash: Field,\n leaf_index: Field,\n) -> Field {\n let mut hash_bytes = [0 as u8; 224];\n let sender_bytes: [u8; 32] = sender.to_field().to_be_bytes();\n let chain_id_bytes: [u8; 32] = chain_id.to_be_bytes();\n let recipient_bytes: [u8; 32] = recipient.to_field().to_be_bytes();\n let version_bytes: [u8; 32] = version.to_be_bytes();\n let content_bytes: [u8; 32] = content.to_be_bytes();\n let secret_hash_bytes: [u8; 32] = secret_hash.to_be_bytes();\n let leaf_index_bytes: [u8; 32] = leaf_index.to_be_bytes();\n\n for i in 0..32 {\n hash_bytes[i] = sender_bytes[i];\n hash_bytes[i + 32] = chain_id_bytes[i];\n hash_bytes[i + 64] = recipient_bytes[i];\n hash_bytes[i + 96] = version_bytes[i];\n hash_bytes[i + 128] = content_bytes[i];\n hash_bytes[i + 160] = secret_hash_bytes[i];\n hash_bytes[i + 192] = leaf_index_bytes[i];\n }\n\n sha256_to_field(hash_bytes)\n}\n\n// The nullifier of a l1 to l2 message is the hash of the message salted with the secret\npub fn compute_l1_to_l2_message_nullifier(message_hash: Field, secret: Field) -> Field {\n poseidon2_hash_with_separator([message_hash, secret], GENERATOR_INDEX__MESSAGE_NULLIFIER)\n}\n\npub struct ArgsHasher {\n pub fields: [Field],\n}\n\nimpl Hash for ArgsHasher {\n fn hash(self) -> Field {\n hash_args(self.fields)\n }\n}\n\nimpl ArgsHasher {\n pub fn new() -> Self {\n Self { fields: [] }\n }\n\n pub fn add(&mut self, field: Field) {\n self.fields = self.fields.push_back(field);\n }\n\n pub fn add_multiple<let N: u32>(&mut self, fields: [Field; N]) {\n for i in 0..N {\n self.fields = self.fields.push_back(fields[i]);\n }\n }\n}\n\npub fn hash_args_array<let N: u32>(args: [Field; N]) -> Field {\n if args.len() == 0 {\n 0\n } else {\n poseidon2_hash_with_separator(args, GENERATOR_INDEX__FUNCTION_ARGS)\n }\n}\n\npub fn hash_args(args: [Field]) -> Field {\n if args.len() == 0 {\n 0\n } else {\n poseidon2_hash_with_separator_slice(args, GENERATOR_INDEX__FUNCTION_ARGS)\n }\n}\n\n#[test]\nunconstrained fn compute_var_args_hash() {\n let mut input = ArgsHasher::new();\n for i in 0..100 {\n input.add(i as Field);\n }\n let hash = input.hash();\n dep::std::println(hash);\n assert(hash == 0x19b0d74feb06ebde19edd85a28986c97063e84b3b351a8b666c7cac963ce655f);\n}\n\n#[test]\nunconstrained fn compute_unenc_log_hash_array() {\n let contract_address = AztecAddress::from_field(\n 0x233a3e0df23b2b15b324194cb4a151f26c0b7333250781d34cc269d85dc334c6,\n );\n let log = [\n 0x20660de09f35f876e3e69d227b2a35166ad05f09d82d06366ec9b6f65a51fec2,\n 0x1b52bfe3b8689761916f76dc3d38aa8810860db325cd39ca611eed980091f01c,\n 0x2e559c4045c378a56ad13b9edb1e8de4e7ad3b3aa35cc7ba9ec77f7a68fa43a4,\n 0x25d0f689c4a4178a29d59306f2675824d19be6d25e44fa03b03f49c263053dd2,\n 0x2d513a722d6f352dc0961f156afdc5e31495b9f0e35cb069261a8e55e2df67fd,\n ];\n let serialized_log = arr_to_be_bytes_arr(log);\n let hash = compute_unencrypted_log_hash(contract_address, serialized_log);\n assert(hash == 0x0095b2d17ab72f4b27a341f7ac63e49ec73935ae8c9181a0ac02023eb12f3284);\n}\n\n#[test]\nunconstrained fn compute_unenc_log_hash_addr() {\n let contract_address = AztecAddress::from_field(\n 0x233a3e0df23b2b15b324194cb4a151f26c0b7333250781d34cc269d85dc334c6,\n );\n let log = AztecAddress::from_field(\n 0x26aa302d4715fd8a687453cb26d616b0768027bd54bcae56b09d908ecd9f8303,\n );\n let serialized_log: [u8; 32] = log.to_field().to_be_bytes();\n let hash = compute_unencrypted_log_hash(contract_address, serialized_log);\n assert(hash == 0x0083ab647dfb26e7ddee90a0f4209d049d4660cab42000c544b986aaa84c55a3);\n}\n\n#[test]\nunconstrained fn compute_unenc_log_hash_str() {\n let contract_address = AztecAddress::from_field(\n 0x1b401e1146c5c507962287065c81f0ef7590adae3802c533d7549d6bf0a41bd8,\n );\n let log = \"dummy\";\n let serialized_log = str_to_be_bytes_arr(log);\n let hash = compute_unencrypted_log_hash(contract_address, serialized_log);\n assert(hash == 0x00629e88ebd6374f44aa6cfe07e251ecf07213ebc7267e8f6b578ae57ffd6c20);\n}\n\n#[test]\nunconstrained fn compute_unenc_log_hash_longer_str() {\n let contract_address = AztecAddress::from_field(\n 0x1b401e1146c5c507962287065c81f0ef7590adae3802c533d7549d6bf0a41bd8,\n );\n let log = \"Hello this is a string\";\n let serialized_log = str_to_be_bytes_arr(log);\n let hash = compute_unencrypted_log_hash(contract_address, serialized_log);\n assert(hash == 0x0098637962f7d34fa202b7ffad8a07a238c5d1fd897b82a108f7f467fa73b841);\n}\n"
|
|
4040
4044
|
},
|
|
4041
|
-
"
|
|
4042
|
-
"path": "/usr/src/noir-projects/aztec-nr/aztec/src/
|
|
4043
|
-
"source": "use crate::
|
|
4045
|
+
"186": {
|
|
4046
|
+
"path": "/usr/src/noir-projects/aztec-nr/aztec/src/state_vars/public_mutable.nr",
|
|
4047
|
+
"source": "use crate::context::{PublicContext, UnconstrainedContext};\nuse crate::state_vars::storage::Storage;\nuse dep::protocol_types::traits::{Deserialize, Serialize};\n\n// docs:start:public_mutable_struct\npub struct PublicMutable<T, Context> {\n context: Context,\n storage_slot: Field,\n}\n// docs:end:public_mutable_struct\n\nimpl<T, Context, let N: u32> Storage<T, N> for PublicMutable<T, Context>\nwhere\n T: Serialize<N> + Deserialize<N>,\n{}\n\nimpl<T, Context> PublicMutable<T, Context> {\n // docs:start:public_mutable_struct_new\n pub fn new(\n // Note: Passing the contexts to new(...) just to have an interface compatible with a Map.\n context: Context,\n storage_slot: Field,\n ) -> Self {\n assert(storage_slot != 0, \"Storage slot 0 not allowed. Storage slots must start from 1.\");\n PublicMutable { context, storage_slot }\n }\n // docs:end:public_mutable_struct_new\n}\n\nimpl<T, let T_SERIALIZED_LEN: u32> PublicMutable<T, &mut PublicContext>\nwhere\n T: Serialize<T_SERIALIZED_LEN> + Deserialize<T_SERIALIZED_LEN>,\n{\n // docs:start:public_mutable_struct_read\n pub fn read(self) -> T {\n self.context.storage_read(self.storage_slot)\n }\n // docs:end:public_mutable_struct_read\n\n // docs:start:public_mutable_struct_write\n pub fn write(self, value: T) {\n self.context.storage_write(self.storage_slot, value);\n }\n // docs:end:public_mutable_struct_write\n}\n\nimpl<T, let T_SERIALIZED_LEN: u32> PublicMutable<T, UnconstrainedContext>\nwhere\n T: Deserialize<T_SERIALIZED_LEN>,\n{\n pub unconstrained fn read(self) -> T {\n self.context.storage_read(self.storage_slot)\n }\n}\n"
|
|
4044
4048
|
},
|
|
4045
|
-
"
|
|
4046
|
-
"path": "/usr/src/noir-projects/aztec-nr/aztec/src/
|
|
4047
|
-
"source": "use crate::context::gas::GasOpts;\nuse crate::hash::{\n compute_l1_to_l2_message_hash, compute_l1_to_l2_message_nullifier, compute_secret_hash,\n};\nuse dep::protocol_types::abis::function_selector::FunctionSelector;\nuse dep::protocol_types::address::{AztecAddress, EthAddress};\nuse dep::protocol_types::constants::MAX_FIELD_VALUE;\nuse dep::protocol_types::traits::{Deserialize, Empty, Serialize};\n\npub struct PublicContext {\n pub args_hash: Option<Field>,\n pub compute_args_hash: fn() -> Field,\n}\n\nimpl PublicContext {\n pub fn new(compute_args_hash: fn() -> Field) -> Self {\n PublicContext { args_hash: Option::none(), compute_args_hash }\n }\n\n pub fn emit_unencrypted_log<T, let N: u32>(_self: &mut Self, log: T)\n where\n T: Serialize<N>,\n {\n // AVM opcodes are constrained by the AVM itself\n unsafe { emit_unencrypted_log(Serialize::serialize(log).as_slice()) };\n }\n\n pub fn note_hash_exists(_self: Self, note_hash: Field, leaf_index: Field) -> bool {\n // AVM opcodes are constrained by the AVM itself\n unsafe { note_hash_exists(note_hash, leaf_index) } == 1\n }\n\n pub fn l1_to_l2_msg_exists(_self: Self, msg_hash: Field, msg_leaf_index: Field) -> bool {\n // AVM opcodes are constrained by the AVM itself\n unsafe { l1_to_l2_msg_exists(msg_hash, msg_leaf_index) } == 1\n }\n\n pub fn nullifier_exists(_self: Self, unsiloed_nullifier: Field, address: AztecAddress) -> bool {\n // AVM opcodes are constrained by the AVM itself\n unsafe { nullifier_exists(unsiloed_nullifier, address.to_field()) } == 1\n }\n\n pub fn consume_l1_to_l2_message(\n &mut self,\n content: Field,\n secret: Field,\n sender: EthAddress,\n leaf_index: Field,\n ) {\n let secret_hash = compute_secret_hash(secret);\n let message_hash = compute_l1_to_l2_message_hash(\n sender,\n self.chain_id(),\n /*recipient=*/\n self.this_address(),\n self.version(),\n content,\n secret_hash,\n leaf_index,\n );\n let nullifier = compute_l1_to_l2_message_nullifier(message_hash, secret);\n\n assert(\n !self.nullifier_exists(nullifier, self.this_address()),\n \"L1-to-L2 message is already nullified\",\n );\n assert(\n self.l1_to_l2_msg_exists(message_hash, leaf_index),\n \"Tried to consume nonexistent L1-to-L2 message\",\n );\n\n self.push_nullifier(nullifier);\n }\n\n pub fn message_portal(_self: &mut Self, recipient: EthAddress, content: Field) {\n // AVM opcodes are constrained by the AVM itself\n unsafe { send_l2_to_l1_msg(recipient, content) };\n }\n\n pub unconstrained fn call_public_function(\n _self: &mut Self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field],\n gas_opts: GasOpts,\n ) -> [Field] {\n let args = args.push_front(function_selector.to_field());\n let success = call(gas_for_call(gas_opts), contract_address, args);\n\n let result_data = returndata_copy(0, returndata_size());\n if !success {\n // Rethrow the revert data.\n avm_revert(result_data);\n }\n result_data\n }\n\n pub unconstrained fn static_call_public_function(\n _self: &mut Self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field],\n gas_opts: GasOpts,\n ) -> [Field] {\n let args = args.push_front(function_selector.to_field());\n let success = call_static(gas_for_call(gas_opts), contract_address, args);\n\n let result_data = returndata_copy(0, returndata_size());\n if !success {\n // Rethrow the revert data.\n avm_revert(result_data);\n }\n result_data\n }\n\n pub fn push_note_hash(_self: &mut Self, note_hash: Field) {\n // AVM opcodes are constrained by the AVM itself\n unsafe { emit_note_hash(note_hash) };\n }\n pub fn push_nullifier(_self: &mut Self, nullifier: Field) {\n // AVM opcodes are constrained by the AVM itself\n unsafe { emit_nullifier(nullifier) };\n }\n\n pub fn this_address(_self: Self) -> AztecAddress {\n // AVM opcodes are constrained by the AVM itself\n unsafe {\n address()\n }\n }\n pub fn msg_sender(_self: Self) -> AztecAddress {\n // AVM opcodes are constrained by the AVM itself\n unsafe {\n sender()\n }\n }\n pub fn selector(_self: Self) -> FunctionSelector {\n // The selector is the first element of the calldata when calling a public function through dispatch.\n // AVM opcodes are constrained by the AVM itself.\n let raw_selector: [Field; 1] = unsafe { calldata_copy(0, 1) };\n FunctionSelector::from_field(raw_selector[0])\n }\n pub fn get_args_hash(mut self) -> Field {\n if !self.args_hash.is_some() {\n self.args_hash = Option::some((self.compute_args_hash)());\n }\n\n self.args_hash.unwrap_unchecked()\n }\n pub fn transaction_fee(_self: Self) -> Field {\n // AVM opcodes are constrained by the AVM itself\n unsafe {\n transaction_fee()\n }\n }\n\n pub fn chain_id(_self: Self) -> Field {\n // AVM opcodes are constrained by the AVM itself\n unsafe {\n chain_id()\n }\n }\n pub fn version(_self: Self) -> Field {\n // AVM opcodes are constrained by the AVM itself\n unsafe {\n version()\n }\n }\n pub fn block_number(_self: Self) -> Field {\n // AVM opcodes are constrained by the AVM itself\n unsafe {\n block_number()\n }\n }\n pub fn timestamp(_self: Self) -> u64 {\n // AVM opcodes are constrained by the AVM itself\n unsafe {\n timestamp()\n }\n }\n pub fn fee_per_l2_gas(_self: Self) -> Field {\n // AVM opcodes are constrained by the AVM itself\n unsafe {\n fee_per_l2_gas()\n }\n }\n pub fn fee_per_da_gas(_self: Self) -> Field {\n // AVM opcodes are constrained by the AVM itself\n unsafe {\n fee_per_da_gas()\n }\n }\n\n pub fn l2_gas_left(_self: Self) -> Field {\n // AVM opcodes are constrained by the AVM itself\n unsafe {\n l2_gas_left()\n }\n }\n pub fn da_gas_left(_self: Self) -> Field {\n // AVM opcodes are constrained by the AVM itself\n unsafe {\n da_gas_left()\n }\n }\n pub fn is_static_call(_self: Self) -> bool {\n // AVM opcodes are constrained by the AVM itself\n unsafe { is_static_call() } == 1\n }\n\n pub fn raw_storage_read<let N: u32>(_self: Self, storage_slot: Field) -> [Field; N] {\n let mut out = [0; N];\n for i in 0..N {\n // AVM opcodes are constrained by the AVM itself\n out[i] = unsafe { storage_read(storage_slot + i as Field) };\n }\n out\n }\n\n pub fn storage_read<T, let N: u32>(self, storage_slot: Field) -> T\n where\n T: Deserialize<N>,\n {\n T::deserialize(self.raw_storage_read(storage_slot))\n }\n\n pub fn raw_storage_write<let N: u32>(_self: Self, storage_slot: Field, values: [Field; N]) {\n for i in 0..N {\n // AVM opcodes are constrained by the AVM itself\n unsafe { storage_write(storage_slot + i as Field, values[i]) };\n }\n }\n\n pub fn storage_write<T, let N: u32>(self, storage_slot: Field, value: T)\n where\n T: Serialize<N>,\n {\n self.raw_storage_write(storage_slot, value.serialize());\n }\n}\n\n// Helper functions\nfn gas_for_call(user_gas: GasOpts) -> [Field; 2] {\n // It's ok to use the max possible gas here, because the gas will be\n // capped by the gas left in the (STATIC)CALL instruction.\n [user_gas.l2_gas.unwrap_or(MAX_FIELD_VALUE), user_gas.da_gas.unwrap_or(MAX_FIELD_VALUE)]\n}\n\n// Unconstrained opcode wrappers (do not use directly).\nunconstrained fn address() -> AztecAddress {\n address_opcode()\n}\nunconstrained fn sender() -> AztecAddress {\n sender_opcode()\n}\n// TODO(9396): Remove.\nunconstrained fn portal() -> EthAddress {\n portal_opcode()\n}\n// TODO(9396): Remove.\n//unconstrained fn function_selector() -> u32 {\n// function_selector_opcode()\n//}\nunconstrained fn transaction_fee() -> Field {\n transaction_fee_opcode()\n}\nunconstrained fn chain_id() -> Field {\n chain_id_opcode()\n}\nunconstrained fn version() -> Field {\n version_opcode()\n}\nunconstrained fn block_number() -> Field {\n block_number_opcode()\n}\nunconstrained fn timestamp() -> u64 {\n timestamp_opcode()\n}\nunconstrained fn fee_per_l2_gas() -> Field {\n fee_per_l2_gas_opcode()\n}\nunconstrained fn fee_per_da_gas() -> Field {\n fee_per_da_gas_opcode()\n}\nunconstrained fn l2_gas_left() -> Field {\n l2_gas_left_opcode()\n}\nunconstrained fn da_gas_left() -> Field {\n da_gas_left_opcode()\n}\nunconstrained fn is_static_call() -> Field {\n is_static_call_opcode()\n}\nunconstrained fn note_hash_exists(note_hash: Field, leaf_index: Field) -> u1 {\n note_hash_exists_opcode(note_hash, leaf_index)\n}\nunconstrained fn emit_note_hash(note_hash: Field) {\n emit_note_hash_opcode(note_hash)\n}\nunconstrained fn nullifier_exists(nullifier: Field, address: Field) -> u1 {\n nullifier_exists_opcode(nullifier, address)\n}\nunconstrained fn emit_nullifier(nullifier: Field) {\n emit_nullifier_opcode(nullifier)\n}\nunconstrained fn emit_unencrypted_log(message: [Field]) {\n emit_unencrypted_log_opcode(message)\n}\nunconstrained fn l1_to_l2_msg_exists(msg_hash: Field, msg_leaf_index: Field) -> u1 {\n l1_to_l2_msg_exists_opcode(msg_hash, msg_leaf_index)\n}\nunconstrained fn send_l2_to_l1_msg(recipient: EthAddress, content: Field) {\n send_l2_to_l1_msg_opcode(recipient, content)\n}\nunconstrained fn call(gas: [Field; 2], address: AztecAddress, args: [Field]) -> bool {\n call_opcode(gas, address, args)\n}\nunconstrained fn call_static(gas: [Field; 2], address: AztecAddress, args: [Field]) -> bool {\n call_static_opcode(gas, address, args)\n}\n\npub unconstrained fn calldata_copy<let N: u32>(cdoffset: u32, copy_size: u32) -> [Field; N] {\n calldata_copy_opcode(cdoffset, copy_size)\n}\n\nunconstrained fn returndata_size() -> u32 {\n returndata_size_opcode()\n}\n\nunconstrained fn returndata_copy(rdoffset: u32, copy_size: u32) -> [Field] {\n returndata_copy_opcode(rdoffset, copy_size)\n}\n\npub unconstrained fn avm_return(returndata: [Field]) {\n return_opcode(returndata)\n}\n\n// This opcode reverts using the exact data given. In general it should only be used\n// to do rethrows, where the revert data is the same as the original revert data.\n// For normal reverts, use Noir's `assert` which, on top of reverting, will also add\n// an error selector to the revert data.\nunconstrained fn avm_revert(revertdata: [Field]) {\n revert_opcode(revertdata)\n}\n\nunconstrained fn storage_read(storage_slot: Field) -> Field {\n storage_read_opcode(storage_slot)\n}\n\nunconstrained fn storage_write(storage_slot: Field, value: Field) {\n storage_write_opcode(storage_slot, value);\n}\n\nimpl Empty for PublicContext {\n fn empty() -> Self {\n PublicContext::new(|| 0)\n }\n}\n\n// AVM oracles (opcodes) follow, do not use directly.\n#[oracle(avmOpcodeAddress)]\nunconstrained fn address_opcode() -> AztecAddress {}\n\n#[oracle(avmOpcodeSender)]\nunconstrained fn sender_opcode() -> AztecAddress {}\n\n#[oracle(avmOpcodePortal)]\nunconstrained fn portal_opcode() -> EthAddress {}\n\n// TODO(9396): Remove.\n//#[oracle(avmOpcodeFunctionSelector)]\n//unconstrained fn function_selector_opcode() -> u32 {}\n\n#[oracle(avmOpcodeTransactionFee)]\nunconstrained fn transaction_fee_opcode() -> Field {}\n\n#[oracle(avmOpcodeChainId)]\nunconstrained fn chain_id_opcode() -> Field {}\n\n#[oracle(avmOpcodeVersion)]\nunconstrained fn version_opcode() -> Field {}\n\n#[oracle(avmOpcodeBlockNumber)]\nunconstrained fn block_number_opcode() -> Field {}\n\n#[oracle(avmOpcodeTimestamp)]\nunconstrained fn timestamp_opcode() -> u64 {}\n\n#[oracle(avmOpcodeFeePerL2Gas)]\nunconstrained fn fee_per_l2_gas_opcode() -> Field {}\n\n#[oracle(avmOpcodeFeePerDaGas)]\nunconstrained fn fee_per_da_gas_opcode() -> Field {}\n\n#[oracle(avmOpcodeL2GasLeft)]\nunconstrained fn l2_gas_left_opcode() -> Field {}\n\n#[oracle(avmOpcodeDaGasLeft)]\nunconstrained fn da_gas_left_opcode() -> Field {}\n\n#[oracle(avmOpcodeIsStaticCall)]\nunconstrained fn is_static_call_opcode() -> Field {}\n\n#[oracle(avmOpcodeNoteHashExists)]\nunconstrained fn note_hash_exists_opcode(note_hash: Field, leaf_index: Field) -> u1 {}\n\n#[oracle(avmOpcodeEmitNoteHash)]\nunconstrained fn emit_note_hash_opcode(note_hash: Field) {}\n\n#[oracle(avmOpcodeNullifierExists)]\nunconstrained fn nullifier_exists_opcode(nullifier: Field, address: Field) -> u1 {}\n\n#[oracle(avmOpcodeEmitNullifier)]\nunconstrained fn emit_nullifier_opcode(nullifier: Field) {}\n\n#[oracle(avmOpcodeEmitUnencryptedLog)]\nunconstrained fn emit_unencrypted_log_opcode(message: [Field]) {}\n\n#[oracle(avmOpcodeL1ToL2MsgExists)]\nunconstrained fn l1_to_l2_msg_exists_opcode(msg_hash: Field, msg_leaf_index: Field) -> u1 {}\n\n#[oracle(avmOpcodeSendL2ToL1Msg)]\nunconstrained fn send_l2_to_l1_msg_opcode(recipient: EthAddress, content: Field) {}\n\n#[oracle(avmOpcodeCalldataCopy)]\nunconstrained fn calldata_copy_opcode<let N: u32>(cdoffset: u32, copy_size: u32) -> [Field; N] {}\n\n#[oracle(avmOpcodeReturndataSize)]\nunconstrained fn returndata_size_opcode() -> u32 {}\n\n#[oracle(avmOpcodeReturndataCopy)]\nunconstrained fn returndata_copy_opcode(rdoffset: u32, copy_size: u32) -> [Field] {}\n\n#[oracle(avmOpcodeReturn)]\nunconstrained fn return_opcode(returndata: [Field]) {}\n\n// This opcode reverts using the exact data given. In general it should only be used\n// to do rethrows, where the revert data is the same as the original revert data.\n// For normal reverts, use Noir's `assert` which, on top of reverting, will also add\n// an error selector to the revert data.\n#[oracle(avmOpcodeRevert)]\nunconstrained fn revert_opcode(revertdata: [Field]) {}\n\n#[oracle(avmOpcodeCall)]\nunconstrained fn call_opcode(\n gas: [Field; 2], // gas allocation: [l2_gas, da_gas]\n address: AztecAddress,\n args: [Field],\n) -> bool {}\n\n#[oracle(avmOpcodeStaticCall)]\nunconstrained fn call_static_opcode(\n gas: [Field; 2], // gas allocation: [l2_gas, da_gas]\n address: AztecAddress,\n args: [Field],\n) -> bool {}\n\n#[oracle(avmOpcodeStorageRead)]\nunconstrained fn storage_read_opcode(storage_slot: Field) -> Field {}\n\n#[oracle(avmOpcodeStorageWrite)]\nunconstrained fn storage_write_opcode(storage_slot: Field, value: Field) {}\n"
|
|
4049
|
+
"189": {
|
|
4050
|
+
"path": "/usr/src/noir-projects/aztec-nr/aztec/src/state_vars/public_immutable.nr",
|
|
4051
|
+
"source": "use crate::{\n context::{PrivateContext, PublicContext, UnconstrainedContext},\n state_vars::storage::Storage,\n};\nuse dep::protocol_types::{\n constants::INITIALIZATION_SLOT_SEPARATOR,\n traits::{Deserialize, Serialize},\n};\n\n/// Stores an immutable value in public state which can be read from public, private and unconstrained execution\n/// contexts.\n// docs:start:public_immutable_struct\npub struct PublicImmutable<T, Context> {\n context: Context,\n storage_slot: Field,\n}\n// docs:end:public_immutable_struct\n\nimpl<T, Context, let N: u32> Storage<T, N> for PublicImmutable<T, Context>\nwhere\n T: Serialize<N> + Deserialize<N>,\n{}\n\nimpl<T, Context> PublicImmutable<T, Context> {\n // docs:start:public_immutable_struct_new\n pub fn new(\n // Note: Passing the contexts to new(...) just to have an interface compatible with a Map.\n context: Context,\n storage_slot: Field,\n ) -> Self {\n assert(storage_slot != 0, \"Storage slot 0 not allowed. Storage slots must start from 1.\");\n PublicImmutable { context, storage_slot }\n }\n // docs:end:public_immutable_struct_new\n}\n\nimpl<T, let T_SERIALIZED_LEN: u32> PublicImmutable<T, &mut PublicContext>\nwhere\n T: Serialize<T_SERIALIZED_LEN> + Deserialize<T_SERIALIZED_LEN>,\n{\n // docs:start:public_immutable_struct_write\n pub fn initialize(self, value: T) {\n // We check that the struct is not yet initialized by checking if the initialization slot is 0\n let initialization_slot = INITIALIZATION_SLOT_SEPARATOR + self.storage_slot;\n let init_field: Field = self.context.storage_read(initialization_slot);\n assert(init_field == 0, \"PublicImmutable already initialized\");\n\n // We populate the initialization slot with a non-zero value to indicate that the struct is initialized\n self.context.storage_write(initialization_slot, 0xdead);\n self.context.storage_write(self.storage_slot, value);\n }\n // docs:end:public_immutable_struct_write\n\n // Note that we don't access the context, but we do call oracles that are only available in public\n // docs:start:public_immutable_struct_read\n pub fn read(self) -> T {\n self.context.storage_read(self.storage_slot)\n }\n // docs:end:public_immutable_struct_read\n}\n\nimpl<T, let T_SERIALIZED_LEN: u32> PublicImmutable<T, UnconstrainedContext>\nwhere\n T: Serialize<T_SERIALIZED_LEN> + Deserialize<T_SERIALIZED_LEN>,\n{\n pub unconstrained fn read(self) -> T {\n self.context.storage_read(self.storage_slot)\n }\n}\n\nimpl<T, let T_SERIALIZED_LEN: u32> PublicImmutable<T, &mut PrivateContext>\nwhere\n T: Serialize<T_SERIALIZED_LEN> + Deserialize<T_SERIALIZED_LEN>,\n{\n pub fn read(self) -> T {\n let header = self.context.get_header();\n let mut fields = [0; T_SERIALIZED_LEN];\n\n for i in 0..fields.len() {\n fields[i] = header.public_storage_historical_read(\n self.storage_slot + i as Field,\n (*self.context).this_address(),\n );\n }\n T::deserialize(fields)\n }\n}\n"
|
|
4048
4052
|
},
|
|
4049
|
-
"
|
|
4050
|
-
"path": "/usr/src/noir-projects/aztec-nr/aztec/src/
|
|
4051
|
-
"source": "use crate::{\n context::{inputs::PrivateContextInputs, packed_returns::PackedReturns},\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 arguments,\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 header::get_header_at,\n key_validation_request::get_key_validation_request,\n logs::{emit_encrypted_event_log, emit_encrypted_note_log},\n returns::pack_returns,\n },\n};\nuse dep::protocol_types::{\n abis::{\n call_context::CallContext,\n function_selector::FunctionSelector,\n log_hash::{EncryptedLogHash, LogHash, NoteLogHash},\n max_block_number::MaxBlockNumber,\n note_hash::NoteHash,\n nullifier::Nullifier,\n private_call_request::PrivateCallRequest,\n private_circuit_public_inputs::PrivateCircuitPublicInputs,\n public_call_request::PublicCallRequest,\n read_request::ReadRequest,\n side_effect::Counted,\n validation_requests::{KeyValidationRequest, KeyValidationRequestAndGenerator},\n },\n address::{AztecAddress, EthAddress},\n constants::{\n MAX_CONTRACT_CLASS_LOGS_PER_CALL, MAX_ENCRYPTED_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_ENCRYPTED_LOGS_PER_CALL, MAX_NOTE_HASH_READ_REQUESTS_PER_CALL,\n MAX_NOTE_HASHES_PER_CALL, MAX_NULLIFIER_READ_REQUESTS_PER_CALL, MAX_NULLIFIERS_PER_CALL,\n MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL, PUBLIC_DISPATCH_SELECTOR,\n },\n header::Header,\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: Header,\n\n pub note_encrypted_logs_hashes: BoundedVec<NoteLogHash, MAX_NOTE_ENCRYPTED_LOGS_PER_CALL>,\n pub encrypted_logs_hashes: BoundedVec<EncryptedLogHash, MAX_ENCRYPTED_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 note_encrypted_logs_hashes: BoundedVec::new(),\n encrypted_logs_hashes: 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\n pub fn push_nullifier(&mut self, nullifier: Field) {\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 self.nullifiers.push(\n Nullifier {\n value: nullifier,\n note_hash: nullified_note_hash,\n counter: self.next_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_header(self) -> Header {\n self.historical_header\n }\n\n // Returns the header of an arbitrary block whose block number is less than or equal to the block number\n // of historical header.\n pub fn get_header_at(self, block_number: u32) -> Header {\n get_header_at(block_number, self)\n }\n\n pub fn set_return_hash(&mut self, returns_hasher: ArgsHasher) {\n pack_returns(returns_hasher.fields);\n self.return_hash = returns_hasher.hash();\n }\n\n pub fn finish(self) -> PrivateCircuitPublicInputs {\n PrivateCircuitPublicInputs {\n call_context: self.inputs.call_context,\n args_hash: self.args_hash,\n returns_hash: self.return_hash,\n min_revertible_side_effect_counter: self.min_revertible_side_effect_counter,\n is_fee_payer: self.is_fee_payer,\n max_block_number: self.max_block_number,\n note_hash_read_requests: self.note_hash_read_requests.storage(),\n nullifier_read_requests: self.nullifier_read_requests.storage(),\n key_validation_requests_and_generators: self\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 note_encrypted_logs_hashes: self.note_encrypted_logs_hashes.storage(),\n encrypted_logs_hashes: self.encrypted_logs_hashes.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 let request = unsafe { get_key_validation_request(pk_m_hash, key_index) };\n assert(request.pk_m.hash() == pk_m_hash);\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 // NB: A randomness value of 0 signals that the kernels should not mask the contract address\n // used in siloing later on e.g. 'handshaking' contract w/ known address.\n pub fn emit_raw_event_log_with_masked_address<let M: u32>(\n &mut self,\n randomness: Field,\n log: [u8; M],\n log_hash: Field,\n ) {\n let counter = self.next_counter();\n let contract_address = self.this_address();\n let len = log.len() as Field + 4;\n let side_effect = EncryptedLogHash { value: log_hash, counter, length: len, randomness };\n self.encrypted_logs_hashes.push(side_effect);\n\n emit_encrypted_event_log(contract_address, randomness, log, counter);\n }\n\n pub fn emit_raw_note_log<let M: u32>(\n &mut self,\n note_hash_counter: u32,\n log: [u8; M],\n log_hash: Field,\n ) {\n let counter = self.next_counter();\n let len = log.len() as Field + 4;\n let side_effect = NoteLogHash { value: log_hash, counter, length: len, note_hash_counter };\n self.note_encrypted_logs_hashes.push(side_effect);\n\n emit_encrypted_note_log(note_hash_counter, log, counter);\n }\n\n pub fn call_private_function<let ARGS_COUNT: u32>(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args: [Field; ARGS_COUNT],\n ) -> PackedReturns {\n let args_hash = hash_args_array(args);\n arguments::pack_arguments_array(args);\n self.call_private_function_with_packed_args(\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 ) -> PackedReturns {\n let args_hash = hash_args_array(args);\n arguments::pack_arguments_array(args);\n self.call_private_function_with_packed_args(\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 ) -> PackedReturns {\n self.call_private_function_with_packed_args(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 ) -> PackedReturns {\n self.call_private_function_with_packed_args(contract_address, function_selector, 0, true)\n }\n\n pub fn call_private_function_with_packed_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n ) -> PackedReturns {\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n let start_side_effect_counter = self.side_effect_counter;\n\n // The oracle simulates the private call and returns the value of the side effects counter after execution of\n // the call (which means that end_side_effect_counter - start_side_effect_counter is the number of side effects\n // that took place), along with the hash of the return values. We validate these by requesting a private kernel\n // iteration in which the return values are constrained to hash to `returns_hash` and the side effects counter\n // 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 PackedReturns::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 arguments::pack_arguments_array(args);\n self.call_public_function_with_packed_args(\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 arguments::pack_arguments_array(args);\n self.call_public_function_with_packed_args(\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_packed_args(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_packed_args(contract_address, function_selector, 0, true)\n }\n\n pub fn call_public_function_with_packed_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n ) {\n let counter = self.next_counter();\n\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/8985): Fix this.\n // WARNING: This is insecure and should be temporary!\n // The oracle repacks 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 = enqueue_public_function_call_internal(\n contract_address,\n function_selector,\n args_hash,\n counter,\n is_static_call,\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 arguments::pack_arguments_array(args);\n self.set_public_teardown_function_with_packed_args(\n contract_address,\n function_selector,\n args_hash,\n false,\n )\n }\n\n pub fn set_public_teardown_function_with_packed_args(\n &mut self,\n contract_address: AztecAddress,\n function_selector: FunctionSelector,\n args_hash: Field,\n is_static_call: bool,\n ) {\n let counter = self.next_counter();\n\n let mut is_static_call = is_static_call | self.inputs.call_context.is_static_call;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/8985): Fix this.\n // WARNING: This is insecure and should be temporary!\n // The oracle repacks 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 = set_public_teardown_function_call_internal(\n contract_address,\n function_selector,\n args_hash,\n counter,\n is_static_call,\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: Header::empty(),\n note_encrypted_logs_hashes: BoundedVec::new(),\n encrypted_logs_hashes: BoundedVec::new(),\n contract_class_logs_hashes: BoundedVec::new(),\n last_key_validation_requests: [Option::none(); NUM_KEY_TYPES],\n }\n }\n}\n"
|
|
4053
|
+
"190": {
|
|
4054
|
+
"path": "/usr/src/noir-projects/aztec-nr/aztec/src/state_vars/map.nr",
|
|
4055
|
+
"source": "use crate::state_vars::storage::Storage;\nuse dep::protocol_types::{\n storage::map::derive_storage_slot_in_map,\n traits::{Deserialize, Serialize, ToField},\n};\n\n// docs:start:map\npub struct Map<K, V, Context> {\n context: Context,\n storage_slot: Field,\n state_var_constructor: fn(Context, Field) -> V,\n}\n// docs:end:map\n\nimpl<K, T, Context, let N: u32> Storage<T, N> for Map<K, T, Context>\nwhere\n T: Serialize<N> + Deserialize<N>,\n{}\n\nimpl<K, V, Context> Map<K, V, Context> {\n // docs:start:new\n pub fn new(\n context: Context,\n storage_slot: Field,\n state_var_constructor: fn(Context, Field) -> V,\n ) -> Self {\n assert(storage_slot != 0, \"Storage slot 0 not allowed. Storage slots must start from 1.\");\n Map { context, storage_slot, state_var_constructor }\n }\n // docs:end:new\n\n // docs:start:at\n pub fn at(self, key: K) -> V\n where\n K: ToField,\n {\n // TODO(#1204): use a generator index for the storage slot\n let derived_storage_slot = derive_storage_slot_in_map(self.storage_slot, key);\n\n let state_var_constructor = self.state_var_constructor;\n state_var_constructor(self.context, derived_storage_slot)\n }\n // docs:end:at\n}\n"
|
|
4052
4056
|
},
|
|
4053
|
-
"
|
|
4054
|
-
"path": "/usr/src/noir-projects/
|
|
4055
|
-
"source": "use dep::protocol_types::{\n abis::function_selector::FunctionSelector, address::AztecAddress, traits::Deserialize,\n};\n\nuse crate::context::{gas::GasOpts, private_context::PrivateContext, public_context::PublicContext};\n\nuse crate::hash::hash_args;\nuse crate::oracle::arguments::pack_arguments;\n\npub trait CallInterface<let N: u32> {\n fn get_args(self) -> [Field] {\n self.args\n }\n\n fn get_selector(self) -> FunctionSelector {\n self.selector\n }\n\n fn get_name(self) -> str<N> {\n self.name\n }\n\n fn get_contract_address(self) -> AztecAddress {\n self.target_contract\n }\n\n fn get_is_static(self) -> bool {\n self.is_static\n }\n}\n\npub struct PrivateCallInterface<let N: u32, T> {\n pub target_contract: AztecAddress,\n pub selector: FunctionSelector,\n pub name: str<N>,\n pub args_hash: Field,\n pub args: [Field],\n pub return_type: T,\n pub is_static: bool,\n}\n\nimpl<let N: u32, T> PrivateCallInterface<N, T> {\n pub fn call<let M: u32>(self, context: &mut PrivateContext) -> T\n where\n T: Deserialize<M>,\n {\n pack_arguments(self.args);\n let returns = context.call_private_function_with_packed_args(\n self.target_contract,\n self.selector,\n self.args_hash,\n false,\n );\n let unpacked: T = returns.unpack_into();\n unpacked\n }\n\n pub fn view<let M: u32>(self, context: &mut PrivateContext) -> T\n where\n T: Deserialize<M>,\n {\n pack_arguments(self.args);\n let returns = context.call_private_function_with_packed_args(\n self.target_contract,\n self.selector,\n self.args_hash,\n true,\n );\n returns.unpack_into()\n }\n}\n\nimpl<let N: u32> CallInterface<N> for PrivateVoidCallInterface<N> {}\n\npub struct PrivateVoidCallInterface<let N: u32> {\n pub target_contract: AztecAddress,\n pub selector: FunctionSelector,\n pub name: str<N>,\n pub args_hash: Field,\n pub args: [Field],\n pub return_type: (),\n pub is_static: bool,\n}\n\nimpl<let N: u32> PrivateVoidCallInterface<N> {\n pub fn call(self, context: &mut PrivateContext) {\n pack_arguments(self.args);\n context\n .call_private_function_with_packed_args(\n self.target_contract,\n self.selector,\n self.args_hash,\n false,\n )\n .assert_empty();\n }\n\n pub fn view(self, context: &mut PrivateContext) {\n pack_arguments(self.args);\n context\n .call_private_function_with_packed_args(\n self.target_contract,\n self.selector,\n self.args_hash,\n true,\n )\n .assert_empty();\n }\n}\n\nimpl<let N: u32, T> CallInterface<N> for PrivateStaticCallInterface<N, T> {}\n\npub struct PrivateStaticCallInterface<let N: u32, T> {\n pub target_contract: AztecAddress,\n pub selector: FunctionSelector,\n pub name: str<N>,\n pub args_hash: Field,\n pub args: [Field],\n pub return_type: T,\n pub is_static: bool,\n}\n\nimpl<let N: u32, T> PrivateStaticCallInterface<N, T> {\n pub fn view<let M: u32>(self, context: &mut PrivateContext) -> T\n where\n T: Deserialize<M>,\n {\n pack_arguments(self.args);\n let returns = context.call_private_function_with_packed_args(\n self.target_contract,\n self.selector,\n self.args_hash,\n true,\n );\n returns.unpack_into()\n }\n}\n\nimpl<let N: u32> CallInterface<N> for PrivateStaticVoidCallInterface<N> {}\n\npub struct PrivateStaticVoidCallInterface<let N: u32> {\n pub target_contract: AztecAddress,\n pub selector: FunctionSelector,\n pub name: str<N>,\n pub args_hash: Field,\n pub args: [Field],\n pub return_type: (),\n pub is_static: bool,\n}\n\nimpl<let N: u32> PrivateStaticVoidCallInterface<N> {\n pub fn view(self, context: &mut PrivateContext) {\n pack_arguments(self.args);\n context\n .call_private_function_with_packed_args(\n self.target_contract,\n self.selector,\n self.args_hash,\n true,\n )\n .assert_empty();\n }\n}\n\nimpl<let N: u32, T> CallInterface<N> for PublicCallInterface<N, T> {}\n\npub struct PublicCallInterface<let N: u32, T> {\n pub target_contract: AztecAddress,\n pub selector: FunctionSelector,\n pub name: str<N>,\n pub args: [Field],\n pub gas_opts: GasOpts,\n pub return_type: T,\n pub is_static: bool,\n}\n\nimpl<let N: u32, T> PublicCallInterface<N, T> {\n pub fn with_gas(self: &mut Self, gas_opts: GasOpts) -> &mut Self {\n self.gas_opts = gas_opts;\n self\n }\n\n pub unconstrained fn call<let M: u32>(self, context: &mut PublicContext) -> T\n where\n T: Deserialize<M>,\n {\n let returns = context.call_public_function(\n self.target_contract,\n self.selector,\n self.args,\n self.gas_opts,\n );\n Deserialize::deserialize(returns.as_array::<M>())\n }\n\n pub unconstrained fn view<let M: u32>(self, context: &mut PublicContext) -> T\n where\n T: Deserialize<M>,\n {\n let returns = context.static_call_public_function(\n self.target_contract,\n self.selector,\n self.args,\n self.gas_opts,\n );\n Deserialize::deserialize(returns.as_array::<M>())\n }\n\n pub fn enqueue(self, context: &mut PrivateContext) {\n let args_hash = hash_args(self.args);\n pack_arguments(self.args);\n context.call_public_function_with_packed_args(\n self.target_contract,\n self.selector,\n args_hash,\n /*static=*/\n false,\n )\n }\n\n pub fn enqueue_view(self, context: &mut PrivateContext) {\n let args_hash = hash_args(self.args);\n pack_arguments(self.args);\n context.call_public_function_with_packed_args(\n self.target_contract,\n self.selector,\n args_hash,\n /*static=*/\n true,\n )\n }\n}\n\nimpl<let N: u32> CallInterface<N> for PublicVoidCallInterface<N> {}\n\npub struct PublicVoidCallInterface<let N: u32> {\n pub target_contract: AztecAddress,\n pub selector: FunctionSelector,\n pub name: str<N>,\n pub args: [Field],\n pub return_type: (),\n pub is_static: bool,\n pub gas_opts: GasOpts,\n}\n\nimpl<let N: u32> PublicVoidCallInterface<N> {\n pub fn with_gas(self: &mut Self, gas_opts: GasOpts) -> &mut Self {\n self.gas_opts = gas_opts;\n self\n }\n\n pub unconstrained fn call(self, context: &mut PublicContext) {\n let returns = context.call_public_function(\n self.target_contract,\n self.selector,\n self.args,\n self.gas_opts,\n );\n assert(returns.len() == 0);\n }\n\n pub unconstrained fn view(self, context: &mut PublicContext) {\n let returns = context.static_call_public_function(\n self.target_contract,\n self.selector,\n self.args,\n self.gas_opts,\n );\n assert(returns.len() == 0);\n }\n\n pub fn enqueue(self, context: &mut PrivateContext) {\n let args_hash = hash_args(self.args);\n pack_arguments(self.args);\n context.call_public_function_with_packed_args(\n self.target_contract,\n self.selector,\n args_hash,\n /*static=*/\n false,\n )\n }\n\n pub fn enqueue_view(self, context: &mut PrivateContext) {\n let args_hash = hash_args(self.args);\n pack_arguments(self.args);\n context.call_public_function_with_packed_args(\n self.target_contract,\n self.selector,\n args_hash,\n /*static=*/\n true,\n )\n }\n}\n\nimpl<let N: u32, T> CallInterface<N> for PublicStaticCallInterface<N, T> {}\n\npub struct PublicStaticCallInterface<let N: u32, T> {\n pub target_contract: AztecAddress,\n pub selector: FunctionSelector,\n pub name: str<N>,\n pub args: [Field],\n pub return_type: T,\n pub is_static: bool,\n pub gas_opts: GasOpts,\n}\n\nimpl<let N: u32, T> PublicStaticCallInterface<N, T> {\n pub fn with_gas(self: &mut Self, gas_opts: GasOpts) -> &mut Self {\n self.gas_opts = gas_opts;\n self\n }\n\n pub unconstrained fn view<let M: u32>(self, context: &mut PublicContext) -> T\n where\n T: Deserialize<M>,\n {\n let returns = context.static_call_public_function(\n self.target_contract,\n self.selector,\n self.args,\n self.gas_opts,\n );\n Deserialize::deserialize(returns.as_array::<M>())\n }\n\n pub fn enqueue_view(self, context: &mut PrivateContext) {\n let args_hash = hash_args(self.args);\n pack_arguments(self.args);\n context.call_public_function_with_packed_args(\n self.target_contract,\n self.selector,\n args_hash,\n /*static=*/\n true,\n )\n }\n}\n\nimpl<let N: u32> CallInterface<N> for PublicStaticVoidCallInterface<N> {}\n\npub struct PublicStaticVoidCallInterface<let N: u32> {\n target_contract: AztecAddress,\n selector: FunctionSelector,\n name: str<N>,\n args: [Field],\n return_type: (),\n is_static: bool,\n gas_opts: GasOpts,\n}\n\nimpl<let N: u32> PublicStaticVoidCallInterface<N> {\n pub fn with_gas(self: &mut Self, gas_opts: GasOpts) -> &mut Self {\n self.gas_opts = gas_opts;\n self\n }\n\n pub unconstrained fn view(self, context: &mut PublicContext) {\n let returns = context.static_call_public_function(\n self.target_contract,\n self.selector,\n self.args,\n self.gas_opts,\n );\n assert(returns.len() == 0);\n }\n\n pub fn enqueue_view(self, context: &mut PrivateContext) {\n let args_hash = hash_args(self.args);\n pack_arguments(self.args);\n context.call_public_function_with_packed_args(\n self.target_contract,\n self.selector,\n args_hash,\n /*static=*/\n true,\n )\n }\n}\n"
|
|
4057
|
+
"191": {
|
|
4058
|
+
"path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/type_serialization.nr",
|
|
4059
|
+
"source": "use crate::traits::{Deserialize, Serialize};\n\nglobal BOOL_SERIALIZED_LEN: u32 = 1;\nglobal U8_SERIALIZED_LEN: u32 = 1;\nglobal U16_SERIALIZED_LEN: u32 = 1;\nglobal U32_SERIALIZED_LEN: u32 = 1;\nglobal U64_SERIALIZED_LEN: u32 = 1;\nglobal U128_SERIALIZED_LEN: u32 = 1;\nglobal FIELD_SERIALIZED_LEN: u32 = 1;\nglobal I8_SERIALIZED_LEN: u32 = 1;\nglobal I16_SERIALIZED_LEN: u32 = 1;\nglobal I32_SERIALIZED_LEN: u32 = 1;\nglobal I64_SERIALIZED_LEN: u32 = 1;\n\nimpl Serialize<BOOL_SERIALIZED_LEN> for bool {\n fn serialize(self) -> [Field; BOOL_SERIALIZED_LEN] {\n [self as Field]\n }\n}\n\nimpl Deserialize<BOOL_SERIALIZED_LEN> for bool {\n fn deserialize(fields: [Field; BOOL_SERIALIZED_LEN]) -> bool {\n fields[0] as bool\n }\n}\n\nimpl Serialize<U8_SERIALIZED_LEN> for u8 {\n fn serialize(self) -> [Field; U8_SERIALIZED_LEN] {\n [self as Field]\n }\n}\n\nimpl Deserialize<U8_SERIALIZED_LEN> for u8 {\n fn deserialize(fields: [Field; U8_SERIALIZED_LEN]) -> Self {\n fields[0] as u8\n }\n}\n\nimpl Serialize<U16_SERIALIZED_LEN> for u16 {\n fn serialize(self) -> [Field; U16_SERIALIZED_LEN] {\n [self as Field]\n }\n}\n\nimpl Deserialize<U16_SERIALIZED_LEN> for u16 {\n fn deserialize(fields: [Field; U16_SERIALIZED_LEN]) -> Self {\n fields[0] as u16\n }\n}\n\nimpl Serialize<U32_SERIALIZED_LEN> for u32 {\n fn serialize(self) -> [Field; U32_SERIALIZED_LEN] {\n [self as Field]\n }\n}\n\nimpl Deserialize<U32_SERIALIZED_LEN> for u32 {\n fn deserialize(fields: [Field; U32_SERIALIZED_LEN]) -> Self {\n fields[0] as u32\n }\n}\n\nimpl Serialize<U64_SERIALIZED_LEN> for u64 {\n fn serialize(self) -> [Field; U64_SERIALIZED_LEN] {\n [self as Field]\n }\n}\n\nimpl Deserialize<U64_SERIALIZED_LEN> for u64 {\n fn deserialize(fields: [Field; U64_SERIALIZED_LEN]) -> Self {\n fields[0] as u64\n }\n}\n\nimpl Serialize<U128_SERIALIZED_LEN> for U128 {\n fn serialize(self) -> [Field; U128_SERIALIZED_LEN] {\n [self.to_integer()]\n }\n}\n\nimpl Deserialize<U128_SERIALIZED_LEN> for U128 {\n fn deserialize(fields: [Field; U128_SERIALIZED_LEN]) -> Self {\n U128::from_integer(fields[0])\n }\n}\n\nimpl Serialize<FIELD_SERIALIZED_LEN> for Field {\n fn serialize(self) -> [Field; FIELD_SERIALIZED_LEN] {\n [self]\n }\n}\n\nimpl Deserialize<FIELD_SERIALIZED_LEN> for Field {\n fn deserialize(fields: [Field; FIELD_SERIALIZED_LEN]) -> Self {\n fields[0]\n }\n}\n\nimpl Serialize<I8_SERIALIZED_LEN> for i8 {\n fn serialize(self) -> [Field; I8_SERIALIZED_LEN] {\n [self as Field]\n }\n}\n\nimpl Deserialize<I8_SERIALIZED_LEN> for i8 {\n fn deserialize(fields: [Field; I8_SERIALIZED_LEN]) -> Self {\n fields[0] as i8\n }\n}\n\nimpl Serialize<I16_SERIALIZED_LEN> for i16 {\n fn serialize(self) -> [Field; I16_SERIALIZED_LEN] {\n [self as Field]\n }\n}\n\nimpl Deserialize<I16_SERIALIZED_LEN> for i16 {\n fn deserialize(fields: [Field; I16_SERIALIZED_LEN]) -> Self {\n fields[0] as i16\n }\n}\n\nimpl Serialize<I32_SERIALIZED_LEN> for i32 {\n fn serialize(self) -> [Field; I32_SERIALIZED_LEN] {\n [self as Field]\n }\n}\n\nimpl Deserialize<I32_SERIALIZED_LEN> for i32 {\n fn deserialize(fields: [Field; I32_SERIALIZED_LEN]) -> Self {\n fields[0] as i32\n }\n}\n\nimpl Serialize<I64_SERIALIZED_LEN> for i64 {\n fn serialize(self) -> [Field; I64_SERIALIZED_LEN] {\n [self as Field]\n }\n}\n\nimpl Deserialize<I64_SERIALIZED_LEN> for i64 {\n fn deserialize(fields: [Field; I64_SERIALIZED_LEN]) -> Self {\n fields[0] as i64\n }\n}\n\nimpl<T, let N: u32, let M: u32> Serialize<N * M> for [T; N]\nwhere\n T: Serialize<M>,\n{\n fn serialize(self) -> [Field; N * M] {\n let mut result: [Field; N * M] = std::mem::zeroed();\n let mut serialized: [Field; M] = std::mem::zeroed();\n for i in 0..N {\n serialized = self[i].serialize();\n for j in 0..M {\n result[i * M + j] = serialized[j];\n }\n }\n result\n }\n}\n\nimpl<T, let N: u32, let M: u32> Deserialize<N * M> for [T; N]\nwhere\n T: Deserialize<M>,\n{\n fn deserialize(fields: [Field; N * M]) -> Self {\n let mut reader = crate::utils::reader::Reader::new(fields);\n let mut result: [T; N] = std::mem::zeroed();\n reader.read_struct_array::<T, M, N>(Deserialize::deserialize, result)\n }\n}\n\n#[test]\nfn test_u16_serialization() {\n let a: u16 = 10;\n assert_eq(a, u16::deserialize(a.serialize()));\n}\n\n#[test]\nfn test_i8_serialization() {\n let a: i8 = -10;\n assert_eq(a, i8::deserialize(a.serialize()));\n}\n\n#[test]\nfn test_i16_serialization() {\n let a: i16 = -10;\n assert_eq(a, i16::deserialize(a.serialize()));\n}\n\n#[test]\nfn test_i32_serialization() {\n let a: i32 = -10;\n assert_eq(a, i32::deserialize(a.serialize()));\n}\n\n#[test]\nfn test_i64_serialization() {\n let a: i64 = -10;\n assert_eq(a, i64::deserialize(a.serialize()));\n}\n"
|
|
4056
4060
|
},
|
|
4057
|
-
"
|
|
4061
|
+
"195": {
|
|
4058
4062
|
"path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/data/public_data_tree_leaf_preimage.nr",
|
|
4059
4063
|
"source": "use crate::{merkle_tree::leaf_preimage::IndexedTreeLeafPreimage, traits::{Empty, Hash}};\n\npub struct PublicDataTreeLeafPreimage {\n pub slot: Field,\n pub value: Field,\n pub next_slot: Field,\n pub next_index: u32,\n}\n\nimpl Empty for PublicDataTreeLeafPreimage {\n fn empty() -> Self {\n Self { slot: 0, value: 0, next_slot: 0, next_index: 0 }\n }\n}\n\nimpl Hash for PublicDataTreeLeafPreimage {\n fn hash(self) -> Field {\n if self.is_empty() {\n 0\n } else {\n crate::hash::poseidon2_hash([\n self.slot,\n self.value,\n (self.next_index as Field),\n self.next_slot,\n ])\n }\n }\n}\n\nimpl IndexedTreeLeafPreimage for PublicDataTreeLeafPreimage {\n fn get_key(self) -> Field {\n self.slot\n }\n\n fn get_next_key(self) -> Field {\n self.next_slot\n }\n\n fn as_leaf(self) -> Field {\n self.hash()\n }\n}\n\nimpl PublicDataTreeLeafPreimage {\n pub fn is_empty(self) -> bool {\n (self.slot == 0) & (self.value == 0) & (self.next_slot == 0) & (self.next_index == 0)\n }\n}\n"
|
|
4060
4064
|
},
|
|
4061
|
-
"202": {
|
|
4062
|
-
"path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/storage/map.nr",
|
|
4063
|
-
"source": "use crate::{hash::poseidon2_hash, traits::ToField};\n\npub fn derive_storage_slot_in_map<K>(storage_slot: Field, key: K) -> Field\nwhere\n K: ToField,\n{\n poseidon2_hash([storage_slot, key.to_field()])\n}\n\nmod test {\n use crate::{address::AztecAddress, storage::map::derive_storage_slot_in_map};\n\n #[test]\n fn test_derive_storage_slot_in_map_matches_typescript() {\n let map_slot = 0x132258fb6962c4387ba659d9556521102d227549a386d39f0b22d1890d59c2b5;\n let key = AztecAddress::from_field(\n 0x302dbc2f9b50a73283d5fb2f35bc01eae8935615817a0b4219a057b2ba8a5a3f,\n );\n\n let slot = derive_storage_slot_in_map(map_slot, key);\n\n // The following value was generated by `map_slot.test.ts`\n let slot_from_typescript =\n 0x15b9fe39449affd8b377461263e9d2b610b9ad40580553500b4e41d9cbd887ac;\n\n assert_eq(slot, slot_from_typescript);\n }\n}\n"
|
|
4064
|
-
},
|
|
4065
4065
|
"204": {
|
|
4066
|
-
"path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/
|
|
4067
|
-
"source": "use crate::
|
|
4066
|
+
"path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/traits.nr",
|
|
4067
|
+
"source": "use crate::meta::{derive_deserialize, derive_serialize};\nuse crate::utils::field::field_from_bytes;\n\n// Trait: is_empty\n//\n// The general is_empty trait checks if a data type is is empty,\n// and it defines empty for the basic data types as 0.\n//\n// If a Field is equal to zero, then it is regarded as zero.\n// We will go with this definition for now, however it can be problematic\n// if a value can actually be zero. In a future refactor, we can\n// use the optional type for safety. Doing it now would lead to a worse devex\n// and would make it harder to sync up with the cpp code.\n// Preferred over Default trait to convey intent, as default doesn't necessarily mean empty.\npub trait Empty {\n fn empty() -> Self;\n}\n\nimpl Empty for Field {\n fn empty() -> Self {\n 0\n }\n}\n\nimpl Empty for u1 {\n fn empty() -> Self {\n 0\n }\n}\nimpl Empty for u8 {\n fn empty() -> Self {\n 0\n }\n}\nimpl Empty for u32 {\n fn empty() -> Self {\n 0\n }\n}\nimpl Empty for u64 {\n fn empty() -> Self {\n 0\n }\n}\nimpl Empty for U128 {\n fn empty() -> Self {\n U128::from_integer(0)\n }\n}\n\npub fn is_empty<T>(item: T) -> bool\nwhere\n T: Empty + Eq,\n{\n item.eq(T::empty())\n}\n\npub fn is_empty_array<T, let N: u32>(array: [T; N]) -> bool\nwhere\n T: Empty + Eq,\n{\n array.all(|elem| is_empty(elem))\n}\n\npub trait Hash {\n fn hash(self) -> Field;\n}\n\npub trait ToField {\n fn to_field(self) -> Field;\n}\n\nimpl ToField for Field {\n fn to_field(self) -> Field {\n self\n }\n}\n\nimpl ToField for bool {\n fn to_field(self) -> Field {\n self as Field\n }\n}\nimpl ToField for u1 {\n fn to_field(self) -> Field {\n self as Field\n }\n}\nimpl ToField for u8 {\n fn to_field(self) -> Field {\n self as Field\n }\n}\nimpl ToField for u32 {\n fn to_field(self) -> Field {\n self as Field\n }\n}\nimpl ToField for u64 {\n fn to_field(self) -> Field {\n self as Field\n }\n}\nimpl ToField for U128 {\n fn to_field(self) -> Field {\n self.to_integer()\n }\n}\nimpl<let N: u32> ToField for str<N> {\n fn to_field(self) -> Field {\n assert(N < 32, \"String doesn't fit in a field, consider using Serialize instead\");\n field_from_bytes(self.as_bytes(), true)\n }\n}\n\npub trait FromField {\n fn from_field(value: Field) -> Self;\n}\n\nimpl FromField for Field {\n fn from_field(value: Field) -> Self {\n value\n }\n}\n\nimpl FromField for bool {\n fn from_field(value: Field) -> Self {\n value as bool\n }\n}\nimpl FromField for u1 {\n fn from_field(value: Field) -> Self {\n value as u1\n }\n}\nimpl FromField for u8 {\n fn from_field(value: Field) -> Self {\n value as u8\n }\n}\nimpl FromField for u32 {\n fn from_field(value: Field) -> Self {\n value as u32\n }\n}\nimpl FromField for u64 {\n fn from_field(value: Field) -> Self {\n value as u64\n }\n}\nimpl FromField for U128 {\n fn from_field(value: Field) -> Self {\n U128::from_integer(value)\n }\n}\n\n// docs:start:serialize\n#[derive_via(derive_serialize)]\npub trait Serialize<let N: u32> {\n fn serialize(self) -> [Field; N];\n}\n// docs:end:serialize\n\nimpl<let N: u32> Serialize<N> for str<N> {\n fn serialize(self) -> [Field; N] {\n let bytes = self.as_bytes();\n let mut fields = [0; N];\n for i in 0..bytes.len() {\n fields[i] = bytes[i] as Field;\n }\n fields\n }\n}\n\n// docs:start:deserialize\n#[derive_via(derive_deserialize)]\npub trait Deserialize<let N: u32> {\n fn deserialize(fields: [Field; N]) -> Self;\n}\n// docs:end:deserialize\n\nimpl<let N: u32> Deserialize<N> for str<N> {\n fn deserialize(fields: [Field; N]) -> Self {\n str<N>::from(fields.map(|value| value as u8))\n }\n}\n"
|
|
4068
4068
|
},
|
|
4069
|
-
"
|
|
4070
|
-
"path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/
|
|
4071
|
-
"source": "use crate::{hash::
|
|
4069
|
+
"206": {
|
|
4070
|
+
"path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/storage/map.nr",
|
|
4071
|
+
"source": "use crate::{hash::poseidon2_hash, traits::ToField};\n\npub fn derive_storage_slot_in_map<K>(storage_slot: Field, key: K) -> Field\nwhere\n K: ToField,\n{\n poseidon2_hash([storage_slot, key.to_field()])\n}\n\nmod test {\n use crate::{address::AztecAddress, storage::map::derive_storage_slot_in_map};\n\n #[test]\n fn test_derive_storage_slot_in_map_matches_typescript() {\n let map_slot = 0x132258fb6962c4387ba659d9556521102d227549a386d39f0b22d1890d59c2b5;\n let key = AztecAddress::from_field(\n 0x302dbc2f9b50a73283d5fb2f35bc01eae8935615817a0b4219a057b2ba8a5a3f,\n );\n\n let slot = derive_storage_slot_in_map(map_slot, key);\n\n // The following value was generated by `map_slot.test.ts`\n let slot_from_typescript =\n 0x15b9fe39449affd8b377461263e9d2b610b9ad40580553500b4e41d9cbd887ac;\n\n assert_eq(slot, slot_from_typescript);\n }\n}\n"
|
|
4072
4072
|
},
|
|
4073
|
-
"
|
|
4073
|
+
"207": {
|
|
4074
4074
|
"path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/debug_log.nr",
|
|
4075
4075
|
"source": "/// Utility function to console.log data in the acir simulator.\n/// Example:\n/// debug_log(\"blah blah this is a debug string\");\npub fn debug_log<let N: u32>(msg: str<N>) {\n debug_log_format(msg, []);\n}\n\n/// Utility function to console.log data in the acir simulator. This variant receives a format string in which the\n/// `${k}` tokens will be replaced with the k-eth value in the `args` array.\n/// Examples:\n/// debug_log_format(\"get_2(slot:{0}) =>\\n\\t0:{1}\\n\\t1:{2}\", [storage_slot, note0_hash, note1_hash]);\n/// debug_log_format(\"whole array: {}\", [e1, e2, e3, e4]);\npub fn debug_log_format<let M: u32, let N: u32>(msg: str<M>, args: [Field; N]) {\n // This oracle call returns nothing: we only call it for its side effects. It is therefore always safe to call.\n unsafe { debug_log_oracle_wrapper(msg, args) };\n}\n\npub unconstrained fn debug_log_oracle_wrapper<let M: u32, let N: u32>(\n msg: str<M>,\n args: [Field; N],\n) {\n debug_log_oracle(msg, args.as_slice());\n}\n\n// WARNING: sometimes when using debug logs the ACVM errors with: `thrown: \"solver opcode resolution error: cannot solve opcode: expression has too many unknowns x155\"`\n#[oracle(debugLog)]\nunconstrained fn debug_log_oracle<let M: u32>(_msg: str<M>, args: [Field]) {}\n"
|
|
4076
4076
|
},
|
|
4077
|
-
"
|
|
4078
|
-
"path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/address/eth_address.nr",
|
|
4079
|
-
"source": "use crate::{constants::ETH_ADDRESS_LENGTH, traits::{Deserialize, Empty, Serialize, ToField}, utils};\n\npub struct EthAddress {\n inner: Field,\n}\n\nimpl Eq for EthAddress {\n fn eq(self, other: Self) -> bool {\n self.to_field() == other.to_field()\n }\n}\n\nimpl Empty for EthAddress {\n fn empty() -> Self {\n Self { inner: 0 }\n }\n}\n\nimpl ToField for EthAddress {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl Serialize<ETH_ADDRESS_LENGTH> for EthAddress {\n fn serialize(self: Self) -> [Field; ETH_ADDRESS_LENGTH] {\n [self.inner]\n }\n}\n\nimpl Deserialize<ETH_ADDRESS_LENGTH> for EthAddress {\n fn deserialize(fields: [Field; ETH_ADDRESS_LENGTH]) -> Self {\n EthAddress::from_field(fields[0])\n }\n}\n\nimpl EthAddress {\n pub fn zero() -> Self {\n Self { inner: 0 }\n }\n\n pub fn from_field(field: Field) -> Self {\n field.assert_max_bit_size::<160>();\n Self { inner: field }\n }\n\n pub fn is_zero(self) -> bool {\n self.inner == 0\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n\n pub fn conditional_assign(predicate: bool, lhs: Self, rhs: Self) -> Self {\n let result = utils::conditional_assign(predicate, rhs.to_field(), lhs.to_field());\n Self { inner: result }\n }\n}\n"
|
|
4080
|
-
},
|
|
4081
|
-
"240": {
|
|
4077
|
+
"211": {
|
|
4082
4078
|
"path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/address/aztec_address.nr",
|
|
4083
4079
|
"source": "use crate::{\n abis::function_selector::FunctionSelector,\n address::{\n partial_address::PartialAddress, salted_initialization_hash::SaltedInitializationHash,\n },\n constants::{\n AZTEC_ADDRESS_LENGTH, FUNCTION_TREE_HEIGHT, GENERATOR_INDEX__CONTRACT_ADDRESS_V1,\n MAX_FIELD_VALUE,\n },\n contract_class_id::ContractClassId,\n hash::{poseidon2_hash_with_separator, private_functions_root_from_siblings},\n merkle_tree::membership::MembershipWitness,\n public_keys::{IvpkM, NpkM, OvpkM, PublicKeys, TpkM},\n traits::{Deserialize, Empty, FromField, Serialize, ToField},\n utils,\n};\n\n// We do below because `use crate::point::Point;` does not work\nuse dep::std::embedded_curve_ops::EmbeddedCurvePoint as Point;\n\nuse crate::public_keys::AddressPoint;\nuse std::{\n ec::{pow, sqrt},\n embedded_curve_ops::{EmbeddedCurveScalar, fixed_base_scalar_mul as derive_public_key},\n};\n\n// Aztec address\npub struct AztecAddress {\n pub inner: Field,\n}\n\nimpl Eq for AztecAddress {\n fn eq(self, other: Self) -> bool {\n self.to_field() == other.to_field()\n }\n}\n\nimpl Empty for AztecAddress {\n fn empty() -> Self {\n Self { inner: 0 }\n }\n}\n\nimpl ToField for AztecAddress {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl FromField for AztecAddress {\n fn from_field(value: Field) -> AztecAddress {\n AztecAddress { inner: value }\n }\n}\n\nimpl Serialize<AZTEC_ADDRESS_LENGTH> for AztecAddress {\n fn serialize(self: Self) -> [Field; AZTEC_ADDRESS_LENGTH] {\n [self.to_field()]\n }\n}\n\nimpl Deserialize<AZTEC_ADDRESS_LENGTH> for AztecAddress {\n fn deserialize(fields: [Field; AZTEC_ADDRESS_LENGTH]) -> Self {\n FromField::from_field(fields[0])\n }\n}\n\nimpl AztecAddress {\n pub fn zero() -> Self {\n Self { inner: 0 }\n }\n\n pub fn to_address_point(self) -> AddressPoint {\n // We compute the address point by taking our address, setting it to x, and then solving for y in the\n // equation which defines our bn curve:\n // y^2 = x^3 - 17; x = address\n let x = self.inner;\n let y_squared = pow(x, 3) - 17;\n\n // TODO (#8970): Handle cases where we cannot recover a point from an address\n let mut y = sqrt(y_squared);\n\n // If we get a negative y coordinate (any y where y > MAX_FIELD_VALUE / 2), we pin it to the\n // positive one (any value where y <= MAX_FIELD_VALUE / 2) by subtracting it from the Field modulus\n // note: The field modulus is MAX_FIELD_VALUE + 1\n if (!(y.lt(MAX_FIELD_VALUE / 2) | y.eq(MAX_FIELD_VALUE / 2))) {\n y = (MAX_FIELD_VALUE + 1) - y;\n }\n\n AddressPoint { inner: Point { x: self.inner, y, is_infinite: false } }\n }\n\n pub fn compute(public_keys: PublicKeys, partial_address: PartialAddress) -> AztecAddress {\n let public_keys_hash = public_keys.hash();\n\n let pre_address = poseidon2_hash_with_separator(\n [public_keys_hash.to_field(), partial_address.to_field()],\n GENERATOR_INDEX__CONTRACT_ADDRESS_V1,\n );\n\n let address_point = derive_public_key(EmbeddedCurveScalar::from_field(pre_address)).add(\n public_keys.ivpk_m.to_point(),\n );\n\n // Note that our address is only the x-coordinate of the full address_point. This is okay because when people want to encrypt something and send it to us\n // they can recover our full point using the x-coordinate (our address itself). To do this, they recompute the y-coordinate according to the equation y^2 = x^3 - 17.\n // When they do this, they may get a positive y-coordinate (a value that is less than or equal to MAX_FIELD_VALUE / 2) or\n // a negative y-coordinate (a value that is more than MAX_FIELD_VALUE), and we cannot dictate which one they get and hence the recovered point may sometimes be different than the one\n // our secrect can decrypt. Regardless though, they should and will always encrypt using point with the positive y-coordinate by convention.\n // This ensures that everyone encrypts to the same point given an arbitrary x-coordinate (address). This is allowed because even though our original point may not have a positive y-coordinate,\n // with our original secret, we will be able to derive the secret to the point with the flipped (and now positive) y-coordinate that everyone encrypts to.\n AztecAddress::from_field(address_point.x)\n }\n\n pub fn compute_from_private_function(\n function_selector: FunctionSelector,\n function_vk_hash: Field,\n function_leaf_membership_witness: MembershipWitness<FUNCTION_TREE_HEIGHT>,\n contract_class_artifact_hash: Field,\n contract_class_public_bytecode_commitment: Field,\n salted_initialization_hash: SaltedInitializationHash,\n public_keys: PublicKeys,\n ) -> Self {\n let private_functions_root = private_functions_root_from_siblings(\n function_selector,\n function_vk_hash,\n function_leaf_membership_witness.leaf_index,\n function_leaf_membership_witness.sibling_path,\n );\n\n let contract_class_id = ContractClassId::compute(\n contract_class_artifact_hash,\n private_functions_root,\n contract_class_public_bytecode_commitment,\n );\n\n // Compute contract address using the preimage which includes the class_id.\n let partial_address = PartialAddress::compute_from_salted_initialization_hash(\n contract_class_id,\n salted_initialization_hash,\n );\n\n AztecAddress::compute(public_keys, partial_address)\n }\n\n pub fn is_zero(self) -> bool {\n self.inner == 0\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n\n pub fn conditional_assign(predicate: bool, lhs: Self, rhs: Self) -> Self {\n let result = utils::conditional_assign(predicate, rhs.to_field(), lhs.to_field());\n Self { inner: result }\n }\n}\n\n#[test]\nfn compute_address_from_partial_and_pub_keys() {\n let public_keys = PublicKeys {\n npk_m: NpkM {\n inner: Point {\n x: 0x22f7fcddfa3ce3e8f0cc8e82d7b94cdd740afa3e77f8e4a63ea78a239432dcab,\n y: 0x0471657de2b6216ade6c506d28fbc22ba8b8ed95c871ad9f3e3984e90d9723a7,\n is_infinite: false,\n },\n },\n ivpk_m: IvpkM {\n inner: Point {\n x: 0x111223493147f6785514b1c195bb37a2589f22a6596d30bb2bb145fdc9ca8f1e,\n y: 0x273bbffd678edce8fe30e0deafc4f66d58357c06fd4a820285294b9746c3be95,\n is_infinite: false,\n },\n },\n ovpk_m: OvpkM {\n inner: Point {\n x: 0x09115c96e962322ffed6522f57194627136b8d03ac7469109707f5e44190c484,\n y: 0x0c49773308a13d740a7f0d4f0e6163b02c5a408b6f965856b6a491002d073d5b,\n is_infinite: false,\n },\n },\n tpk_m: TpkM {\n inner: Point {\n x: 0x00d3d81beb009873eb7116327cf47c612d5758ef083d4fda78e9b63980b2a762,\n y: 0x2f567d22d2b02fe1f4ad42db9d58a36afd1983e7e2909d1cab61cafedad6193a,\n is_infinite: false,\n },\n },\n };\n\n let partial_address = PartialAddress::from_field(\n 0x0a7c585381b10f4666044266a02405bf6e01fa564c8517d4ad5823493abd31de,\n );\n\n let address = AztecAddress::compute(public_keys, partial_address);\n\n // The following value was generated by `derivation.test.ts`.\n // --> Run the test with AZTEC_GENERATE_TEST_DATA=1 flag to update test data.\n let expected_computed_address_from_partial_and_pubkeys =\n 0x24e4646f58b9fbe7d38e317db8d5636c423fbbdfbe119fc190fe9c64747e0c62;\n assert(address.to_field() == expected_computed_address_from_partial_and_pubkeys);\n}\n\n#[test]\nfn from_field_to_field() {\n let address = AztecAddress { inner: 37 };\n assert_eq(FromField::from_field(address.to_field()), address);\n}\n\n#[test]\nfn serde() {\n let address = AztecAddress { inner: 37 };\n assert_eq(Deserialize::deserialize(address.serialize()), address);\n}\n"
|
|
4084
4080
|
},
|
|
4085
|
-
"
|
|
4081
|
+
"212": {
|
|
4082
|
+
"path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/address/eth_address.nr",
|
|
4083
|
+
"source": "use crate::{constants::ETH_ADDRESS_LENGTH, traits::{Deserialize, Empty, Serialize, ToField}, utils};\n\npub struct EthAddress {\n inner: Field,\n}\n\nimpl Eq for EthAddress {\n fn eq(self, other: Self) -> bool {\n self.to_field() == other.to_field()\n }\n}\n\nimpl Empty for EthAddress {\n fn empty() -> Self {\n Self { inner: 0 }\n }\n}\n\nimpl ToField for EthAddress {\n fn to_field(self) -> Field {\n self.inner\n }\n}\n\nimpl Serialize<ETH_ADDRESS_LENGTH> for EthAddress {\n fn serialize(self: Self) -> [Field; ETH_ADDRESS_LENGTH] {\n [self.inner]\n }\n}\n\nimpl Deserialize<ETH_ADDRESS_LENGTH> for EthAddress {\n fn deserialize(fields: [Field; ETH_ADDRESS_LENGTH]) -> Self {\n EthAddress::from_field(fields[0])\n }\n}\n\nimpl EthAddress {\n pub fn zero() -> Self {\n Self { inner: 0 }\n }\n\n pub fn from_field(field: Field) -> Self {\n field.assert_max_bit_size::<160>();\n Self { inner: field }\n }\n\n pub fn is_zero(self) -> bool {\n self.inner == 0\n }\n\n pub fn assert_is_zero(self) {\n assert(self.to_field() == 0);\n }\n\n pub fn conditional_assign(predicate: bool, lhs: Self, rhs: Self) -> Self {\n let result = utils::conditional_assign(predicate, rhs.to_field(), lhs.to_field());\n Self { inner: result }\n }\n}\n"
|
|
4084
|
+
},
|
|
4085
|
+
"236": {
|
|
4086
4086
|
"path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/hash.nr",
|
|
4087
4087
|
"source": "use crate::{\n abis::{\n contract_class_function_leaf_preimage::ContractClassFunctionLeafPreimage,\n function_selector::FunctionSelector,\n log_hash::{LogHash, ScopedEncryptedLogHash, ScopedLogHash},\n note_hash::ScopedNoteHash,\n nullifier::ScopedNullifier,\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 traits::{is_empty, ToField},\n utils::field::field_from_bytes_32_trunc,\n};\nuse super::utils::field::field_from_bytes;\n\npub fn sha256_to_field<let N: u32>(bytes_to_hash: [u8; N]) -> Field {\n let sha256_hashed = std::hash::sha256(bytes_to_hash);\n let hash_in_a_field = field_from_bytes_32_trunc(sha256_hashed);\n\n hash_in_a_field\n}\n\npub fn private_functions_root_from_siblings(\n selector: FunctionSelector,\n vk_hash: Field,\n function_leaf_index: Field,\n function_leaf_sibling_path: [Field; FUNCTION_TREE_HEIGHT],\n) -> Field {\n let function_leaf_preimage = ContractClassFunctionLeafPreimage { selector, vk_hash };\n let function_leaf = function_leaf_preimage.hash();\n root_from_sibling_path(\n function_leaf,\n function_leaf_index,\n function_leaf_sibling_path,\n )\n}\n\nfn compute_note_hash_nonce(tx_hash: Field, note_index_in_tx: u32) -> Field {\n // Hashing tx hash with note index in tx is guaranteed to be unique\n poseidon2_hash_with_separator(\n [tx_hash, note_index_in_tx as Field],\n GENERATOR_INDEX__NOTE_HASH_NONCE,\n )\n}\n\npub fn compute_unique_note_hash(nonce: Field, note_hash: Field) -> Field {\n let inputs = [nonce, note_hash];\n poseidon2_hash_with_separator(inputs, GENERATOR_INDEX__UNIQUE_NOTE_HASH)\n}\n\npub fn compute_siloed_note_hash(app: AztecAddress, unique_note_hash: Field) -> Field {\n poseidon2_hash_with_separator(\n [app.to_field(), unique_note_hash],\n GENERATOR_INDEX__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, tx_hash: Field, note_index_in_tx: u32) -> Field {\n if note_hash.contract_address.is_zero() {\n 0\n } else {\n let nonce = compute_note_hash_nonce(tx_hash, note_index_in_tx);\n let unique_note_hash = compute_unique_note_hash(nonce, note_hash.value());\n compute_siloed_note_hash(note_hash.contract_address, unique_note_hash)\n }\n}\n\npub fn compute_siloed_nullifier(app: AztecAddress, nullifier: Field) -> Field {\n 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 silo_encrypted_log_hash(log_hash: ScopedLogHash) -> Field {\n // We assume contract address has already been masked\n if log_hash.contract_address.is_zero() {\n 0\n } else {\n accumulate_sha256(\n [log_hash.contract_address.to_field(), log_hash.log_hash.value],\n )\n }\n}\n\npub fn mask_encrypted_log_hash(scoped_log: ScopedEncryptedLogHash) -> AztecAddress {\n if scoped_log.contract_address.is_zero() {\n AztecAddress::from_field(0)\n } else if (scoped_log.log_hash.randomness == 0) {\n scoped_log.contract_address\n } else {\n AztecAddress::from_field(poseidon2_hash_with_separator(\n [scoped_log.contract_address.to_field(), scoped_log.log_hash.randomness],\n 0,\n ))\n }\n}\n\nfn compute_siloed_unencrypted_log_hash(address: AztecAddress, log_hash: Field) -> Field {\n accumulate_sha256([address.to_field(), log_hash])\n}\n\npub fn silo_unencrypted_log_hash(log_hash: ScopedLogHash) -> Field {\n if log_hash.contract_address.is_zero() {\n 0\n } else {\n compute_siloed_unencrypted_log_hash(log_hash.contract_address, log_hash.value())\n }\n}\n\npub fn merkle_hash(left: Field, right: Field) -> Field {\n 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: BoundedVec<u8, 160> = BoundedVec::new();\n\n let inputs =\n [contract_address.to_field(), rollup_version_id, recipient.to_field(), chain_id, content];\n for i in 0..inputs.len() {\n // TODO are bytes be in fr.to_buffer() ?\n let item_bytes: [u8; 32] = inputs[i].to_be_bytes();\n for j in 0..32 {\n bytes.push(item_bytes[j]);\n }\n }\n\n sha256_to_field(bytes.storage())\n}\n\npub fn silo_l2_to_l1_message(\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\n// Computes the final logs hash for a tx.\npub fn compute_tx_logs_hash<let N: u32>(logs: [LogHash; N]) -> Field {\n // Convert each field element into a byte array and append the bytes to `hash_input_flattened`\n let mut hash_input_flattened = [0; N * 32];\n for offset in 0..N {\n // TODO: This is not checking that the decomposition is smaller than P\n let input_as_bytes: [u8; 32] = logs[offset].value.to_be_radix(256);\n for byte_index in 0..32 {\n hash_input_flattened[offset * 32 + byte_index] = input_as_bytes[byte_index];\n }\n }\n // Ideally we would push to a slice then hash, but there is no sha_slice\n // Hardcode to 256 bytes for now\n let mut hash = sha256_to_field(hash_input_flattened);\n // Not having a 0 value hash for empty logs causes issues with empty txs\n // used for padding. Returning early is currently unsupported.\n // We always provide sorted logs here, so 0 being empty means all are empty.\n if is_empty(logs[0]) {\n hash = 0;\n }\n hash\n}\n\npub fn 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 // We manually hash the inputs here, since we cannot express with the type system a constant size inputs array of N + 1\n let in_len = N + 1;\n let two_pow_64 = 18446744073709551616;\n let iv: Field = (in_len as Field) * two_pow_64;\n let mut sponge = std::hash::poseidon2::Poseidon2::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\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 two_pow_64 = 18446744073709551616;\n let iv: Field = (in_len as Field) * two_pow_64;\n let mut sponge = std::hash::poseidon2::Poseidon2::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 // We manually hash the inputs here, since we cannot express with the type system a constant size inputs array of Math.ceil(N/31)\n let mut in_len = N / 31;\n let mut has_padding = false;\n if N % 31 != 0 {\n in_len += 1;\n has_padding = true;\n }\n\n let two_pow_64 = 18446744073709551616;\n let iv: Field = (in_len as Field) * two_pow_64;\n let mut sponge = std::hash::poseidon2::Poseidon2::new(iv);\n\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 sponge.absorb(field_from_bytes(current_field, false));\n current_field = [0; 31];\n }\n }\n if has_padding {\n sponge.absorb(field_from_bytes(current_field, false));\n }\n\n 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 = std::hash::sha256(full_buffer);\n let truncated_field = crate::utils::field::field_from_bytes_32_trunc(result_bytes);\n assert(truncated_field == result);\n let mod_res = result + (result_bytes[31] as Field);\n assert(mod_res == 0x448ebbc9e1a31220a2f3830c18eef61b9bd070e5084b7fa2a359fe729184e0);\n}\n\n#[test]\nfn compute_l2_l1_hash() {\n // All zeroes\n let hash_result =\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"
|
|
4088
4088
|
},
|
|
4089
|
-
"
|
|
4090
|
-
"path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/
|
|
4091
|
-
"source": "use crate::
|
|
4092
|
-
},
|
|
4093
|
-
"322": {
|
|
4094
|
-
"path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/utils/reader.nr",
|
|
4095
|
-
"source": "pub struct Reader<let N: u32> {\n data: [Field; N],\n offset: u32,\n}\n\nimpl<let N: u32> Reader<N> {\n pub fn new(data: [Field; N]) -> Self {\n Self { data, offset: 0 }\n }\n\n pub fn read(&mut self) -> Field {\n let result = self.data[self.offset];\n self.offset += 1;\n result\n }\n\n pub fn read_u32(&mut self) -> u32 {\n self.read() as u32\n }\n\n pub fn read_bool(&mut self) -> bool {\n self.read() as bool\n }\n\n pub fn read_array<let K: u32>(&mut self) -> [Field; K] {\n let mut result = [0; K];\n for i in 0..K {\n result[i] = self.data[self.offset + i];\n }\n self.offset += K;\n result\n }\n\n pub fn read_struct<T, let K: u32>(&mut self, deserialise: fn([Field; K]) -> T) -> T {\n let result = deserialise(self.read_array());\n result\n }\n\n pub fn read_struct_array<T, let K: u32, let C: u32>(\n &mut self,\n deserialise: fn([Field; K]) -> T,\n mut result: [T; C],\n ) -> [T; C] {\n for i in 0..C {\n result[i] = self.read_struct(deserialise);\n }\n result\n }\n\n pub fn finish(self) {\n assert(self.offset == self.data.len(), \"Reader did not read all data\");\n }\n}\n"
|
|
4089
|
+
"293": {
|
|
4090
|
+
"path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/merkle_tree/root.nr",
|
|
4091
|
+
"source": "use crate::{hash::merkle_hash, merkle_tree::merkle_tree::MerkleTree};\n\n// Calculate the Merkle tree root from the sibling path and leaf.\n//\n// The leaf is hashed with its sibling, and then the result is hashed\n// with the next sibling etc in the path. The last hash is the root.\n//\n// TODO(David/Someone): The cpp code is using a uint256, whereas its\n// TODO a bit simpler in Noir to just have a bit array.\n// TODO: I'd generally like to avoid u256 for algorithms like\n// this because it means we never even need to consider cases where\n// the index is greater than p.\npub fn root_from_sibling_path<let N: u32>(\n leaf: Field,\n leaf_index: Field,\n sibling_path: [Field; N],\n) -> Field {\n let mut node = leaf;\n let indices: [u1; N] = leaf_index.to_le_bits();\n\n for i in 0..N {\n let (hash_left, hash_right) = if indices[i] == 1 {\n (sibling_path[i], node)\n } else {\n (node, sibling_path[i])\n };\n node = merkle_hash(hash_left, hash_right);\n }\n node\n}\n\npub fn calculate_subtree_root<let N: u32>(leaves: [Field; N]) -> Field {\n MerkleTree::new(leaves).get_root()\n}\n\n// These values are precomputed and we run tests to ensure that they\n// are correct. The values themselves were computed from the cpp code.\n//\n// Would be good if we could use width since the compute_subtree\n// algorithm uses depth.\npub fn calculate_empty_tree_root(depth: u32) -> Field {\n if depth == 0 {\n 0\n } else if depth == 1 {\n 0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1\n } else if depth == 2 {\n 0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290\n } else if depth == 3 {\n 0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20\n } else if depth == 4 {\n 0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e\n } else if depth == 5 {\n 0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf\n } else if depth == 6 {\n 0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76\n } else if depth == 7 {\n 0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b\n } else if depth == 8 {\n 0x067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1\n } else if depth == 9 {\n 0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972\n } else if depth == 10 {\n 0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686\n } else {\n panic(f\"depth should be between 0 and 10\")\n }\n}\n\n#[test]\nfn test_merkle_root_interop_test() {\n // This is a test to ensure that we match the cpp implementation.\n // You can grep for `TEST_F(root_rollup_tests, noir_interop_test)`\n // to find the test that matches this.\n let root = calculate_subtree_root([1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]);\n assert(0x1a09d935ae110b4c861fcec8f9099ec30b4485022aeb3d3cf9d7168e38fdc231 == root);\n\n let empty_root = calculate_subtree_root([0; 16]);\n assert(0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e == empty_root);\n}\n\n#[test]\nfn test_empty_subroot() {\n assert(calculate_empty_tree_root(0) == 0);\n\n let expected_empty_root_2 = calculate_subtree_root([0; 2]);\n assert(calculate_empty_tree_root(1) == expected_empty_root_2);\n\n let expected_empty_root_4 = calculate_subtree_root([0; 4]);\n assert(calculate_empty_tree_root(2) == expected_empty_root_4);\n\n let expected_empty_root_8 = calculate_subtree_root([0; 8]);\n assert(calculate_empty_tree_root(3) == expected_empty_root_8);\n\n let expected_empty_root_16 = calculate_subtree_root([0; 16]);\n assert(calculate_empty_tree_root(4) == expected_empty_root_16);\n\n let expected_empty_root_32 = calculate_subtree_root([0; 32]);\n assert(calculate_empty_tree_root(5) == expected_empty_root_32);\n\n let expected_empty_root_64 = calculate_subtree_root([0; 64]);\n assert(calculate_empty_tree_root(6) == expected_empty_root_64);\n\n let expected_empty_root_128 = calculate_subtree_root([0; 128]);\n assert(calculate_empty_tree_root(7) == expected_empty_root_128);\n\n let expected_empty_root_256 = calculate_subtree_root([0; 256]);\n assert(calculate_empty_tree_root(8) == expected_empty_root_256);\n\n let expected_empty_root_512 = calculate_subtree_root([0; 512]);\n assert(calculate_empty_tree_root(9) == expected_empty_root_512);\n\n let expected_empty_root_1024 = calculate_subtree_root([0; 1024]);\n assert(calculate_empty_tree_root(10) == expected_empty_root_1024);\n}\n"
|
|
4096
4092
|
},
|
|
4097
|
-
"
|
|
4093
|
+
"319": {
|
|
4098
4094
|
"path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/utils/field.nr",
|
|
4099
4095
|
"source": "pub fn field_from_bytes<let N: u32>(bytes: [u8; N], big_endian: bool) -> Field {\n assert(bytes.len() < 32, \"field_from_bytes: N must be less than 32\");\n let mut as_field = 0;\n let mut offset = 1;\n for i in 0..N {\n let mut index = i;\n if big_endian {\n index = N - i - 1;\n }\n as_field += (bytes[index] as Field) * offset;\n offset *= 256;\n }\n\n as_field\n}\n\n// Convert a 32 byte array to a field element by truncating the final byte\npub fn field_from_bytes_32_trunc(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..15 {\n // covers bytes 16..30 (31 is truncated and ignored)\n low = low + (bytes32[15 + 15 - i] as Field) * v;\n v = v * 256;\n // covers bytes 0..14\n high = high + (bytes32[14 - i] as Field) * v;\n }\n // covers byte 15\n low = low + (bytes32[15] as Field) * v;\n\n low + high * v\n}\n\n// TODO to radix returns u8, so we cannot use bigger radixes. It'd be ideal to use a radix of the maximum range-constrained integer noir supports\npub fn full_field_less_than(lhs: Field, rhs: Field) -> bool {\n lhs.lt(rhs)\n}\n\npub fn full_field_greater_than(lhs: Field, rhs: Field) -> bool {\n rhs.lt(lhs)\n}\n\n#[test]\nunconstrained fn bytes_field_test() {\n // Tests correctness of field_from_bytes_32_trunc against existing methods\n // Bytes representing 0x543e0a6642ffeb8039296861765a53407bba62bd1c97ca43374de950bbe0a7\n let inputs = [\n 84, 62, 10, 102, 66, 255, 235, 128, 57, 41, 104, 97, 118, 90, 83, 64, 123, 186, 98, 189, 28,\n 151, 202, 67, 55, 77, 233, 80, 187, 224, 167,\n ];\n let field = field_from_bytes(inputs, true);\n let return_bytes: [u8; 31] = field.to_be_bytes();\n assert_eq(inputs, return_bytes);\n // 32 bytes - we remove the final byte, and check it matches the field\n let inputs2 = [\n 84, 62, 10, 102, 66, 255, 235, 128, 57, 41, 104, 97, 118, 90, 83, 64, 123, 186, 98, 189, 28,\n 151, 202, 67, 55, 77, 233, 80, 187, 224, 167, 158,\n ];\n let field2 = field_from_bytes_32_trunc(inputs2);\n let return_bytes2: [u8; 31] = field.to_be_bytes();\n\n assert_eq(return_bytes2, return_bytes);\n assert_eq(field2, field);\n}\n\n#[test]\nunconstrained fn max_field_test() {\n // Tests the hardcoded value in constants.nr vs underlying modulus\n // NB: We can't use 0-1 in constants.nr as it will be transpiled incorrectly to ts and sol constants files\n let max_value = crate::constants::MAX_FIELD_VALUE;\n assert_eq(max_value, 0 - 1);\n // modulus == 0 is tested elsewhere, so below is more of a sanity check\n let max_bytes: [u8; 32] = max_value.to_be_bytes();\n let mod_bytes = std::field::modulus_be_bytes();\n for i in 0..31 {\n assert_eq(max_bytes[i], mod_bytes[i]);\n }\n assert_eq(max_bytes[31], mod_bytes[31] - 1);\n}\n"
|
|
4100
4096
|
},
|
|
4101
|
-
"
|
|
4097
|
+
"320": {
|
|
4098
|
+
"path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/utils/reader.nr",
|
|
4099
|
+
"source": "pub struct Reader<let N: u32> {\n data: [Field; N],\n offset: u32,\n}\n\nimpl<let N: u32> Reader<N> {\n pub fn new(data: [Field; N]) -> Self {\n Self { data, offset: 0 }\n }\n\n pub fn read(&mut self) -> Field {\n let result = self.data[self.offset];\n self.offset += 1;\n result\n }\n\n pub fn read_u32(&mut self) -> u32 {\n self.read() as u32\n }\n\n pub fn read_bool(&mut self) -> bool {\n self.read() as bool\n }\n\n pub fn read_array<let K: u32>(&mut self) -> [Field; K] {\n let mut result = [0; K];\n for i in 0..K {\n result[i] = self.data[self.offset + i];\n }\n self.offset += K;\n result\n }\n\n pub fn read_struct<T, let K: u32>(&mut self, deserialise: fn([Field; K]) -> T) -> T {\n let result = deserialise(self.read_array());\n result\n }\n\n pub fn read_struct_array<T, let K: u32, let C: u32>(\n &mut self,\n deserialise: fn([Field; K]) -> T,\n mut result: [T; C],\n ) -> [T; C] {\n for i in 0..C {\n result[i] = self.read_struct(deserialise);\n }\n result\n }\n\n pub fn finish(self) {\n assert(self.offset == self.data.len(), \"Reader did not read all data\");\n }\n}\n"
|
|
4100
|
+
},
|
|
4101
|
+
"322": {
|
|
4102
4102
|
"path": "/usr/src/noir-projects/noir-protocol-circuits/crates/types/src/utils/mod.nr",
|
|
4103
4103
|
"source": "// general util packages/modules are usually bad practice\n// because there is no criteria for what we should not put in here.\n// Reducing the size of this package would be welcome.\n\npub mod arrays;\npub mod field;\npub mod reader;\npub mod uint256;\n\n// if predicate == true then return lhs, else return rhs\npub fn conditional_assign(predicate: bool, lhs: Field, rhs: Field) -> Field {\n if predicate {\n lhs\n } else {\n rhs\n }\n}\n\npub fn arr_copy_slice<T, let N: u32, let M: u32>(\n src: [T; N],\n mut dst: [T; M],\n offset: u32,\n) -> [T; M] {\n let iterator_len = if N > M { M } else { N };\n for i in 0..iterator_len {\n dst[i] = src[i + offset];\n }\n dst\n}\n"
|
|
4104
4104
|
},
|
|
4105
|
+
"394": {
|
|
4106
|
+
"path": "/usr/src/noir-projects/noir-contracts/contracts/fee_juice_contract/src/main.nr",
|
|
4107
|
+
"source": "mod lib;\n\nuse dep::aztec::macros::aztec;\n\n#[aztec]\ncontract FeeJuice {\n use dep::aztec::{\n macros::{functions::{internal, private, public, view}, storage::storage},\n protocol_types::{address::{AztecAddress, EthAddress}, constants::FEE_JUICE_INITIAL_MINT},\n state_vars::{Map, PublicImmutable, PublicMutable},\n };\n\n use crate::lib::get_bridge_gas_msg_hash;\n\n #[storage]\n struct Storage<Context> {\n // This map is accessed directly by protocol circuits to check balances for fee payment.\n // Do not change this storage layout unless you also update the base rollup circuits.\n balances: Map<AztecAddress, PublicMutable<U128, Context>, Context>,\n portal_address: PublicImmutable<EthAddress, Context>,\n }\n\n // Not flagged as initializer to reduce cost of checking init nullifier in all functions.\n // This function should be called as entrypoint to initialize the contract by minting itself funds.\n #[private]\n fn initialize(portal_address: EthAddress) {\n // Validate contract class parameters are correct\n let self = context.this_address();\n\n // Increase self balance and set as fee payer, and end setup\n FeeJuice::at(self)._increase_public_balance(self, FEE_JUICE_INITIAL_MINT).enqueue(\n &mut context,\n );\n context.set_as_fee_payer();\n context.end_setup();\n\n // Enqueue call to set the portal address\n FeeJuice::at(self).set_portal(portal_address).enqueue(&mut context);\n }\n\n // We purposefully not set this function as an initializer so we do not bind\n // the contract to a specific L1 portal address, since the Fee Juice address\n // is a hardcoded constant in the rollup circuits.\n #[public]\n fn set_portal(portal_address: EthAddress) {\n assert(storage.portal_address.read().is_zero());\n storage.portal_address.initialize(portal_address);\n }\n\n #[private]\n fn claim(to: AztecAddress, amount: Field, secret: Field, message_leaf_index: Field) {\n let content_hash = get_bridge_gas_msg_hash(to, amount);\n let portal_address = storage.portal_address.read();\n assert(!portal_address.is_zero());\n\n // Consume message and emit nullifier\n context.consume_l1_to_l2_message(content_hash, secret, portal_address, message_leaf_index);\n\n // TODO(palla/gas) Emit an unencrypted log to announce which L1 to L2 message has been claimed\n // Otherwise, we cannot trace L1 deposits to their corresponding claims on L2\n FeeJuice::at(context.this_address())._increase_public_balance(to, amount).enqueue(\n &mut context,\n );\n }\n\n #[public]\n #[internal]\n fn _increase_public_balance(to: AztecAddress, amount: Field) {\n let new_balance = storage.balances.at(to).read().add(U128::from_integer(amount));\n storage.balances.at(to).write(new_balance);\n }\n\n #[public]\n #[view]\n fn check_balance(fee_limit: Field) {\n let fee_limit = U128::from_integer(fee_limit);\n assert(storage.balances.at(context.msg_sender()).read() >= fee_limit, \"Balance too low\");\n }\n\n // utility function for testing\n #[public]\n #[view]\n fn balance_of_public(owner: AztecAddress) -> pub Field {\n storage.balances.at(owner).read().to_field()\n }\n}\n"
|
|
4108
|
+
},
|
|
4105
4109
|
"395": {
|
|
4106
4110
|
"path": "/usr/src/noir-projects/noir-contracts/contracts/fee_juice_contract/src/lib.nr",
|
|
4107
4111
|
"source": "use dep::aztec::context::PublicContext;\nuse dep::aztec::prelude::AztecAddress;\nuse dep::aztec::protocol_types::hash::sha256_to_field;\n\npub fn calculate_fee<TPublicContext>(context: PublicContext) -> Field {\n context.transaction_fee()\n}\n\npub fn get_bridge_gas_msg_hash(owner: AztecAddress, amount: Field) -> Field {\n let mut hash_bytes = [0; 68];\n let recipient_bytes: [u8; 32] = owner.to_field().to_be_bytes();\n let amount_bytes: [u8; 32] = amount.to_be_bytes();\n\n // The purpose of including the following selector is to make the message unique to that specific call. Note that\n // it has nothing to do with calling the function.\n let selector = comptime { std::hash::keccak256(\"claim(bytes32,uint256)\".as_bytes(), 22) };\n\n for i in 0..4 {\n hash_bytes[i] = selector[i];\n }\n\n for i in 0..32 {\n hash_bytes[i + 4] = recipient_bytes[i];\n hash_bytes[i + 36] = amount_bytes[i];\n }\n\n let content_hash = sha256_to_field(hash_bytes);\n content_hash\n}\n"
|
|
4108
|
-
},
|
|
4109
|
-
"396": {
|
|
4110
|
-
"path": "/usr/src/noir-projects/noir-contracts/contracts/fee_juice_contract/src/main.nr",
|
|
4111
|
-
"source": "mod lib;\n\nuse dep::aztec::macros::aztec;\n\n#[aztec]\ncontract FeeJuice {\n use dep::aztec::{\n macros::{functions::{internal, private, public, view}, storage::storage},\n protocol_types::{address::{AztecAddress, EthAddress}, constants::FEE_JUICE_INITIAL_MINT},\n state_vars::{Map, PublicMutable, SharedImmutable},\n };\n\n use crate::lib::get_bridge_gas_msg_hash;\n\n #[storage]\n struct Storage<Context> {\n // This map is accessed directly by protocol circuits to check balances for fee payment.\n // Do not change this storage layout unless you also update the base rollup circuits.\n balances: Map<AztecAddress, PublicMutable<U128, Context>, Context>,\n portal_address: SharedImmutable<EthAddress, Context>,\n }\n\n // Not flagged as initializer to reduce cost of checking init nullifier in all functions.\n // This function should be called as entrypoint to initialize the contract by minting itself funds.\n #[private]\n fn initialize(portal_address: EthAddress) {\n // Validate contract class parameters are correct\n let self = context.this_address();\n\n // Increase self balance and set as fee payer, and end setup\n FeeJuice::at(self)._increase_public_balance(self, FEE_JUICE_INITIAL_MINT).enqueue(\n &mut context,\n );\n context.set_as_fee_payer();\n context.end_setup();\n\n // Enqueue call to set the portal address\n FeeJuice::at(self).set_portal(portal_address).enqueue(&mut context);\n }\n\n // We purposefully not set this function as an initializer so we do not bind\n // the contract to a specific L1 portal address, since the Fee Juice address\n // is a hardcoded constant in the rollup circuits.\n #[public]\n fn set_portal(portal_address: EthAddress) {\n assert(storage.portal_address.read_public().is_zero());\n storage.portal_address.initialize(portal_address);\n }\n\n #[private]\n fn claim(to: AztecAddress, amount: Field, secret: Field, message_leaf_index: Field) {\n let content_hash = get_bridge_gas_msg_hash(to, amount);\n let portal_address = storage.portal_address.read_private();\n assert(!portal_address.is_zero());\n\n // Consume message and emit nullifier\n context.consume_l1_to_l2_message(content_hash, secret, portal_address, message_leaf_index);\n\n // TODO(palla/gas) Emit an unencrypted log to announce which L1 to L2 message has been claimed\n // Otherwise, we cannot trace L1 deposits to their corresponding claims on L2\n FeeJuice::at(context.this_address())._increase_public_balance(to, amount).enqueue(\n &mut context,\n );\n }\n\n #[public]\n #[internal]\n fn _increase_public_balance(to: AztecAddress, amount: Field) {\n let new_balance = storage.balances.at(to).read().add(U128::from_integer(amount));\n storage.balances.at(to).write(new_balance);\n }\n\n #[public]\n #[view]\n fn check_balance(fee_limit: Field) {\n let fee_limit = U128::from_integer(fee_limit);\n assert(storage.balances.at(context.msg_sender()).read() >= fee_limit, \"Balance too low\");\n }\n\n // utility function for testing\n #[public]\n #[view]\n fn balance_of_public(owner: AztecAddress) -> pub Field {\n storage.balances.at(owner).read().to_field()\n }\n}\n"
|
|
4112
4112
|
}
|
|
4113
4113
|
}
|
|
4114
4114
|
}
|