@aztec/noir-test-contracts.js 0.0.1-commit.808bf7f90 → 0.0.1-commit.8227e42

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.
Files changed (33) hide show
  1. package/artifacts/auth_wit_test_contract-AuthWitTest.json +16 -16
  2. package/artifacts/avm_gadgets_test_contract-AvmGadgetsTest.json +35 -35
  3. package/artifacts/avm_initializer_test_contract-AvmInitializerTest.json +15 -15
  4. package/artifacts/avm_test_contract-AvmTest.json +31 -31
  5. package/artifacts/benchmarking_contract-Benchmarking.json +39 -39
  6. package/artifacts/child_contract-Child.json +19 -19
  7. package/artifacts/counter_contract-Counter.json +63 -63
  8. package/artifacts/event_only_contract-EventOnly.json +15 -15
  9. package/artifacts/generic_proxy_contract-GenericProxy.json +24 -24
  10. package/artifacts/import_test_contract-ImportTest.json +19 -19
  11. package/artifacts/invalid_account_contract-InvalidAccount.json +15 -15
  12. package/artifacts/no_constructor_contract-NoConstructor.json +46 -46
  13. package/artifacts/note_getter_contract-NoteGetter.json +17 -17
  14. package/artifacts/offchain_effect_contract-OffchainEffect.json +21 -21
  15. package/artifacts/only_self_contract-OnlySelf.json +15 -15
  16. package/artifacts/oracle_version_check_contract-OracleVersionCheck.json +15 -15
  17. package/artifacts/parent_contract-Parent.json +29 -29
  18. package/artifacts/pending_note_hashes_contract-PendingNoteHashes.json +83 -83
  19. package/artifacts/public_immutable_contract-PublicImmutableContract.json +16 -16
  20. package/artifacts/returning_tuple_contract-ReturningTuple.json +20 -20
  21. package/artifacts/scope_test_contract-ScopeTest.json +46 -46
  22. package/artifacts/spam_contract-Spam.json +20 -20
  23. package/artifacts/sponsored_fpc_no_end_setup_contract-SponsoredFPCNoEndSetup.json +15 -15
  24. package/artifacts/state_vars_contract-StateVars.json +129 -129
  25. package/artifacts/stateful_test_contract-StatefulTest.json +61 -61
  26. package/artifacts/static_child_contract-StaticChild.json +19 -19
  27. package/artifacts/static_parent_contract-StaticParent.json +26 -26
  28. package/artifacts/storage_proof_test_contract-StorageProofTest.json +19 -19
  29. package/artifacts/test_contract-Test.json +89 -89
  30. package/artifacts/test_log_contract-TestLog.json +17 -17
  31. package/artifacts/updatable_contract-Updatable.json +40 -40
  32. package/artifacts/updated_contract-Updated.json +39 -39
  33. package/package.json +3 -3
@@ -1810,7 +1810,7 @@
1810
1810
  }
1811
1811
  },
1812
1812
  "bytecode": "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",
1813
- "debug_symbols": "tVjbbuM4DP0XP/tBIilK7K8MgiJtM4MAQVpk2gUWxfz7UtbFThYSnHj3xceyrWOKpEiK38Pb4eXr1/Px/PP99/D043t4uRxPp+Ov59P76/7z+H7Wp9+DiRdLw5O1f8bBTiPWkdERxBHG0TigV9BnGJ+BXlHfUwKXgBP4BCGBDE+ss0wCm0CJvQImoATKIuP0O0m/E/0dTb/TaaBckAATUAKXQKeBfu8mkX0SOUSR9WFZ8PPn5XCIHyw0oHr52F8O58/h6fx1Oo3DX/vT1/TR74/9ecLP/UXfmnE4nN8UlfDn8XSId3/GebZpT3Vs82Q2XKdbz2sJOEAm8GAeIkCXCYKxCwJYSxBCWX8Q1ySgNgFykQA9VQIyckXg2gRAhQDYNwnWSRCwSdDRgUCxgiA2dRC2LqEjAYjHsgYDsJCB1lJYY8sqrFlIYQXXUnjvij/7YGSmsNcU8UdNfxKsunSPCAEgVZlIpi1ExyPAcigcALMuwrVFbccrxQYqCwGYtxa66+hguaeL6lhBWNocvuPcVB0jhMoAbK8ZQnd71P3BjI9xCFQxhG2TAzqGJV8NSwEXPh7uECPMYkhbjJ57oS82AQJuuldcb3uroTV1ryHNLCx3kLho90ziFsbl1WHDmeodznjXXgz3Qg9C2fV6H9qL6ZIQYiVxi/BzF8mcDjUg0iMaYS67lmUW4ma/4f+a0l2VYLHZbiWAnmNIDcN6z3MI9NdWxZ53+ZqSrJc5L/ONHL20WiM5UVsTXSFCrU5s8NIUgnv1jamZkRGCtHyiS0JUXVzv247VWwxYKIYFS+3FSEcfWKOoRTdvV2/voAgls1kyvkVBdnNyJOglRyr6FOtNM7FRR59sSOpOc7NJ8A4p1qVocttTNPHWFE1+e4rucqxM0SSbU3RfjHUpuu/k3q9w8l4xzDV4We/m8KeKvj6WdByUoKY0wsXhiuy1a7heDPU8+8ZCof/icL3oZefgBYsDjr3esK6XWrHUK+CWUuD6vFoVyn6x124rDdc7JbkAUsUITK0w7GRz9GKzPW6w3R43GLbGDcZe3ABT48bCvW45+lYRWxObk0UVeWMVdltrhV7ZBdUmDm27LGf/H1SyfRLCqg6hRUPhLhKtzBfl8MOSrKqp+yTba2oH8ykDbWjaptdZoFpWqww3h/qdDvevx8t1/9K6mAjGqWkZzWp9xpBREoKJJ7kx9RIpNxNd7ia63E70uZ/oc0NRUjtzwpBR0vzY0Yzj2NKcEOKuTk1NzF1NzG1NDKmvOaGPHZ/UnHQRJWpOG52xQ6qhmWKLVL8jyIjRBoqU0WXkjMrnlYdCRknoTEYbE6IipP87zEgZs3yOY3NR0WcMGSUhm/Qd24yZjzMf03TwiLa9HPcvp0O0TjTg1/m1GEuHn39/lDelHf1xeX89vH1dDtGwi560Xn9o2wTsrjamp0cyAu1qd1qfqDmQdmN6rQUDTa+xztAilHhXmsnTDBlRygy1Brld7R3H125Ed/M6+t8/",
1813
+ "debug_symbols": "tVjbbuM4DP0XP/tBvIiS+iuDoEjbzCBAkBaZdoFFMf++lHWxk4UEJ9598bFs65giKZLi9/B2ePn69Xw8/3z/PTz9+B5eLsfT6fjr+fT+uv88vp/16fdg4gV4eAL4Mw4wjURHRkcYRxRH40BOQZ9RfIZ6JX3PCWwCSeAS+ARheBKdZRJAAiV2CpSAEyhLGKffhfS7oL/j6Xc6DZULE1ACTmAT6DTU7+0ksksi+yiyPiwLfv68HA7xg4UGVC8f+8vh/Dk8nb9Op3H4a3/6mj76/bE/T/i5v+hbMw6H85uiEv48ng7x7s84zzbtqVYgTxYjdTo4WUsgHjOBQ/MQAdlM4A0sCHAtgfdl/T7YJgG3CUiKBOS4EjDwFYFtEyAXAhTXJFgngacmQUcHAYsVAlFTB37rEjoSYHBU1mAQFzKspgADZRVgFlJAoLUUztniz86bMFPANUX8UdOfAlVd2keEQAxVmcSmLUTHIxDEFw7EWRf+2qLQ8coAnstCEOetRfY6OoD0dFEdywcJbQ7XcW6ujuF9ZUCBawbf3R51f4jQYxwBqxhBoMmBHcOyq4ZlTwsf93eI4WcxQluMnnuRKzZBRmm6V1xve6sRmLrXiGcWNfJ6Ehvtnknswrg3JL38Y6p3WONsezHSCz2EZdfrvW8vpkvCRJXELsLPXSRzOtSAyI9oRKTsWgmzEDf7jf7XlG6rBIvNdisB9hwj1DCs9zKHQHdtVep5l6spCVyY87LcyNFLqzWSM7c10RXC1+oEvAtNIaRX35iaGYXQh5ZPdEmYq4vrfduxeotBwGJYBG4vJnT0QTWKAtl5uzq4g8KXzAZsXIuCYXNyZOwlRy76DOBMM7FxR59iONSdZmeT0B1SrEvRbLenaJatKZrd9hTd5ViZojlsTtF9Mdal6L6TO7fCyXvFsNTgBc7O4U8VfX0s6TgoY01pTIvDFcMNRy+GOpl9Y6HQf3HYXvSCOXjh8oDjrjl6qZVKvYJ2KYVfn1erQsUt9tptpWF7pyTrMVQxvHArDNuwOXqJ2R43BLbHDcGtcUOoFzfQ1LixcK9bjr5VAtTEZsOiiryxitittUKv7MJqE0vQLsvF/QeVbJ+Eqaoj8KKhcBeJVuaLcvhhSVbV1H2S7TW1xfmUQeCbtul1FriW1SrDzaF+p8P96/Fy3b8EGxPBODUto1nBZfQZQ0I08SQ3pl4i52aizd1Em9uJLvcTXW4ohtTOnNBnDGl+7GjGcWxpTohxV6emJuWuJuW2JvnU15xQ+dik5qSNGKLmtNEZO6Qamjm2SPU7xowUbaDIGW1Gyah8TnnYZwwJrckIMSEqYvq/pYycMctnJTYXFV1GnzEkFJO+E8iY+STzCU8Hj2jby3H/cjpE60QDfp1fi7F0+Pn3R3lT2tEfl/fXw9vX5RANu+hJ6/WHtk0QdrUxPT0KI/Kudqf1iZqDeDem11ow8PSa6gwtQll2pZk8zQgjhTJDrcF2V3vH8bUdyd68jv73Dw==",
1814
1814
  "verification_key": "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"
1815
1815
  },
1816
1816
  {
@@ -3935,7 +3935,7 @@
3935
3935
  }
3936
3936
  },
3937
3937
  "bytecode": "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",
3938
- "debug_symbols": "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"
3938
+ "debug_symbols": "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"
3939
3939
  },
3940
3940
  {
3941
3941
  "name": "public_dispatch",
@@ -3971,7 +3971,7 @@
3971
3971
  }
3972
3972
  },
3973
3973
  "bytecode": "JwACBAEoAAABBIBFJwAABEUlAAAAQScCAgQBJwIDBAAfCgACAAMARC0IRAElAAAASycCAQRFJwICBAA7DgACAAEpAABDBP////8mJQAAA8opAgACABCO+h4KKgECAycCAgABJAIAAwAAAHAjAAAB/ycCAwQBLQgBBCcCBQQCAAgBBQEnAwQEAQAiBAIFHzoAAwADAAUAKgQDBi0LBgUeAgADAB4CAAQAKQIABgCKSHDsLQgBBycCCAQDAAgBCAEnAwcEAQAiBwIILQoICS0OBgkAIgkCCS0OAgknAgYEAgAiBwIIOQOgAEMAQwAFAAYACCACAAUhAgAGJwIHBAAtCAEJACIJAgwtCwwMLQoMCycCDQQDACoJDQoiOgAGAAcACi0KBgsnAwkEAQAiCQIMLQ4LDAAiDAIMLQ4LDCcCDQQDACoLDQwACAEMAS0KCwgGIggCCCQCAAUAAAGOIwAAAWEtCwkDACIDAgMtDgMJACIJAgUtCwUFLQoFBCcCBgQDACoJBgM8DgQDIwAAAY4KKggHAyQCAAMAAAGkJwIEBAA8BgQBJwIEBAAnAgYEAwAqBAYFLQgBAwAIAQUBJwMDBAEAIgMCBS0OBAUAIgUCBS0OBAUnAgUEAwAqAwUEACIDAgYtCwYGLQoGBScCCAQDACoDCAQ7DgAFAAQjAAAB/ycCAwJVJwIEAm4nAgUCaycCBgJvJwIHAncnAggCICcCCQJzJwIKAmUnAgsCbCcCDAJjJwINAnQnAg4CcicCDwJ7JwIQAn0tCAERJwISBBwACAESAScDEQQBACIRAhItChITLQ4DEwAiEwITLQ4EEwAiEwITLQ4FEwAiEwITLQ4EEwAiEwITLQ4GEwAiEwITLQ4HEwAiEwITLQ4EEwAiEwITLQ4IEwAiEwITLQ4JEwAiEwITLQ4KEwAiEwITLQ4LEwAiEwITLQ4KEwAiEwITLQ4MEwAiEwITLQ4NEwAiEwITLQ4GEwAiEwITLQ4OEwAiEwITLQ4IEwAiEwITLQ4PEwAiEwITLQ4JEwAiEwITLQ4KEwAiEwITLQ4LEwAiEwITLQ4KEwAiEwITLQ4MEwAiEwITLQ4NEwAiEwITLQ4GEwAiEwITLQ4OEwAiEwITLQ4QEycCAwEAJwIEAQEKKgMEBSQCAAUAAAPKJwIGBB4tCAEHJwIIBB4ACAEIAS0KBwgqAwAIBa2jcsb6poRzACIIAggAIhECCScCCgQbLQIJAy0CCAQtAgoFJQAAA/AnAgkEGwAqCAkILQ4CCAAiCAIILQ4BCAAiCAIIPA4GBygAAAQEeEUMAAAEAyQAAAMAAAPvKgEAAQXaxfXWtEoybTwEAgEmAAADBQctAAMILQAECQoACAcKJAAACgAABCEtAQgGLQQGCQAACAIIAAAJAgkjAAAD/SY=",
3974
- "debug_symbols": "tZjRTuMwEEX/pc99sD3jGZtfQQgVKKtKVUHddqUV6r/vOJ2bhEqxYLX7Qk5u8fX12LHTfqxetk/nH4+7w+vbz9Xd/cfq6bjb73c/Hvdvz5vT7u1g6scqtD/F/sb1qtThEmNa3VG76vWaol/leiW/J79nv2drr3bN7Ndifs1QyCA3MCUFA1WHEgHiUKFUV1KIgAyoDpEBzTkZJAJAafESN2jNpUFrXgxa0isUhxb1CuqgESAOBUrFP1dvToEA3pxaMa/gzSlFABSCQtkhNx9toA6SAK3qNmRqwa6QAdWhMABKS0hWDW4JB4gRIA7JlgFRg+xAUGhUqgMzAEqG0oo5QCvmFdRBE6AptiS4JIA41ADIV8jBlTxk5gbikKAkKASFoDAUhpKhZCgCRaAoFIVSoJTsMEQdwBUJATAq1SESoDikBFAHhBeEF4Yhw5BhOBR8ABgKuhAYKrrAKASjEIxCMAqpMKzehQYCeBcaE8C7UEyBYgqUAiADYMgMgGFGFxmGgi4wF4q5UIVhQRcFhgVdVBhW76KEBPAuChZSwUIqKQAywA0LMQCGTIBmaE9lyQkARaBoAGRAdRjCDwBlCG9QgzgMUQeAkqCkDPDmldB8iNqAoTAURK2IWgWGQ8H1clmvcEg8no7bbTsjZqeGnSXvm+P2cFrdHc77/Xr1a7M/D//0831zGK6nzdE+tY1ne3ixqxm+7vbbRpf11DosN7XtKXprjpRGgxj4qxZ2SpBb2DlRFi1Sx4ILwyKnPFnolwdiJwoGkjSExRS8bFGlbfyDRZUyDYTj5xR52cKe+uIWYgt7ZpE+WUivFhnjEJ0MQv1qJSgHFJNsW1usROlkoDCGoPl8xM8WddkillLgYVynWtzMaexNqqKaqfLiqugNRIqMq2I2pbcDiZ3FSTzOCLFMxdAbC/oXxeD/WAx7kcTCiKQ0WuSbDJ3FmSVjHHaC82IttLPjiFTsOFKnFS43KfoDkTyNJKTFcnYWqATCtiWBZbSgb8TQWMcYnVlNsbd7TtMaeXnr6wepFZtf5BDDYhDqPSqi48Yzf1S+E4SD0BSk5MUgubfOeTwMVP46CNVZEFkM0lmpyV4yxidufqR8K0iUNAaJnSC1twON68w2o+Vnv/vY1XEHsvf8uPTYUWepRh1P6aiz1W5n/lePppLGrbQk/Zu3DfvyxZPF8tsGdXZSCow5oTA7ZL/xusGcxvcm+yK2HKOzmSoGorNa2nvCg91tnnfHT78gXJrPcbd52m/99vV8eJ59evr9jk/wC8T78e15+3I+bpvT9DOEvanep5DWKaYH+/5v2r39CLC27/8Pl9b7Hw=="
3974
+ "debug_symbols": "tZjRTuMwEEX/pc99sD3jGZtfQQgVKKtKVUHddqUV6r/vOJ2bhEqxYLX7Qk5u8fX12LHTfqxetk/nH4+7w+vbz9Xd/cfq6bjb73c/Hvdvz5vT7u1g6scqtD/F/sb1qtThEmNa3VG76vWaol/leiW/J79nv2drr3bN7Ndifs1QyCA3MCUFA1WHEgHiUKFUV1KIgAyoDpEBzTkZJAJAafESN2jNpUFrXgxa0isUhxb1CuqgESAOBUrFP1dvToEA3pxaMa/gzSlFABSCQtkhNx9toA6SAK3qNmRqwa6QAdWhMABKS0hWDW4JB4gRIA7JlgFRg+xAUGhUqgMzAEqG0oo5QCvmFdRBE6AptiS4JIA41ADIV8jBlTxk5gbikKAkKASFoDAUhpKhZCgCRaAoFIVSoJTsMEQdwBUJATAq1SESoDikBFAHhBeEF4Yhw5BhOBR8ABgKuhAYKrrAKASjEIxCMAqpMKzehQYCeBcaE8C7UEyBYgqUAiADYMgMgGFGFxmGgi4wF4q5UIVhQRcFhgVdVBhW76KEBPAuChZSwUIqKQAywA0LMQCGTIBmaE9lyQkARaBoAGRAdRjCDwBlCG9QgzgMUQeAkqCkDPDmldB8iNqAoTAURK2IWgWGQ8H1clmvcEg8no7bbTsjZqeGnSXvm+P2cFrdHc77/Xr1a7M/D//0831zGK6nzdE+tY1ne3ixqxm+7vbbRpf11DosN7XtKXprjpRGgxj4qxZ2SpBb2DlRFi1Sx4ILwyKnPFnolwdiJwoGkjSExRS8bFGlbfyDRZUyDYRj/mSRly3sqS9uIbawZxb6yUJ6tcgYh+jM4MvzQTmgmGTb2mIlSicDhTEEzefjJkVdtoilFHgY16kWN3Mae5OqqGaqvLgqegORIuOqmE3p7UBiZ3ESjzNCLFMx9MaC/kUx+D8Ww14ksTAiKY0W+SZDZ3FmyRiHneC8WAvt7DgiFTuO1GmFy02K/kAkTyMJabGcnQUqgbBtSWAZLegbMTTWMUZnVlPs7Z7TtEZe3vr6QWrF5hc5xLAYhHqPiui48cwfle8E4SA0BSl5MUjurXMeDwOVvw5CdRZEFoN0Vmqyl4zxiZsfKd8KEiWNQWInSO3tQOM6s81o+dnvPnZ13IHsPT8uPXbUWapRx1M66my125n/1aOppHErLUn/5m3DvnzxZLH8tkGdnZQCY04ozA7Zb7xuMKfxvcm+iC3H6GymioHorJbpcnmwu83z7vjpF4RL8znuNk/7rd++ng/Ps09Pv9/xCX6BeD++PW9fzsdtc5p+hrA31fsU0jrF9GDf/027tx8B1vb9/+HSev8D"
3975
3975
  },
3976
3976
  {
3977
3977
  "name": "sync_state",
@@ -4177,7 +4177,7 @@
4177
4177
  }
4178
4178
  },
4179
4179
  "bytecode": "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",
4180
- "debug_symbols": "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"
4180
+ "debug_symbols": "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"
4181
4181
  }
4182
4182
  ],
4183
4183
  "outputs": {
@@ -4803,35 +4803,35 @@
4803
4803
  "path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/types/src/public_keys.nr",
4804
4804
  "source": "use crate::{\n address::public_keys_hash::PublicKeysHash,\n constants::{\n DEFAULT_IVPK_M_X, DEFAULT_IVPK_M_Y, DEFAULT_NPK_M_X, DEFAULT_NPK_M_Y, DEFAULT_OVPK_M_X,\n DEFAULT_OVPK_M_Y, DEFAULT_TPK_M_X, DEFAULT_TPK_M_Y, DOM_SEP__PUBLIC_KEYS_HASH,\n },\n hash::poseidon2_hash_with_separator,\n point::validate_on_curve,\n traits::{Deserialize, Hash, Serialize},\n};\n\nuse std::{default::Default, meta::derive};\nuse std::embedded_curve_ops::EmbeddedCurvePoint as Point;\n\npub trait ToPoint {\n fn to_point(self) -> Point;\n}\n\n#[derive(Deserialize, Eq, Serialize)]\npub struct NpkM {\n pub inner: Point,\n}\n\nimpl ToPoint for NpkM {\n fn to_point(self) -> Point {\n self.inner\n }\n}\n\n// Note: If we store npk_m_hash directly we can remove this trait implementation. See #8091\nimpl Hash for NpkM {\n fn hash(self) -> Field {\n self.inner.hash()\n }\n}\n\n#[derive(Deserialize, Eq, Serialize)]\npub struct IvpkM {\n pub inner: Point,\n}\n\nimpl ToPoint for IvpkM {\n fn to_point(self) -> Point {\n self.inner\n }\n}\n\n#[derive(Deserialize, Eq, Serialize)]\npub struct OvpkM {\n pub inner: Point,\n}\n\nimpl Hash for OvpkM {\n fn hash(self) -> Field {\n self.inner.hash()\n }\n}\n\nimpl ToPoint for OvpkM {\n fn to_point(self) -> Point {\n self.inner\n }\n}\n\n#[derive(Deserialize, Eq, Serialize)]\npub struct TpkM {\n pub inner: Point,\n}\n\nimpl ToPoint for TpkM {\n fn to_point(self) -> Point {\n self.inner\n }\n}\n\n#[derive(Deserialize, Eq, Serialize)]\npub struct PublicKeys {\n pub npk_m: NpkM,\n pub ivpk_m: IvpkM,\n pub ovpk_m: OvpkM,\n pub tpk_m: TpkM,\n}\n\nimpl Default for PublicKeys {\n fn default() -> Self {\n PublicKeys {\n npk_m: NpkM {\n inner: Point { x: DEFAULT_NPK_M_X, y: DEFAULT_NPK_M_Y, is_infinite: false },\n },\n ivpk_m: IvpkM {\n inner: Point { x: DEFAULT_IVPK_M_X, y: DEFAULT_IVPK_M_Y, is_infinite: false },\n },\n ovpk_m: OvpkM {\n inner: Point { x: DEFAULT_OVPK_M_X, y: DEFAULT_OVPK_M_Y, is_infinite: false },\n },\n tpk_m: TpkM {\n inner: Point { x: DEFAULT_TPK_M_X, y: DEFAULT_TPK_M_Y, is_infinite: false },\n },\n }\n }\n}\n\nimpl PublicKeys {\n pub fn hash(self) -> PublicKeysHash {\n PublicKeysHash::from_field(poseidon2_hash_with_separator(\n self.serialize(),\n DOM_SEP__PUBLIC_KEYS_HASH as Field,\n ))\n }\n\n pub fn validate_on_curve(self) {\n validate_on_curve(self.npk_m.inner);\n validate_on_curve(self.ivpk_m.inner);\n validate_on_curve(self.ovpk_m.inner);\n validate_on_curve(self.tpk_m.inner);\n }\n}\n\npub struct AddressPoint {\n pub inner: Point,\n}\n\nimpl ToPoint for AddressPoint {\n fn to_point(self) -> Point {\n self.inner\n }\n}\n\nmod test {\n use crate::{\n point::POINT_LENGTH,\n public_keys::{IvpkM, NpkM, OvpkM, PublicKeys, TpkM},\n traits::{Deserialize, Serialize},\n };\n use std::embedded_curve_ops::EmbeddedCurvePoint as Point;\n\n #[test]\n unconstrained fn compute_public_keys_hash() {\n let keys = PublicKeys {\n npk_m: NpkM { inner: Point { x: 1, y: 2, is_infinite: false } },\n ivpk_m: IvpkM { inner: Point { x: 3, y: 4, is_infinite: false } },\n ovpk_m: OvpkM { inner: Point { x: 5, y: 6, is_infinite: false } },\n tpk_m: TpkM { inner: Point { x: 7, y: 8, is_infinite: false } },\n };\n\n let actual = keys.hash();\n\n // The following value was generated by `public_keys.test.ts`.\n let expected_public_keys_hash =\n 0x056998309f6c119e4d753e404f94fef859dddfa530a9379634ceb0854b29bf7a;\n\n assert(actual.to_field() == expected_public_keys_hash);\n }\n\n #[test]\n unconstrained fn compute_default_hash() {\n let keys = PublicKeys::default();\n\n let actual = keys.hash();\n\n // The following value was generated by `public_keys.test.ts`.\n let test_data_default_hash =\n 0x023547e676dba19784188825b901a0e70d8ad978300d21d6185a54281b734da0;\n\n assert(actual.to_field() == test_data_default_hash);\n }\n\n #[test]\n unconstrained fn serde() {\n let keys = PublicKeys {\n npk_m: NpkM { inner: Point { x: 1, y: 2, is_infinite: false } },\n ivpk_m: IvpkM { inner: Point { x: 3, y: 4, is_infinite: false } },\n ovpk_m: OvpkM { inner: Point { x: 5, y: 6, is_infinite: false } },\n tpk_m: TpkM { inner: Point { x: 7, y: 8, is_infinite: false } },\n };\n\n // We use the PUBLIC_KEYS_LENGTH constant to ensure that there is a match between the derived trait\n let serialized: [Field; POINT_LENGTH * 4] = keys.serialize();\n let deserialized = PublicKeys::deserialize(serialized);\n\n assert_eq(keys, deserialized);\n }\n}\n"
4805
4805
  },
4806
- "395": {
4807
- "path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/types/src/traits.nr",
4808
- "source": "use crate::meta::derive_packable;\nuse crate::utils::field::field_from_bytes;\n\npub use serde::serialization::{Deserialize, Serialize};\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: Eq {\n fn empty() -> Self;\n\n fn is_empty(self) -> bool {\n self.eq(Self::empty())\n }\n\n // Requires this Noir fix: https://github.com/noir-lang/noir/issues/9002\n // fn assert_not_empty<let U: u32>(self, msg: str<U>) { // This msg version was failing with weird compiler errors.\n // // We provide a default impl but it's likely inefficient.\n // // The reason we include this function is because there's a lot of\n // // opportunity for optimisation on a per-struct basis.\n // // You only need to show one element is not empty to know that the whole thing\n // // is not empty.\n // // If you know an element of your struct which should always be nonempty,\n // // you can write an impl that solely checks that that element is nonempty.\n // assert(!self.is_empty(), msg);\n // }\n\n // This default impl is overwritten by types like arrays, because there's a much\n // more efficient approach.\n fn assert_empty<let S: u32>(self, msg: str<S>) {\n assert(self.is_empty(), msg);\n }\n}\n\nimpl Empty for Field {\n #[inline_always]\n fn empty() -> Self {\n 0\n }\n}\n\nimpl Empty for bool {\n #[inline_always]\n fn empty() -> Self {\n false\n }\n}\n\nimpl Empty for u1 {\n #[inline_always]\n fn empty() -> Self {\n 0\n }\n}\nimpl Empty for u8 {\n #[inline_always]\n fn empty() -> Self {\n 0\n }\n}\nimpl Empty for u16 {\n fn empty() -> Self {\n 0\n }\n}\nimpl Empty for u32 {\n #[inline_always]\n fn empty() -> Self {\n 0\n }\n}\nimpl Empty for u64 {\n #[inline_always]\n fn empty() -> Self {\n 0\n }\n}\nimpl Empty for u128 {\n #[inline_always]\n fn empty() -> Self {\n 0\n }\n}\n\nimpl<T, let N: u32> Empty for [T; N]\nwhere\n T: Empty,\n{\n #[inline_always]\n fn empty() -> Self {\n [T::empty(); N]\n }\n\n fn is_empty(self) -> bool {\n self.all(|elem| elem.is_empty())\n }\n\n fn assert_empty<let S: u32>(self, msg: str<S>) -> () {\n self.for_each(|elem| elem.assert_empty(msg))\n }\n}\n\nimpl<T> Empty for [T]\nwhere\n T: Empty,\n{\n #[inline_always]\n fn empty() -> Self {\n [T::empty()]\n }\n\n fn is_empty(self) -> bool {\n self.all(|elem| elem.is_empty())\n }\n\n fn assert_empty<let S: u32>(self, msg: str<S>) -> () {\n self.for_each(|elem| elem.assert_empty(msg))\n }\n}\nimpl<A, B> Empty for (A, B)\nwhere\n A: Empty,\n B: Empty,\n{\n #[inline_always]\n fn empty() -> Self {\n (A::empty(), B::empty())\n }\n}\n\nimpl<T> Empty for Option<T>\nwhere\n T: Eq,\n{\n #[inline_always]\n fn empty() -> Self {\n Option::none()\n }\n}\n\n// pub fn is_empty<T>(item: T) -> bool\n// where\n// T: Empty,\n// {\n// item.eq(T::empty())\n// }\n\n// pub fn is_empty_array<T, let N: u32>(array: [T; N]) -> bool\n// where\n// T: Empty,\n// {\n// array.all(|elem| is_empty(elem))\n// }\n\n// pub fn assert_empty<T>(item: T) -> ()\n// where\n// T: Empty,\n// {\n// assert(item.eq(T::empty()))\n// }\n\n// pub fn assert_empty_array<T, let N: u32>(array: [T; N]) -> ()\n// where\n// T: Empty,\n// {\n// // A cheaper option than `is_empty_array` for if you don't need to gracefully\n// // handle a bool result.\n// // Avoids the `&` operator of `is_empty_array`'s `.all()` call.\n// for i in 0..N {\n// assert(is_empty(array[i]));\n// }\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 #[inline_always]\n fn to_field(self) -> Field {\n self\n }\n}\n\nimpl ToField for bool {\n #[inline_always]\n fn to_field(self) -> Field {\n self as Field\n }\n}\nimpl ToField for u1 {\n #[inline_always]\n fn to_field(self) -> Field {\n self as Field\n }\n}\nimpl ToField for u8 {\n #[inline_always]\n fn to_field(self) -> Field {\n self as Field\n }\n}\nimpl ToField for u16 {\n fn to_field(self) -> Field {\n self as Field\n }\n}\nimpl ToField for u32 {\n #[inline_always]\n fn to_field(self) -> Field {\n self as Field\n }\n}\nimpl ToField for u64 {\n #[inline_always]\n fn to_field(self) -> Field {\n self as Field\n }\n}\nimpl ToField for u128 {\n #[inline_always]\n fn to_field(self) -> Field {\n self as Field\n }\n}\nimpl<let N: u32> ToField for str<N> {\n #[inline_always]\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 #[inline_always]\n fn from_field(value: Field) -> Self {\n value\n }\n}\n\nimpl FromField for bool {\n #[inline_always]\n fn from_field(value: Field) -> Self {\n value != 0\n }\n}\nimpl FromField for u1 {\n #[inline_always]\n fn from_field(value: Field) -> Self {\n value as u1\n }\n}\nimpl FromField for u8 {\n #[inline_always]\n fn from_field(value: Field) -> Self {\n value as u8\n }\n}\nimpl FromField for u16 {\n fn from_field(value: Field) -> Self {\n value as u16\n }\n}\nimpl FromField for u32 {\n #[inline_always]\n fn from_field(value: Field) -> Self {\n value as u32\n }\n}\nimpl FromField for u64 {\n #[inline_always]\n fn from_field(value: Field) -> Self {\n value as u64\n }\n}\nimpl FromField for u128 {\n #[inline_always]\n fn from_field(value: Field) -> Self {\n value as u128\n }\n}\n\n/// Space-efficient packing and unpacking in `Field` arrays.\n///\n/// The `Packable` trait allows types to be serialized and deserialized with a focus on minimizing the size of\n/// the resulting Field array. This trait is used when storage efficiency is critical (e.g. when storing data\n/// in the contract's public storage).\n///\n/// # Associated Constants\n/// * `N` - The length of the Field array, known at compile time\n#[derive_via(derive_packable)]\npub trait Packable {\n let N: u32;\n\n /// Packs the current value into a compact array of `Field` elements.\n fn pack(self) -> [Field; N];\n\n /// Unpacks a compact array of `Field` elements into the original value.\n fn unpack(fields: [Field; N]) -> Self;\n}\n\n#[test]\nunconstrained fn bounded_vec_serialization() {\n // Test empty BoundedVec\n let empty_vec: BoundedVec<Field, 3> = BoundedVec::from_array([]);\n let serialized = empty_vec.serialize();\n let deserialized = BoundedVec::<Field, 3>::deserialize(serialized);\n assert_eq(empty_vec, deserialized);\n assert_eq(deserialized.len(), 0);\n\n // Test partially filled BoundedVec\n let partial_vec: BoundedVec<[u32; 2], 3> = BoundedVec::from_array([[1, 2]]);\n let serialized = partial_vec.serialize();\n let deserialized = BoundedVec::<[u32; 2], 3>::deserialize(serialized);\n assert_eq(partial_vec, deserialized);\n assert_eq(deserialized.len(), 1);\n assert_eq(deserialized.get(0), [1, 2]);\n\n // Test full BoundedVec\n let full_vec: BoundedVec<[u32; 2], 3> = BoundedVec::from_array([[1, 2], [3, 4], [5, 6]]);\n let serialized = full_vec.serialize();\n let deserialized = BoundedVec::<[u32; 2], 3>::deserialize(serialized);\n assert_eq(full_vec, deserialized);\n assert_eq(deserialized.len(), 3);\n assert_eq(deserialized.get(0), [1, 2]);\n assert_eq(deserialized.get(1), [3, 4]);\n assert_eq(deserialized.get(2), [5, 6]);\n}\n"
4806
+ "400": {
4807
+ "path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/types/src/traits/to_field.nr",
4808
+ "source": "use crate::utils::field::field_from_bytes;\n\npub trait ToField {\n fn to_field(self) -> Field;\n}\n\nimpl ToField for Field {\n #[inline_always]\n fn to_field(self) -> Field {\n self\n }\n}\n\nimpl ToField for bool {\n #[inline_always]\n fn to_field(self) -> Field {\n self as Field\n }\n}\nimpl ToField for u1 {\n #[inline_always]\n fn to_field(self) -> Field {\n self as Field\n }\n}\nimpl ToField for u8 {\n #[inline_always]\n fn to_field(self) -> Field {\n self as Field\n }\n}\nimpl ToField for u16 {\n fn to_field(self) -> Field {\n self as Field\n }\n}\nimpl ToField for u32 {\n #[inline_always]\n fn to_field(self) -> Field {\n self as Field\n }\n}\nimpl ToField for u64 {\n #[inline_always]\n fn to_field(self) -> Field {\n self as Field\n }\n}\nimpl ToField for u128 {\n #[inline_always]\n fn to_field(self) -> Field {\n self as Field\n }\n}\nimpl<let N: u32> ToField for str<N> {\n #[inline_always]\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"
4809
4809
  },
4810
- "396": {
4810
+ "401": {
4811
4811
  "path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/types/src/type_packing.nr",
4812
4812
  "source": "use crate::traits::Packable;\n\nglobal BOOL_PACKED_LEN: u32 = 1;\nglobal U8_PACKED_LEN: u32 = 1;\nglobal U16_PACKED_LEN: u32 = 1;\nglobal U32_PACKED_LEN: u32 = 1;\nglobal U64_PACKED_LEN: u32 = 1;\nglobal U128_PACKED_LEN: u32 = 1;\nglobal FIELD_PACKED_LEN: u32 = 1;\nglobal I8_PACKED_LEN: u32 = 1;\nglobal I16_PACKED_LEN: u32 = 1;\nglobal I32_PACKED_LEN: u32 = 1;\nglobal I64_PACKED_LEN: u32 = 1;\n\nimpl Packable for bool {\n let N: u32 = BOOL_PACKED_LEN;\n\n #[inline_always]\n fn pack(self) -> [Field; Self::N] {\n [self as Field]\n }\n\n #[inline_always]\n fn unpack(fields: [Field; Self::N]) -> bool {\n (fields[0] as u1) != 0\n }\n}\n\nimpl Packable for u8 {\n let N: u32 = U8_PACKED_LEN;\n\n #[inline_always]\n fn pack(self) -> [Field; Self::N] {\n [self as Field]\n }\n\n #[inline_always]\n fn unpack(fields: [Field; Self::N]) -> Self {\n fields[0] as u8\n }\n}\n\nimpl Packable for u16 {\n let N: u32 = U16_PACKED_LEN;\n\n #[inline_always]\n fn pack(self) -> [Field; Self::N] {\n [self as Field]\n }\n\n #[inline_always]\n fn unpack(fields: [Field; Self::N]) -> Self {\n fields[0] as u16\n }\n}\n\nimpl Packable for u32 {\n let N: u32 = U32_PACKED_LEN;\n\n #[inline_always]\n fn pack(self) -> [Field; Self::N] {\n [self as Field]\n }\n\n #[inline_always]\n fn unpack(fields: [Field; Self::N]) -> Self {\n fields[0] as u32\n }\n}\n\nimpl Packable for u64 {\n let N: u32 = U64_PACKED_LEN;\n\n #[inline_always]\n fn pack(self) -> [Field; Self::N] {\n [self as Field]\n }\n\n #[inline_always]\n fn unpack(fields: [Field; Self::N]) -> Self {\n fields[0] as u64\n }\n}\n\nimpl Packable for u128 {\n let N: u32 = U128_PACKED_LEN;\n\n #[inline_always]\n fn pack(self) -> [Field; Self::N] {\n [self as Field]\n }\n\n #[inline_always]\n fn unpack(fields: [Field; Self::N]) -> Self {\n fields[0] as u128\n }\n}\n\nimpl Packable for Field {\n let N: u32 = FIELD_PACKED_LEN;\n\n #[inline_always]\n fn pack(self) -> [Field; Self::N] {\n [self]\n }\n\n #[inline_always]\n fn unpack(fields: [Field; Self::N]) -> Self {\n fields[0]\n }\n}\n\nimpl Packable for i8 {\n let N: u32 = I8_PACKED_LEN;\n\n #[inline_always]\n fn pack(self) -> [Field; Self::N] {\n [self as u8 as Field]\n }\n\n #[inline_always]\n fn unpack(fields: [Field; Self::N]) -> Self {\n fields[0] as u8 as i8\n }\n}\n\nimpl Packable for i16 {\n let N: u32 = I16_PACKED_LEN;\n\n #[inline_always]\n fn pack(self) -> [Field; Self::N] {\n [self as u16 as Field]\n }\n\n #[inline_always]\n fn unpack(fields: [Field; Self::N]) -> Self {\n fields[0] as u16 as i16\n }\n}\n\nimpl Packable for i32 {\n let N: u32 = I32_PACKED_LEN;\n\n #[inline_always]\n fn pack(self) -> [Field; Self::N] {\n [self as u32 as Field]\n }\n\n #[inline_always]\n fn unpack(fields: [Field; Self::N]) -> Self {\n fields[0] as u32 as i32\n }\n}\n\nimpl Packable for i64 {\n let N: u32 = I64_PACKED_LEN;\n\n #[inline_always]\n fn pack(self) -> [Field; Self::N] {\n [self as u64 as Field]\n }\n\n #[inline_always]\n fn unpack(fields: [Field; Self::N]) -> Self {\n fields[0] as u64 as i64\n }\n}\n\nimpl<T, let M: u32> Packable for [T; M]\nwhere\n T: Packable,\n{\n let N: u32 = M * <T as Packable>::N;\n\n #[inline_always]\n fn pack(self) -> [Field; Self::N] {\n let mut result: [Field; Self::N] = std::mem::zeroed();\n for i in 0..M {\n let serialized = self[i].pack();\n for j in 0..<T as Packable>::N {\n result[i * <T as Packable>::N + j] = serialized[j];\n }\n }\n result\n }\n\n #[inline_always]\n fn unpack(fields: [Field; Self::N]) -> Self {\n let mut reader = crate::utils::reader::Reader::new(fields);\n let mut result: [T; M] = std::mem::zeroed();\n reader.read_struct_array::<T, <T as Packable>::N, M>(Packable::unpack, result)\n }\n}\n\n#[test]\nfn test_u16_packing() {\n let a: u16 = 10;\n assert_eq(a, u16::unpack(a.pack()));\n}\n\n#[test]\nfn test_i8_packing() {\n let a: i8 = -10;\n assert_eq(a, i8::unpack(a.pack()));\n}\n\n#[test]\nfn test_i16_packing() {\n let a: i16 = -10;\n assert_eq(a, i16::unpack(a.pack()));\n}\n\n#[test]\nfn test_i32_packing() {\n let a: i32 = -10;\n assert_eq(a, i32::unpack(a.pack()));\n}\n\n#[test]\nfn test_i64_packing() {\n let a: i64 = -10;\n assert_eq(a, i64::unpack(a.pack()));\n}\n"
4813
4813
  },
4814
- "403": {
4814
+ "408": {
4815
4815
  "path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/types/src/utils/field.nr",
4816
4816
  "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\npub fn min(f1: Field, f2: Field) -> Field {\n if f1.lt(f2) {\n f1\n } else {\n f2\n }\n}\n\n// TODO: write doc-comments and tests for these magic constants.\n\nglobal KNOWN_NON_RESIDUE: Field = 5; // This is a non-residue in Noir's native Field.\nglobal C1: u32 = 28;\nglobal C3: Field = 40770029410420498293352137776570907027550720424234931066070132305055;\nglobal C5: Field = 19103219067921713944291392827692070036145651957329286315305642004821462161904;\n\n// @dev: only use this for _huge_ exponents y, when writing a constrained function.\n// If you're only exponentiating by a small value, first consider writing-out the multiplications by hand.\n// Only after you've measured the gates of that approach, consider using the native Field::pow_32 function.\n// Only if your exponent is larger than 32 bits, resort to using this function.\npub fn pow(x: Field, y: Field) -> Field {\n let mut r = 1 as Field;\n let b: [u1; 254] = y.to_le_bits();\n\n for i in 0..254 {\n r *= r;\n r *= (b[254 - 1 - i] as Field) * x + (1 - b[254 - 1 - i] as Field);\n }\n\n r\n}\n\n/// Returns Option::some(sqrt) if there is a square root, and Option::none() if there isn't.\npub fn sqrt(x: Field) -> Option<Field> {\n // Safety: if the hint returns the square root of x, then we simply square it\n // check the result equals x. If x is not square, we return a value that\n // enables us to prove that fact (see the `else` clause below).\n let (is_sq, maybe_sqrt) = unsafe { __sqrt(x) };\n\n if is_sq {\n let sqrt = maybe_sqrt;\n validate_sqrt_hint(x, sqrt);\n Option::some(sqrt)\n } else {\n let not_sqrt_hint = maybe_sqrt;\n validate_not_sqrt_hint(x, not_sqrt_hint);\n Option::none()\n }\n}\n\n// Boolean indicating whether Field element is a square, i.e. whether there exists a y in Field s.t. x = y*y.\nunconstrained fn is_square(x: Field) -> bool {\n let v = pow(x, -1 / 2);\n v * (v - 1) == 0\n}\n\n// Tonelli-Shanks algorithm for computing the square root of a Field element.\n// Requires C1 = max{c: 2^c divides (p-1)}, where p is the order of Field\n// as well as C3 = (C2 - 1)/2, where C2 = (p-1)/(2^c1),\n// and C5 = ZETA^C2, where ZETA is a non-square element of Field.\n// These are pre-computed above as globals.\nunconstrained fn tonelli_shanks_sqrt(x: Field) -> Field {\n let mut z = pow(x, C3);\n let mut t = z * z * x;\n z *= x;\n let mut b = t;\n let mut c = C5;\n\n for i in 0..(C1 - 1) {\n for _j in 1..(C1 - i - 1) {\n b *= b;\n }\n\n z *= if b == 1 { 1 } else { c };\n\n c *= c;\n\n t *= if b == 1 { 1 } else { c };\n\n b = t;\n }\n\n z\n}\n\n// NB: this doesn't return an option, because in the case of there _not_ being a square root, we still want to return a field element that allows us to then assert in the _constrained_ sqrt function that there is no sqrt.\nunconstrained fn __sqrt(x: Field) -> (bool, Field) {\n let is_sq = is_square(x);\n if is_sq {\n let sqrt = tonelli_shanks_sqrt(x);\n (true, sqrt)\n } else {\n // Demonstrate that x is not a square (a.k.a. a \"quadratic non-residue\").\n // Facts:\n // The Legendre symbol (\"LS\") of x, is x^((p-1)/2) (mod p).\n // - If x is a square, LS(x) = 1\n // - If x is not a square, LS(x) = -1\n // - If x = 0, LS(x) = 0.\n //\n // Hence:\n // sq * sq = sq // 1 * 1 = 1\n // non-sq * non-sq = sq // -1 * -1 = 1\n // sq * non-sq = non-sq // -1 * 1 = -1\n //\n // See: https://en.wikipedia.org/wiki/Legendre_symbol\n let demo_x_not_square = x * KNOWN_NON_RESIDUE;\n let not_sqrt = tonelli_shanks_sqrt(demo_x_not_square);\n (false, not_sqrt)\n }\n}\n\nfn validate_sqrt_hint(x: Field, hint: Field) {\n assert(hint * hint == x, f\"The claimed_sqrt {hint} is not the sqrt of x {x}\");\n}\n\nfn validate_not_sqrt_hint(x: Field, hint: Field) {\n // We need this assertion, because x = 0 would pass the other assertions in this\n // function, and we don't want people to be able to prove that 0 is not square!\n assert(x != 0, \"0 has a square root; you cannot claim it is not square\");\n // Demonstrate that x is not a square (a.k.a. a \"quadratic non-residue\").\n //\n // Facts:\n // The Legendre symbol (\"LS\") of x, is x^((p-1)/2) (mod p).\n // - If x is a square, LS(x) = 1\n // - If x is not a square, LS(x) = -1\n // - If x = 0, LS(x) = 0.\n //\n // Hence:\n // 1. sq * sq = sq // 1 * 1 = 1\n // 2. non-sq * non-sq = sq // -1 * -1 = 1\n // 3. sq * non-sq = non-sq // -1 * 1 = -1\n //\n // See: https://en.wikipedia.org/wiki/Legendre_symbol\n //\n // We want to demonstrate that this below multiplication falls under bullet-point (2):\n let demo_x_not_square = x * KNOWN_NON_RESIDUE;\n // I.e. we want to demonstrate that `demo_x_not_square` has Legendre symbol 1\n // (i.e. that it is a square), so we prove that it is square below.\n // Why do we want to prove that it has LS 1?\n // Well, since it was computed with a known-non-residue, its squareness implies we're\n // in case 2 (something multiplied by a known-non-residue yielding a result which\n // has a LS of 1), which implies that x must be a non-square. The unconstrained\n // function gave us the sqrt of demo_x_not_square, so all we need to do is\n // assert its squareness:\n assert(\n hint * hint == demo_x_not_square,\n f\"The hint {hint} does not demonstrate that {x} is not a square\",\n );\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] = field2.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\n#[test]\nunconstrained fn sqrt_valid_test() {\n let x = 16; // examples: 16, 9, 25, 81\n let result = sqrt(x);\n assert(result.is_some());\n assert_eq(result.unwrap() * result.unwrap(), x);\n}\n\n#[test]\nunconstrained fn sqrt_invalid_test() {\n let x = KNOWN_NON_RESIDUE; // has no square root in the field\n let result = sqrt(x);\n assert(result.is_none());\n}\n\n#[test]\nunconstrained fn sqrt_zero_test() {\n let result = sqrt(0);\n assert(result.is_some());\n assert_eq(result.unwrap(), 0);\n}\n\n#[test]\nunconstrained fn sqrt_one_test() {\n let result = sqrt(1);\n assert(result.is_some());\n assert_eq(result.unwrap() * result.unwrap(), 1);\n}\n\n#[test]\nunconstrained fn field_from_bytes_empty_test() {\n let empty: [u8; 0] = [];\n let result = field_from_bytes(empty, true);\n assert_eq(result, 0);\n\n let result_le = field_from_bytes(empty, false);\n assert_eq(result_le, 0);\n}\n\n#[test]\nunconstrained fn field_from_bytes_little_endian_test() {\n // Test little-endian conversion: [0x01, 0x02] should be 0x0201 = 513\n let bytes = [0x01, 0x02];\n let result_le = field_from_bytes(bytes, false);\n assert_eq(result_le, 0x0201);\n\n // Compare with big-endian: [0x01, 0x02] should be 0x0102 = 258\n let result_be = field_from_bytes(bytes, true);\n assert_eq(result_be, 0x0102);\n}\n\n#[test]\nunconstrained fn pow_test() {\n assert_eq(pow(2, 0), 1);\n assert_eq(pow(2, 1), 2);\n assert_eq(pow(2, 10), 1024);\n assert_eq(pow(3, 5), 243);\n assert_eq(pow(0, 5), 0);\n assert_eq(pow(1, 100), 1);\n}\n\n#[test]\nunconstrained fn min_test() {\n assert_eq(min(5, 10), 5);\n assert_eq(min(10, 5), 5);\n assert_eq(min(7, 7), 7);\n assert_eq(min(0, 1), 0);\n}\n\n#[test]\nunconstrained fn full_field_comparison_test() {\n assert(full_field_less_than(5, 10));\n assert(!full_field_less_than(10, 5));\n assert(!full_field_less_than(5, 5));\n\n assert(full_field_greater_than(10, 5));\n assert(!full_field_greater_than(5, 10));\n assert(!full_field_greater_than(5, 5));\n}\n\n#[test]\nunconstrained fn sqrt_has_two_roots_test() {\n // Every square has two roots: r and -r (i.e., p - r)\n // sqrt(16) can return 4 or -4\n let x = 16;\n let result = sqrt(x).unwrap();\n assert(result * result == x);\n // The other root is -result\n let other_root = 0 - result;\n assert(other_root * other_root == x);\n // Verify they are different (unless x = 0)\n assert(result != other_root);\n\n // Same for 9: roots are 3 and -3\n let y = 9;\n let result_y = sqrt(y).unwrap();\n assert(result_y * result_y == y);\n let other_root_y = 0 - result_y;\n assert(other_root_y * other_root_y == y);\n assert(result_y != other_root_y);\n}\n\n#[test]\nunconstrained fn sqrt_negative_one_test() {\n let x = 0 - 1;\n let result = sqrt(x);\n assert(result.unwrap() == 0x30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f703636);\n}\n\n#[test]\nunconstrained fn validate_sqrt_hint_valid_test() {\n // 4 is a valid sqrt of 16\n validate_sqrt_hint(16, 4);\n // -4 is also a valid sqrt of 16\n validate_sqrt_hint(16, 0 - 4);\n // 0 is a valid sqrt of 0\n validate_sqrt_hint(0, 0);\n // 1 is a valid sqrt of 1\n validate_sqrt_hint(1, 1);\n // -1 is also a valid sqrt of 1\n validate_sqrt_hint(1, 0 - 1);\n}\n\n#[test(should_fail_with = \"is not the sqrt of x\")]\nunconstrained fn validate_sqrt_hint_invalid_test() {\n // 5 is not a valid sqrt of 16\n validate_sqrt_hint(16, 5);\n}\n\n#[test]\nunconstrained fn validate_not_sqrt_hint_valid_test() {\n // 5 (KNOWN_NON_RESIDUE) is not a square.\n let x = KNOWN_NON_RESIDUE;\n let hint = tonelli_shanks_sqrt(x * KNOWN_NON_RESIDUE);\n validate_not_sqrt_hint(x, hint);\n}\n\n#[test(should_fail_with = \"0 has a square root\")]\nunconstrained fn validate_not_sqrt_hint_zero_test() {\n // 0 has a square root, so we cannot claim it is not square\n validate_not_sqrt_hint(0, 0);\n}\n\n#[test(should_fail_with = \"does not demonstrate that\")]\nunconstrained fn validate_not_sqrt_hint_wrong_hint_test() {\n // Provide a wrong hint for a non-square\n let x = KNOWN_NON_RESIDUE;\n validate_not_sqrt_hint(x, 123);\n}\n"
4817
4817
  },
4818
- "409": {
4819
- "path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/serde/src/reader.nr",
4820
- "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_u64(&mut self) -> u64 {\n self.read() as u64\n }\n\n pub fn read_bool(&mut self) -> bool {\n self.read() != 0\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 peek_offset(&mut self, offset: u32) -> Field {\n self.data[self.offset + offset]\n }\n\n pub fn advance_offset(&mut self, offset: u32) {\n self.offset += offset;\n }\n\n pub fn finish(self) {\n assert_eq(self.offset, self.data.len(), \"Reader did not read all data\");\n }\n}\n"
4821
- },
4822
4818
  "41": {
4823
4819
  "path": "std/option.nr",
4824
4820
  "source": "use crate::cmp::{Eq, Ord, Ordering};\nuse crate::default::Default;\nuse crate::hash::{Hash, Hasher};\n\npub struct Option<T> {\n _is_some: bool,\n _value: T,\n}\n\nimpl<T> Option<T> {\n /// Constructs a None value\n pub fn none() -> Self {\n Self { _is_some: false, _value: crate::mem::zeroed() }\n }\n\n /// Constructs a Some wrapper around the given value\n pub fn some(_value: T) -> Self {\n Self { _is_some: true, _value }\n }\n\n /// True if this Option is None\n pub fn is_none(self) -> bool {\n !self._is_some\n }\n\n /// True if this Option is Some\n pub fn is_some(self) -> bool {\n self._is_some\n }\n\n /// Asserts `self.is_some()` and returns the wrapped value.\n pub fn unwrap(self) -> T {\n assert(self._is_some);\n self._value\n }\n\n /// Returns the inner value without asserting `self.is_some()`\n /// Note that if `self` is `None`, there is no guarantee what value will be returned,\n /// only that it will be of type `T`.\n pub fn unwrap_unchecked(self) -> T {\n self._value\n }\n\n /// Returns the wrapped value if `self.is_some()`. Otherwise, returns the given default value.\n pub fn unwrap_or(self, default: T) -> T {\n if self._is_some {\n self._value\n } else {\n default\n }\n }\n\n /// Returns the wrapped value if `self.is_some()`. Otherwise, calls the given function to return\n /// a default value.\n pub fn unwrap_or_else<Env>(self, default: fn[Env]() -> T) -> T {\n if self._is_some {\n self._value\n } else {\n default()\n }\n }\n\n /// Asserts `self.is_some()` with a provided custom message and returns the contained `Some` value\n pub fn expect<let N: u32, MessageTypes>(self, message: fmtstr<N, MessageTypes>) -> T {\n assert(self.is_some(), message);\n self._value\n }\n\n /// If self is `Some(x)`, this returns `Some(f(x))`. Otherwise, this returns `None`.\n pub fn map<U, Env>(self, f: fn[Env](T) -> U) -> Option<U> {\n if self._is_some {\n Option::some(f(self._value))\n } else {\n Option::none()\n }\n }\n\n /// If self is `Some(x)`, this returns `f(x)`. Otherwise, this returns the given default value.\n pub fn map_or<U, Env>(self, default: U, f: fn[Env](T) -> U) -> U {\n if self._is_some {\n f(self._value)\n } else {\n default\n }\n }\n\n /// If self is `Some(x)`, this returns `f(x)`. Otherwise, this returns `default()`.\n pub fn map_or_else<U, Env1, Env2>(self, default: fn[Env1]() -> U, f: fn[Env2](T) -> U) -> U {\n if self._is_some {\n f(self._value)\n } else {\n default()\n }\n }\n\n /// Returns None if self is None. Otherwise, this returns `other`.\n pub fn and(self, other: Self) -> Self {\n if self.is_none() {\n Option::none()\n } else {\n other\n }\n }\n\n /// If self is None, this returns None. Otherwise, this calls the given function\n /// with the Some value contained within self, and returns the result of that call.\n ///\n /// In some languages this function is called `flat_map` or `bind`.\n pub fn and_then<U, Env>(self, f: fn[Env](T) -> Option<U>) -> Option<U> {\n if self._is_some {\n f(self._value)\n } else {\n Option::none()\n }\n }\n\n /// If self is Some, return self. Otherwise, return `other`.\n pub fn or(self, other: Self) -> Self {\n if self._is_some {\n self\n } else {\n other\n }\n }\n\n /// If self is Some, return self. Otherwise, return `default()`.\n pub fn or_else<Env>(self, default: fn[Env]() -> Self) -> Self {\n if self._is_some {\n self\n } else {\n default()\n }\n }\n\n // If only one of the two Options is Some, return that option.\n // Otherwise, if both options are Some or both are None, None is returned.\n pub fn xor(self, other: Self) -> Self {\n if self._is_some {\n if other._is_some {\n Option::none()\n } else {\n self\n }\n } else if other._is_some {\n other\n } else {\n Option::none()\n }\n }\n\n /// Returns `Some(x)` if self is `Some(x)` and `predicate(x)` is true.\n /// Otherwise, this returns `None`\n pub fn filter<Env>(self, predicate: fn[Env](T) -> bool) -> Self {\n if self._is_some {\n if predicate(self._value) {\n self\n } else {\n Option::none()\n }\n } else {\n Option::none()\n }\n }\n\n /// Flattens an Option<Option<T>> into a Option<T>.\n /// This returns None if the outer Option is None. Otherwise, this returns the inner Option.\n pub fn flatten(option: Option<Option<T>>) -> Option<T> {\n if option._is_some {\n option._value\n } else {\n Option::none()\n }\n }\n}\n\nimpl<T> Default for Option<T> {\n fn default() -> Self {\n Option::none()\n }\n}\n\nimpl<T> Eq for Option<T>\nwhere\n T: Eq,\n{\n fn eq(self, other: Self) -> bool {\n if self._is_some == other._is_some {\n if self._is_some {\n self._value == other._value\n } else {\n true\n }\n } else {\n false\n }\n }\n}\n\nimpl<T> Hash for Option<T>\nwhere\n T: Hash,\n{\n fn hash<H>(self, state: &mut H)\n where\n H: Hasher,\n {\n self._is_some.hash(state);\n if self._is_some {\n self._value.hash(state);\n }\n }\n}\n\n// For this impl we're declaring Option::none < Option::some\nimpl<T> Ord for Option<T>\nwhere\n T: Ord,\n{\n fn cmp(self, other: Self) -> Ordering {\n if self._is_some {\n if other._is_some {\n self._value.cmp(other._value)\n } else {\n Ordering::greater()\n }\n } else if other._is_some {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n"
4825
4821
  },
4826
- "410": {
4822
+ "414": {
4823
+ "path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/serde/src/reader.nr",
4824
+ "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_u64(&mut self) -> u64 {\n self.read() as u64\n }\n\n pub fn read_bool(&mut self) -> bool {\n self.read() != 0\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 peek_offset(&mut self, offset: u32) -> Field {\n self.data[self.offset + offset]\n }\n\n pub fn advance_offset(&mut self, offset: u32) {\n self.offset += offset;\n }\n\n pub fn finish(self) {\n assert_eq(self.offset, self.data.len(), \"Reader did not read all data\");\n }\n}\n"
4825
+ },
4826
+ "415": {
4827
4827
  "path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/serde/src/serialization.nr",
4828
4828
  "source": "use crate::{reader::Reader, writer::Writer};\n\n// docs:start:serialize\n/// Trait for serializing Noir types into arrays of Fields.\n///\n/// An implementation of the Serialize trait has to follow Noir's intrinsic serialization (each member of a struct\n/// converted directly into one or more Fields without any packing or compression). This trait (and Deserialize) are\n/// typically used to communicate between Noir and TypeScript (via oracles and function arguments).\n///\n/// # On Following Noir's Intrinsic Serialization\n/// When calling a Noir function from TypeScript (TS), first the function arguments are serialized into an array\n/// of fields. This array is then included in the initial witness. Noir's intrinsic serialization is then used\n/// to deserialize the arguments from the witness. When the same Noir function is called from Noir this Serialize trait\n/// is used instead of the serialization in TS. For this reason we need to have a match between TS serialization,\n/// Noir's intrinsic serialization and the implementation of this trait. If there is a mismatch, the function calls\n/// fail with an arguments hash mismatch error message.\n///\n/// # Associated Constants\n/// * `N` - The length of the output Field array, known at compile time\n///\n/// # Example\n/// ```\n/// impl<let N: u32> Serialize for str<N> {\n/// let N: u32 = N;\n///\n/// fn serialize(self) -> [Field; Self::N] {\n/// let mut writer: Writer<Self::N> = Writer::new();\n/// self.stream_serialize(&mut writer);\n/// writer.finish()\n/// }\n///\n/// fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n/// let bytes = self.as_bytes();\n/// for i in 0..bytes.len() {\n/// writer.write(bytes[i] as Field);\n/// }\n/// }\n/// }\n/// ```\n#[derive_via(derive_serialize)]\npub trait Serialize {\n let N: u32;\n\n fn serialize(self) -> [Field; Self::N];\n\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>);\n}\n\n/// Generates a `Serialize` trait implementation for a struct type.\n///\n/// # Parameters\n/// - `s`: The struct type definition to generate the implementation for\n///\n/// # Returns\n/// A quoted code block containing the trait implementation\n///\n/// # Example\n/// For a struct defined as:\n/// ```\n/// struct Log<N> {\n/// fields: [Field; N],\n/// length: u32\n/// }\n/// ```\n///\n/// This function generates code equivalent to:\n/// ```\n/// impl<let N: u32> Serialize for Log<N> {\n/// let N: u32 = <[Field; N] as Serialize>::N + <u32 as Serialize>::N;\n///\n/// fn serialize(self) -> [Field; Self::N] {\n/// let mut writer: Writer<Self::N> = Writer::new();\n/// self.stream_serialize(&mut writer);\n/// writer.finish()\n/// }\n///\n/// #[inline_always]\n/// fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n/// Serialize::stream_serialize(self.fields, writer);\n/// Serialize::stream_serialize(self.length, writer);\n/// }\n/// }\n/// ```\npub comptime fn derive_serialize(s: TypeDefinition) -> Quoted {\n let typ = s.as_type();\n let nested_struct = typ.as_data_type().unwrap();\n\n // We care only about the name and type so we drop the last item of the tuple\n let params = nested_struct.0.fields(nested_struct.1).map(|(name, typ, _)| (name, typ));\n\n // Generates the generic parameter declarations (to be placed after the `impl` keyword) and the `where` clause\n // for the `Serialize` trait.\n let generics_declarations = get_generics_declarations(s);\n let where_serialize_clause = get_where_trait_clause(s, quote {Serialize});\n\n let params_len_quote = get_params_len_quote(params);\n\n let function_body = params\n .map(|(name, _typ): (Quoted, Type)| {\n quote {\n $crate::serialization::Serialize::stream_serialize(self.$name, writer);\n }\n })\n .join(quote {});\n\n quote {\n impl$generics_declarations $crate::serialization::Serialize for $typ\n $where_serialize_clause\n {\n let N: u32 = $params_len_quote;\n\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: $crate::writer::Writer<Self::N> = $crate::writer::Writer::new();\n $crate::serialization::Serialize::stream_serialize(self, &mut writer);\n writer.finish()\n }\n\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut $crate::writer::Writer<K>) {\n $function_body\n }\n }\n }\n}\n\n// docs:start:deserialize\n/// Trait for deserializing Noir types from arrays of Fields.\n///\n/// An implementation of the Deserialize trait has to follow Noir's intrinsic serialization (each member of a struct\n/// converted directly into one or more Fields without any packing or compression). This trait is typically used when\n/// deserializing return values from function calls in Noir. Since the same function could be called from TypeScript\n/// (TS), in which case the TS deserialization would get used, we need to have a match between the 2.\n///\n/// # Associated Constants\n/// * `N` - The length of the input Field array, known at compile time\n///\n/// # Example\n/// ```\n/// impl<let M: u32> Deserialize for str<M> {\n/// let N: u32 = M;\n///\n/// fn deserialize(fields: [Field; Self::N]) -> Self {\n/// let mut reader = Reader::new(fields);\n/// let result = Self::stream_deserialize(&mut reader);\n/// reader.finish();\n/// result\n/// }\n///\n/// fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n/// let mut bytes = [0 as u8; M];\n/// for i in 0..M {\n/// bytes[i] = reader.read() as u8;\n/// }\n/// str::<M>::from(bytes)\n/// }\n/// }\n/// ```\n#[derive_via(derive_deserialize)]\npub trait Deserialize {\n let N: u32;\n\n fn deserialize(fields: [Field; Self::N]) -> Self;\n\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self;\n}\n\n/// Generates a `Deserialize` trait implementation for a given struct `s`.\n///\n/// # Arguments\n/// * `s` - The struct type definition to generate the implementation for\n///\n/// # Returns\n/// A `Quoted` block containing the generated trait implementation\n///\n/// # Requirements\n/// Each struct member type must implement the `Deserialize` trait (it gets used in the generated code).\n///\n/// # Example\n/// For a struct like:\n/// ```\n/// struct MyStruct {\n/// x: AztecAddress,\n/// y: Field,\n/// }\n/// ```\n///\n/// This generates:\n/// ```\n/// impl Deserialize for MyStruct {\n/// let N: u32 = <AztecAddress as Deserialize>::N + <Field as Deserialize>::N;\n///\n/// fn deserialize(fields: [Field; Self::N]) -> Self {\n/// let mut reader = Reader::new(fields);\n/// let result = Self::stream_deserialize(&mut reader);\n/// reader.finish();\n/// result\n/// }\n///\n/// #[inline_always]\n/// fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n/// let x = <AztecAddress as Deserialize>::stream_deserialize(reader);\n/// let y = <Field as Deserialize>::stream_deserialize(reader);\n/// Self { x, y }\n/// }\n/// }\n/// ```\npub comptime fn derive_deserialize(s: TypeDefinition) -> Quoted {\n let typ = s.as_type();\n let nested_struct = typ.as_data_type().unwrap();\n let params = nested_struct.0.fields(nested_struct.1);\n\n // Generates the generic parameter declarations (to be placed after the `impl` keyword) and the `where` clause\n // for the `Deserialize` trait.\n let generics_declarations = get_generics_declarations(s);\n let where_deserialize_clause = get_where_trait_clause(s, quote {Deserialize});\n\n // The following will give us:\n // <type_of_struct_member_1 as Deserialize>::N + <type_of_struct_member_2 as Deserialize>::N + ...\n // (or 0 if the struct has no members)\n let right_hand_side_of_definition_of_n = if params.len() > 0 {\n params\n .map(|(_, param_type, _): (Quoted, Type, Quoted)| {\n quote {\n <$param_type as $crate::serialization::Deserialize>::N\n }\n })\n .join(quote {+})\n } else {\n quote {0}\n };\n\n // For structs containing a single member, we can enhance performance by directly deserializing the input array,\n // bypassing the need for loop-based array construction. While this optimization yields significant benefits in\n // Brillig where the loops are expected to not be optimized, it is not relevant in ACIR where the loops are\n // expected to be optimized away.\n let function_body = if params.len() > 1 {\n // This generates deserialization code for each struct member and concatenates them together.\n let deserialization_of_struct_members = params\n .map(|(param_name, param_type, _): (Quoted, Type, Quoted)| {\n quote {\n let $param_name = <$param_type as Deserialize>::stream_deserialize(reader);\n }\n })\n .join(quote {});\n\n // We join the struct member names with a comma to be used in the `Self { ... }` syntax\n // This will give us e.g. `a, b, c` for a struct with three fields named `a`, `b`, and `c`.\n let struct_members = params\n .map(|(param_name, _, _): (Quoted, Type, Quoted)| quote { $param_name })\n .join(quote {,});\n\n quote {\n $deserialization_of_struct_members\n\n Self { $struct_members }\n }\n } else if params.len() == 1 {\n let param_name = params[0].0;\n quote {\n Self { $param_name: $crate::serialization::Deserialize::stream_deserialize(reader) }\n }\n } else {\n quote {\n Self {}\n }\n };\n\n quote {\n impl$generics_declarations $crate::serialization::Deserialize for $typ\n $where_deserialize_clause\n {\n let N: u32 = $right_hand_side_of_definition_of_n;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = $crate::reader::Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut $crate::reader::Reader<K>) -> Self {\n $function_body\n }\n }\n }\n}\n\n/// Generates a quoted expression that computes the total serialized length of function parameters.\n///\n/// # Parameters\n/// * `params` - An array of tuples where each tuple contains a quoted parameter name and its Type. The type needs\n/// to implement the Serialize trait.\n///\n/// # Returns\n/// A quoted expression that evaluates to:\n/// * `0` if there are no parameters\n/// * `(<type1 as Serialize>::N + <type2 as Serialize>::N + ...)` for one or more parameters\ncomptime fn get_params_len_quote(params: [(Quoted, Type)]) -> Quoted {\n if params.len() == 0 {\n quote { 0 }\n } else {\n let params_quote_without_parentheses = params\n .map(|(_, param_type): (Quoted, Type)| {\n quote {\n <$param_type as $crate::serialization::Serialize>::N\n }\n })\n .join(quote {+});\n quote { ($params_quote_without_parentheses) }\n }\n}\n\ncomptime fn get_generics_declarations(s: TypeDefinition) -> Quoted {\n let generics = s.generics();\n\n if generics.len() > 0 {\n let generics_declarations_items = generics\n .map(|(name, maybe_integer_typ)| {\n // The second item in the generics tuple is an Option of an integer type that is Some only if\n // the generic is numeric.\n if maybe_integer_typ.is_some() {\n // The generic is numeric, so we return a quote defined as e.g. \"let N: u32\"\n let integer_type = maybe_integer_typ.unwrap();\n quote {let $name: $integer_type}\n } else {\n // The generic is not numeric, so we return a quote containing the name of the generic (e.g. \"T\")\n quote {$name}\n }\n })\n .join(quote {,});\n quote {<$generics_declarations_items>}\n } else {\n // The struct doesn't have any generics defined, so we just return an empty quote.\n quote {}\n }\n}\n\ncomptime fn get_where_trait_clause(s: TypeDefinition, trait_name: Quoted) -> Quoted {\n let generics = s.generics();\n\n // The second item in the generics tuple is an Option of an integer type that is Some only if the generic is\n // numeric.\n let non_numeric_generics =\n generics.filter(|(_, maybe_integer_typ)| maybe_integer_typ.is_none());\n\n if non_numeric_generics.len() > 0 {\n let non_numeric_generics_declarations =\n non_numeric_generics.map(|(name, _)| quote {$name: $trait_name}).join(quote {,});\n quote {where $non_numeric_generics_declarations}\n } else {\n // There are no non-numeric generics, so we return an empty quote.\n quote {}\n }\n}\n"
4829
4829
  },
4830
- "412": {
4830
+ "417": {
4831
4831
  "path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/serde/src/type_impls.nr",
4832
- "source": "use crate::{reader::Reader, serialization::{Deserialize, Serialize}, writer::Writer};\nuse std::embedded_curve_ops::EmbeddedCurvePoint;\nuse std::embedded_curve_ops::EmbeddedCurveScalar;\n\nglobal U1_SERIALIZED_LEN: u32 = 1;\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 for bool {\n let N: u32 = BOOL_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as Field);\n }\n}\n\nimpl Deserialize for bool {\n let N: u32 = BOOL_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> bool {\n reader.read() != 0\n }\n}\n\nimpl Serialize for u1 {\n let N: u32 = U1_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as Field);\n }\n}\n\nimpl Deserialize for u1 {\n let N: u32 = U1_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u1\n }\n}\n\nimpl Serialize for u8 {\n let N: u32 = U8_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as Field);\n }\n}\n\nimpl Deserialize for u8 {\n let N: u32 = U8_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u8\n }\n}\n\nimpl Serialize for u16 {\n let N: u32 = U16_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as Field);\n }\n}\n\nimpl Deserialize for u16 {\n let N: u32 = U16_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u16\n }\n}\n\nimpl Serialize for u32 {\n let N: u32 = U32_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as Field);\n }\n}\n\nimpl Deserialize for u32 {\n let N: u32 = U32_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u32\n }\n}\n\nimpl Serialize for u64 {\n let N: u32 = U64_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as Field);\n }\n}\n\nimpl Deserialize for u64 {\n let N: u32 = U64_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u64\n }\n}\n\nimpl Serialize for u128 {\n let N: u32 = U128_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as Field);\n }\n}\n\nimpl Deserialize for u128 {\n let N: u32 = U128_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u128\n }\n}\n\nimpl Serialize for Field {\n let N: u32 = FIELD_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self);\n }\n}\n\nimpl Deserialize for Field {\n let N: u32 = FIELD_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read()\n }\n}\n\nimpl Serialize for i8 {\n let N: u32 = I8_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as u8 as Field);\n }\n}\n\nimpl Deserialize for i8 {\n let N: u32 = I8_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u8 as i8\n }\n}\n\nimpl Serialize for i16 {\n let N: u32 = I16_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as u16 as Field);\n }\n}\n\nimpl Deserialize for i16 {\n let N: u32 = I16_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u16 as i16\n }\n}\n\nimpl Serialize for i32 {\n let N: u32 = I32_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as u32 as Field);\n }\n}\n\nimpl Deserialize for i32 {\n let N: u32 = I32_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u32 as i32\n }\n}\n\nimpl Serialize for i64 {\n let N: u32 = I64_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as u64 as Field);\n }\n}\n\nimpl Deserialize for i64 {\n let N: u32 = I64_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u64 as i64\n }\n}\n\nimpl<T, let M: u32> Serialize for [T; M]\nwhere\n T: Serialize,\n{\n let N: u32 = <T as Serialize>::N * M;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n for i in 0..M {\n self[i].stream_serialize(writer);\n }\n }\n}\n\nimpl<T, let M: u32> Deserialize for [T; M]\nwhere\n T: Deserialize,\n{\n let N: u32 = <T as Deserialize>::N * M;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n let mut result: [T; M] = std::mem::zeroed();\n for i in 0..M {\n result[i] = T::stream_deserialize(reader);\n }\n result\n }\n}\n\nimpl<T> Serialize for Option<T>\nwhere\n T: Serialize,\n{\n let N: u32 = <T as Serialize>::N + 1;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write_bool(self.is_some());\n if self.is_some() {\n self.unwrap_unchecked().stream_serialize(writer);\n } else {\n writer.advance_offset(<T as Serialize>::N);\n }\n }\n}\n\nimpl<T> Deserialize for Option<T>\nwhere\n T: Deserialize,\n{\n let N: u32 = <T as Deserialize>::N + 1;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n if reader.read_bool() {\n Option::some(<T as Deserialize>::stream_deserialize(reader))\n } else {\n reader.advance_offset(<T as Deserialize>::N);\n Option::none()\n }\n }\n}\n\nglobal SCALAR_SIZE: u32 = 2;\n\nimpl Serialize for EmbeddedCurveScalar {\n\n let N: u32 = SCALAR_SIZE;\n\n fn serialize(self) -> [Field; SCALAR_SIZE] {\n [self.lo, self.hi]\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self.lo);\n writer.write(self.hi);\n }\n}\n\nimpl Deserialize for EmbeddedCurveScalar {\n let N: u32 = SCALAR_SIZE;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n Self { lo: fields[0], hi: fields[1] }\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n Self { lo: reader.read(), hi: reader.read() }\n }\n}\n\nglobal POINT_SIZE: u32 = 3;\n\nimpl Serialize for EmbeddedCurvePoint {\n let N: u32 = POINT_SIZE;\n\n fn serialize(self) -> [Field; Self::N] {\n [self.x, self.y, self.is_infinite as Field]\n }\n\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self.x);\n writer.write(self.y);\n writer.write(self.is_infinite as Field);\n }\n}\n\nimpl Deserialize for EmbeddedCurvePoint {\n let N: u32 = POINT_SIZE;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n Self { x: fields[0], y: fields[1], is_infinite: fields[2] != 0 }\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n Self { x: reader.read(), y: reader.read(), is_infinite: reader.read_bool() }\n }\n}\n\nimpl<let M: u32> Deserialize for str<M> {\n let N: u32 = M;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n let u8_arr = <[u8; Self::N] as Deserialize>::stream_deserialize(reader);\n str::<Self::N>::from(u8_arr)\n }\n}\n\nimpl<let M: u32> Serialize for str<M> {\n let N: u32 = M;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n self.as_bytes().stream_serialize(writer);\n }\n}\n\n// Note: Not deriving this because it's not supported to call derive_serialize on a \"remote\" struct (and it will never\n// be supported).\nimpl<T, let M: u32> Deserialize for BoundedVec<T, M>\nwhere\n T: Deserialize,\n{\n let N: u32 = <T as Deserialize>::N * M + 1;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n let mut new_bounded_vec: BoundedVec<T, M> = BoundedVec::new();\n let payload_len = Self::N - 1;\n\n // Length is stored in the last field as we need to match intrinsic Noir serialization and the `len` struct\n // field is after `storage` struct field (see `bounded_vec.nr` in noir-stdlib)\n let len = reader.peek_offset(payload_len) as u32;\n\n for i in 0..M {\n if i < len {\n new_bounded_vec.push(<T as Deserialize>::stream_deserialize(reader));\n }\n }\n\n // +1 for the length of the BoundedVec\n reader.advance_offset((M - len) * <T as Deserialize>::N + 1);\n\n new_bounded_vec\n }\n}\n\n// This may cause issues if used as program input, because noir disallows empty arrays for program input.\n// I think this is okay because I don't foresee a unit type being used as input. But leaving this comment as a hint\n// if someone does run into this in the future.\nimpl Deserialize for () {\n let N: u32 = 0;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(_reader: &mut Reader<K>) -> Self {\n ()\n }\n}\n\n// Note: Not deriving this because it's not supported to call derive_serialize on a \"remote\" struct (and it will never\n// be supported).\nimpl<T, let M: u32> Serialize for BoundedVec<T, M>\nwhere\n T: Serialize,\n{\n let N: u32 = <T as Serialize>::N * M + 1; // +1 for the length of the BoundedVec\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n self.storage().stream_serialize(writer);\n // Length is stored in the last field as we need to match intrinsic Noir serialization and the `len` struct\n // field is after `storage` struct field (see `bounded_vec.nr` in noir-stdlib)\n writer.write_u32(self.len() as u32);\n }\n}\n\n// Create a slice of the given length with each element made from `f(i)` where `i` is the current index\ncomptime fn make_slice<Env, T>(length: u32, f: fn[Env](u32) -> T) -> [T] {\n let mut slice = @[];\n for i in 0..length {\n slice = slice.push_back(f(i));\n }\n slice\n}\n\n// Implements Serialize and Deserialize for an arbitrary tuple type\ncomptime fn impl_serialize_for_tuple(_m: Module, length: u32) -> Quoted {\n // `T0`, `T1`, `T2`\n let type_names = make_slice(length, |i| f\"T{i}\".quoted_contents());\n\n // `result0`, `result1`, `result2`\n let result_names = make_slice(length, |i| f\"result{i}\".quoted_contents());\n\n // `T0, T1, T2`\n let field_generics = type_names.join(quote [,]);\n\n // `<T0 as Serialize>::N + <T1 as Serialize>::N + <T2 as Serialize>::N`\n let full_size_serialize = type_names\n .map(|type_name| quote {\n <$type_name as Serialize>::N\n })\n .join(quote [+]);\n\n // `<T0 as Deserialize>::N + <T1 as Deserialize>::N + <T2 as Deserialize>::N`\n let full_size_deserialize = type_names\n .map(|type_name| quote {\n <$type_name as Deserialize>::N\n })\n .join(quote [+]);\n\n // `T0: Serialize, T1: Serialize, T2: Serialize,`\n let serialize_constraints = type_names\n .map(|field_name| quote {\n $field_name: Serialize,\n })\n .join(quote []);\n\n // `T0: Deserialize, T1: Deserialize, T2: Deserialize,`\n let deserialize_constraints = type_names\n .map(|field_name| quote {\n $field_name: Deserialize,\n })\n .join(quote []);\n\n // Statements to serialize each field\n let serialized_fields = type_names\n .mapi(|i, _type_name| quote {\n $crate::serialization::Serialize::stream_serialize(self.$i, writer);\n })\n .join(quote []);\n\n // Statements to deserialize each field\n let deserialized_fields = type_names\n .mapi(|i, type_name| {\n let result_name = result_names[i];\n quote {\n let $result_name = <$type_name as $crate::serialization::Deserialize>::stream_deserialize(reader);\n }\n })\n .join(quote []);\n let deserialize_results = result_names.join(quote [,]);\n\n quote {\n impl<$field_generics> Serialize for ($field_generics) where $serialize_constraints {\n let N: u32 = $full_size_serialize;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: $crate::writer::Writer<Self::N> = $crate::writer::Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut $crate::writer::Writer<K>) {\n\n $serialized_fields\n }\n }\n\n impl<$field_generics> Deserialize for ($field_generics) where $deserialize_constraints {\n let N: u32 = $full_size_deserialize;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = $crate::reader::Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n \n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut $crate::reader::Reader<K>) -> Self {\n $deserialized_fields\n ($deserialize_results)\n }\n }\n }\n}\n\n// Keeping these manual impls. They are more efficient since they do not\n// require copying sub-arrays from any serialized arrays.\nimpl<T1> Serialize for (T1,)\nwhere\n T1: Serialize,\n{\n let N: u32 = <T1 as Serialize>::N;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: crate::writer::Writer<Self::N> = crate::writer::Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n self.0.stream_serialize(writer);\n }\n}\n\nimpl<T1> Deserialize for (T1,)\nwhere\n T1: Deserialize,\n{\n let N: u32 = <T1 as Deserialize>::N;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = crate::reader::Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n (<T1 as Deserialize>::stream_deserialize(reader),)\n }\n}\n\n#[impl_serialize_for_tuple(2)]\n#[impl_serialize_for_tuple(3)]\n#[impl_serialize_for_tuple(4)]\n#[impl_serialize_for_tuple(5)]\n#[impl_serialize_for_tuple(6)]\nmod impls {\n use crate::serialization::{Deserialize, Serialize};\n}\n"
4832
+ "source": "use crate::{reader::Reader, serialization::{Deserialize, Serialize}, writer::Writer};\nuse std::embedded_curve_ops::EmbeddedCurvePoint;\nuse std::embedded_curve_ops::EmbeddedCurveScalar;\n\nglobal U1_SERIALIZED_LEN: u32 = 1;\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 for bool {\n let N: u32 = BOOL_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as Field);\n }\n}\n\nimpl Deserialize for bool {\n let N: u32 = BOOL_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> bool {\n reader.read() != 0\n }\n}\n\nimpl Serialize for u1 {\n let N: u32 = U1_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as Field);\n }\n}\n\nimpl Deserialize for u1 {\n let N: u32 = U1_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u1\n }\n}\n\nimpl Serialize for u8 {\n let N: u32 = U8_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as Field);\n }\n}\n\nimpl Deserialize for u8 {\n let N: u32 = U8_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u8\n }\n}\n\nimpl Serialize for u16 {\n let N: u32 = U16_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as Field);\n }\n}\n\nimpl Deserialize for u16 {\n let N: u32 = U16_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u16\n }\n}\n\nimpl Serialize for u32 {\n let N: u32 = U32_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as Field);\n }\n}\n\nimpl Deserialize for u32 {\n let N: u32 = U32_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u32\n }\n}\n\nimpl Serialize for u64 {\n let N: u32 = U64_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as Field);\n }\n}\n\nimpl Deserialize for u64 {\n let N: u32 = U64_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u64\n }\n}\n\nimpl Serialize for u128 {\n let N: u32 = U128_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as Field);\n }\n}\n\nimpl Deserialize for u128 {\n let N: u32 = U128_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u128\n }\n}\n\nimpl Serialize for Field {\n let N: u32 = FIELD_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self);\n }\n}\n\nimpl Deserialize for Field {\n let N: u32 = FIELD_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read()\n }\n}\n\nimpl Serialize for i8 {\n let N: u32 = I8_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as u8 as Field);\n }\n}\n\nimpl Deserialize for i8 {\n let N: u32 = I8_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u8 as i8\n }\n}\n\nimpl Serialize for i16 {\n let N: u32 = I16_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as u16 as Field);\n }\n}\n\nimpl Deserialize for i16 {\n let N: u32 = I16_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u16 as i16\n }\n}\n\nimpl Serialize for i32 {\n let N: u32 = I32_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as u32 as Field);\n }\n}\n\nimpl Deserialize for i32 {\n let N: u32 = I32_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u32 as i32\n }\n}\n\nimpl Serialize for i64 {\n let N: u32 = I64_SERIALIZED_LEN;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self as u64 as Field);\n }\n}\n\nimpl Deserialize for i64 {\n let N: u32 = I64_SERIALIZED_LEN;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n reader.read() as u64 as i64\n }\n}\n\nimpl<T, let M: u32> Serialize for [T; M]\nwhere\n T: Serialize,\n{\n let N: u32 = <T as Serialize>::N * M;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n for i in 0..M {\n self[i].stream_serialize(writer);\n }\n }\n}\n\nimpl<T, let M: u32> Deserialize for [T; M]\nwhere\n T: Deserialize,\n{\n let N: u32 = <T as Deserialize>::N * M;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n let mut result: [T; M] = std::mem::zeroed();\n for i in 0..M {\n result[i] = T::stream_deserialize(reader);\n }\n result\n }\n}\n\nimpl<T> Serialize for Option<T>\nwhere\n T: Serialize,\n{\n let N: u32 = <T as Serialize>::N + 1;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write_bool(self.is_some());\n if self.is_some() {\n self.unwrap_unchecked().stream_serialize(writer);\n } else {\n writer.advance_offset(<T as Serialize>::N);\n }\n }\n}\n\nimpl<T> Deserialize for Option<T>\nwhere\n T: Deserialize,\n{\n let N: u32 = <T as Deserialize>::N + 1;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n if reader.read_bool() {\n Option::some(<T as Deserialize>::stream_deserialize(reader))\n } else {\n reader.advance_offset(<T as Deserialize>::N);\n Option::none()\n }\n }\n}\n\nglobal SCALAR_SIZE: u32 = 2;\n\nimpl Serialize for EmbeddedCurveScalar {\n\n let N: u32 = SCALAR_SIZE;\n\n fn serialize(self) -> [Field; SCALAR_SIZE] {\n [self.lo, self.hi]\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self.lo);\n writer.write(self.hi);\n }\n}\n\nimpl Deserialize for EmbeddedCurveScalar {\n let N: u32 = SCALAR_SIZE;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n Self { lo: fields[0], hi: fields[1] }\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n Self { lo: reader.read(), hi: reader.read() }\n }\n}\n\nglobal POINT_SIZE: u32 = 3;\n\nimpl Serialize for EmbeddedCurvePoint {\n let N: u32 = POINT_SIZE;\n\n fn serialize(self) -> [Field; Self::N] {\n [self.x, self.y, self.is_infinite as Field]\n }\n\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n writer.write(self.x);\n writer.write(self.y);\n writer.write(self.is_infinite as Field);\n }\n}\n\nimpl Deserialize for EmbeddedCurvePoint {\n let N: u32 = POINT_SIZE;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n Self { x: fields[0], y: fields[1], is_infinite: fields[2] != 0 }\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n Self { x: reader.read(), y: reader.read(), is_infinite: reader.read_bool() }\n }\n}\n\nimpl<let M: u32> Deserialize for str<M> {\n let N: u32 = M;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n let u8_arr = <[u8; Self::N] as Deserialize>::stream_deserialize(reader);\n str::<Self::N>::from(u8_arr)\n }\n}\n\nimpl<let M: u32> Serialize for str<M> {\n let N: u32 = M;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n self.as_bytes().stream_serialize(writer);\n }\n}\n\n// Note: Not deriving this because it's not supported to call derive_serialize on a \"remote\" struct (and it will never\n// be supported).\nimpl<T, let M: u32> Deserialize for BoundedVec<T, M>\nwhere\n T: Deserialize,\n{\n let N: u32 = <T as Deserialize>::N * M + 1;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n let mut new_bounded_vec: BoundedVec<T, M> = BoundedVec::new();\n let payload_len = Self::N - 1;\n\n // Length is stored in the last field as we need to match intrinsic Noir serialization and the `len` struct\n // field is after `storage` struct field (see `bounded_vec.nr` in noir-stdlib)\n let len = reader.peek_offset(payload_len) as u32;\n\n for i in 0..M {\n if i < len {\n new_bounded_vec.push(<T as Deserialize>::stream_deserialize(reader));\n }\n }\n\n // +1 for the length of the BoundedVec\n reader.advance_offset((M - len) * <T as Deserialize>::N + 1);\n\n new_bounded_vec\n }\n}\n\n// This may cause issues if used as program input, because noir disallows empty arrays for program input.\n// I think this is okay because I don't foresee a unit type being used as input. But leaving this comment as a hint\n// if someone does run into this in the future.\nimpl Deserialize for () {\n let N: u32 = 0;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(_reader: &mut Reader<K>) -> Self {\n ()\n }\n}\n\n// Note: Not deriving this because it's not supported to call derive_serialize on a \"remote\" struct (and it will never\n// be supported).\nimpl<T, let M: u32> Serialize for BoundedVec<T, M>\nwhere\n T: Serialize,\n{\n let N: u32 = <T as Serialize>::N * M + 1; // +1 for the length of the BoundedVec\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: Writer<Self::N> = Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n self.storage().stream_serialize(writer);\n // Length is stored in the last field as we need to match intrinsic Noir serialization and the `len` struct\n // field is after `storage` struct field (see `bounded_vec.nr` in noir-stdlib)\n writer.write_u32(self.len() as u32);\n }\n}\n\n// Create a slice of the given length with each element made from `f(i)` where `i` is the current index\ncomptime fn make_slice<Env, T>(length: u32, f: fn[Env](u32) -> T) -> [T] {\n let mut slice = @[];\n for i in 0..length {\n slice = slice.push_back(f(i));\n }\n slice\n}\n\n// Implements Serialize and Deserialize for an arbitrary tuple type\ncomptime fn impl_serialize_for_tuple(_m: Module, length: u32) -> Quoted {\n // `T0`, `T1`, `T2`\n let type_names = make_slice(length, |i| f\"T{i}\".quoted_contents());\n\n // `result0`, `result1`, `result2`\n let result_names = make_slice(length, |i| f\"result{i}\".quoted_contents());\n\n // `T0, T1, T2`\n let field_generics = type_names.join(quote [,]);\n\n // `<T0 as Serialize>::N + <T1 as Serialize>::N + <T2 as Serialize>::N`\n let full_size_serialize = type_names\n .map(|type_name| quote {\n <$type_name as Serialize>::N\n })\n .join(quote [+]);\n\n // `<T0 as Deserialize>::N + <T1 as Deserialize>::N + <T2 as Deserialize>::N`\n let full_size_deserialize = type_names\n .map(|type_name| quote {\n <$type_name as Deserialize>::N\n })\n .join(quote [+]);\n\n // `T0: Serialize, T1: Serialize, T2: Serialize,`\n let serialize_constraints = type_names\n .map(|field_name| quote {\n $field_name: Serialize,\n })\n .join(quote []);\n\n // `T0: Deserialize, T1: Deserialize, T2: Deserialize,`\n let deserialize_constraints = type_names\n .map(|field_name| quote {\n $field_name: Deserialize,\n })\n .join(quote []);\n\n // Statements to serialize each field\n let serialized_fields = type_names\n .mapi(|i, _type_name| quote {\n $crate::serialization::Serialize::stream_serialize(self.$i, writer);\n })\n .join(quote []);\n\n // Statements to deserialize each field\n let deserialized_fields = type_names\n .mapi(|i, type_name| {\n let result_name = result_names[i];\n quote {\n let $result_name = <$type_name as $crate::serialization::Deserialize>::stream_deserialize(reader);\n }\n })\n .join(quote []);\n let deserialize_results = result_names.join(quote [,]);\n\n quote {\n impl<$field_generics> Serialize for ($field_generics) where $serialize_constraints {\n let N: u32 = $full_size_serialize;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: $crate::writer::Writer<Self::N> = $crate::writer::Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut $crate::writer::Writer<K>) {\n\n $serialized_fields\n }\n }\n\n impl<$field_generics> Deserialize for ($field_generics) where $deserialize_constraints {\n let N: u32 = $full_size_deserialize;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = $crate::reader::Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n \n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut $crate::reader::Reader<K>) -> Self {\n $deserialized_fields\n ($deserialize_results)\n }\n }\n }\n}\n\n// Keeping these manual impls. They are more efficient since they do not\n// require copying sub-arrays from any serialized arrays.\nimpl<T1> Serialize for (T1,)\nwhere\n T1: Serialize,\n{\n let N: u32 = <T1 as Serialize>::N;\n\n fn serialize(self) -> [Field; Self::N] {\n let mut writer: crate::writer::Writer<Self::N> = crate::writer::Writer::new();\n self.stream_serialize(&mut writer);\n writer.finish()\n }\n\n #[inline_always]\n fn stream_serialize<let K: u32>(self, writer: &mut Writer<K>) {\n self.0.stream_serialize(writer);\n }\n}\n\nimpl<T1> Deserialize for (T1,)\nwhere\n T1: Deserialize,\n{\n let N: u32 = <T1 as Deserialize>::N;\n\n fn deserialize(fields: [Field; Self::N]) -> Self {\n let mut reader = crate::reader::Reader::new(fields);\n let result = Self::stream_deserialize(&mut reader);\n reader.finish();\n result\n }\n\n #[inline_always]\n fn stream_deserialize<let K: u32>(reader: &mut Reader<K>) -> Self {\n (<T1 as Deserialize>::stream_deserialize(reader),)\n }\n}\n\n#[impl_serialize_for_tuple(2)]\n#[impl_serialize_for_tuple(3)]\n#[impl_serialize_for_tuple(4)]\n#[impl_serialize_for_tuple(5)]\n#[impl_serialize_for_tuple(6)]\nmod impls {\n use crate::serialization::{Deserialize, Serialize};\n}\n\n#[test]\nunconstrained fn bounded_vec_serialization() {\n // Test empty BoundedVec\n let empty_vec: BoundedVec<Field, 3> = BoundedVec::from_array([]);\n let serialized = empty_vec.serialize();\n let deserialized = BoundedVec::<Field, 3>::deserialize(serialized);\n assert_eq(empty_vec, deserialized);\n assert_eq(deserialized.len(), 0);\n\n // Test partially filled BoundedVec\n let partial_vec: BoundedVec<[u32; 2], 3> = BoundedVec::from_array([[1, 2]]);\n let serialized = partial_vec.serialize();\n let deserialized = BoundedVec::<[u32; 2], 3>::deserialize(serialized);\n assert_eq(partial_vec, deserialized);\n assert_eq(deserialized.len(), 1);\n assert_eq(deserialized.get(0), [1, 2]);\n\n // Test full BoundedVec\n let full_vec: BoundedVec<[u32; 2], 3> = BoundedVec::from_array([[1, 2], [3, 4], [5, 6]]);\n let serialized = full_vec.serialize();\n let deserialized = BoundedVec::<[u32; 2], 3>::deserialize(serialized);\n assert_eq(full_vec, deserialized);\n assert_eq(deserialized.len(), 3);\n assert_eq(deserialized.get(0), [1, 2]);\n assert_eq(deserialized.get(1), [3, 4]);\n assert_eq(deserialized.get(2), [5, 6]);\n}\n"
4833
4833
  },
4834
- "413": {
4834
+ "418": {
4835
4835
  "path": "/home/aztec-dev/aztec-packages/noir-projects/noir-protocol-circuits/crates/serde/src/writer.nr",
4836
4836
  "source": "pub struct Writer<let N: u32> {\n data: [Field; N],\n offset: u32,\n}\n\nimpl<let N: u32> Writer<N> {\n pub fn new() -> Self {\n Self { data: [0; N], offset: 0 }\n }\n\n pub fn write(&mut self, value: Field) {\n self.data[self.offset] = value;\n self.offset += 1;\n }\n\n pub fn write_u32(&mut self, value: u32) {\n self.write(value as Field);\n }\n\n pub fn write_u64(&mut self, value: u64) {\n self.write(value as Field);\n }\n\n pub fn write_bool(&mut self, value: bool) {\n self.write(value as Field);\n }\n\n pub fn write_array<let K: u32>(&mut self, value: [Field; K]) {\n for i in 0..K {\n self.data[i + self.offset] = value[i];\n }\n self.offset += K;\n }\n\n pub fn write_struct<T, let K: u32>(&mut self, value: T, serialize: fn(T) -> [Field; K]) {\n self.write_array(serialize(value));\n }\n\n pub fn write_struct_array<T, let K: u32, let C: u32>(\n &mut self,\n value: [T; C],\n serialize: fn(T) -> [Field; K],\n ) {\n for i in 0..C {\n self.write_struct(value[i], serialize);\n }\n }\n\n pub fn advance_offset(&mut self, offset: u32) {\n self.offset += offset;\n }\n\n pub fn finish(self) -> [Field; N] {\n assert_eq(self.offset, self.data.len(), \"Writer did not write all data\");\n self.data\n }\n}\n"
4837
4837
  },
@@ -4839,11 +4839,11 @@
4839
4839
  "path": "std/panic.nr",
4840
4840
  "source": "pub fn panic<T, U>(message: T) -> U\nwhere\n T: StringLike,\n{\n assert(false, message);\n crate::mem::zeroed()\n}\n\ntrait StringLike {}\n\nimpl<let N: u32> StringLike for str<N> {}\nimpl<let N: u32, T> StringLike for fmtstr<N, T> {}\n"
4841
4841
  },
4842
- "428": {
4842
+ "433": {
4843
4843
  "path": "/home/aztec-dev/aztec-packages/noir-projects/noir-contracts/contracts/test/test_contract/src/test_note.nr",
4844
4844
  "source": "use aztec::{\n context::PrivateContext,\n macros::notes::custom_note,\n note::note_interface::NoteHash,\n protocol::{\n address::AztecAddress, constants::DOM_SEP__NOTE_HASH, hash::poseidon2_hash_with_separator,\n traits::Packable,\n },\n};\n\n/// A note used only for testing purposes.\n#[derive(Eq, Packable)]\n#[custom_note]\npub struct TestNote {\n pub value: Field,\n}\n\nimpl NoteHash for TestNote {\n fn compute_note_hash(\n self,\n _owner: AztecAddress,\n storage_slot: Field,\n randomness: Field,\n ) -> Field {\n // The note is inserted into the state in the Test contract so we provide a real compute_note_hash\n // implementation.\n let inputs = self.pack().concat([storage_slot, randomness]);\n poseidon2_hash_with_separator(inputs, DOM_SEP__NOTE_HASH)\n }\n\n fn compute_nullifier(\n _self: Self,\n _context: &mut PrivateContext,\n _owner: AztecAddress,\n _note_hash_for_nullification: Field,\n ) -> Field {\n // This note's nullifier is never used for any meaningful purpose so we don't care about having a real\n // implementation here.\n 0\n }\n\n unconstrained fn compute_nullifier_unconstrained(\n _self: Self,\n _owner: AztecAddress,\n _note_hash_for_nullification: Field,\n ) -> Option<Field> {\n // This note's nullifier is never used for any meaningful purpose so we don't care about having a real\n // implementation here.\n Option::none()\n }\n}\n"
4845
4845
  },
4846
- "438": {
4846
+ "443": {
4847
4847
  "path": "/home/aztec-dev/aztec-packages/noir-projects/aztec-nr/uint-note/src/uint_note.nr",
4848
4848
  "source": "use aztec::{\n context::{PrivateContext, PublicContext},\n history::nullifier::assert_nullifier_existed_by,\n keys::getters::{get_nhk_app, get_public_keys, try_get_public_keys},\n macros::notes::custom_note,\n messages::logs::partial_note::compute_partial_note_private_content_log,\n note::note_interface::{NoteHash, NoteType},\n oracle::random::random,\n protocol::{\n address::AztecAddress,\n constants::{\n DOM_SEP__NOTE_HASH, DOM_SEP__NOTE_NULLIFIER, DOM_SEP__PARTIAL_NOTE_VALIDITY_COMMITMENT,\n PRIVATE_LOG_SIZE_IN_FIELDS,\n },\n hash::{compute_siloed_nullifier, poseidon2_hash_with_separator},\n traits::{Deserialize, FromField, Hash, Packable, Serialize, ToField},\n },\n};\n\n// UintNote supports partial notes, i.e. the ability to create an incomplete note in private, hiding certain values\n// (the owner, storage slot and randomness), and then completing the note in public with the ones missing (the amount).\n// Partial notes are being actively developed and are not currently fully supported via macros, and so we rely on the\n// #[custom_note] macro to implement it manually, resulting in some boilerplate. This is expected to be unnecessary\n// once macro support is expanded.\n\n/// A private note representing a numeric value associated to an account (e.g. a token balance).\n// docs:start:uint_note_def\n#[derive(Deserialize, Eq, Serialize, Packable)]\n#[custom_note]\npub struct UintNote {\n /// The number stored in the note.\n pub value: u128,\n}\n// docs:end:uint_note_def\n\nimpl NoteHash for UintNote {\n // docs:start:compute_note_hash\n fn compute_note_hash(self, owner: AztecAddress, storage_slot: Field, randomness: Field) -> Field {\n // Partial notes can be implemented by having the note hash be either the result of multiscalar multiplication\n // (MSM), or two rounds of poseidon. MSM results in more constraints and is only required when multiple\n // variants of partial notes are supported. Because UintNote has just one variant (where the value is public),\n // we use poseidon instead.\n\n // We must compute the same note hash as would be produced by a partial note created and completed with the\n // same values, so that notes all behave the same way regardless of how they were created. To achieve this, we\n // perform both steps of the partial note computation.\n\n // First we create the partial note from a commitment to the private content (including storage slot).\n let partial_note = PartialUintNote { commitment: compute_partial_commitment(owner, storage_slot, randomness) };\n\n // Then compute the completion note hash. In a real partial note this step would be performed in public.\n partial_note.compute_complete_note_hash(self.value)\n }\n // docs:end:compute_note_hash\n\n // The nullifiers are nothing special - this is just the canonical implementation that would be injected by the\n // #[note] macro.\n\n fn compute_nullifier(\n self,\n context: &mut PrivateContext,\n owner: AztecAddress,\n note_hash_for_nullification: Field,\n ) -> Field {\n let owner_npk_m = get_public_keys(owner).npk_m;\n let owner_npk_m_hash = owner_npk_m.hash();\n let secret = context.request_nhk_app(owner_npk_m_hash);\n poseidon2_hash_with_separator(\n [note_hash_for_nullification, secret],\n DOM_SEP__NOTE_NULLIFIER,\n )\n }\n\n unconstrained fn compute_nullifier_unconstrained(\n self,\n owner: AztecAddress,\n note_hash_for_nullification: Field,\n ) -> Option<Field> {\n try_get_public_keys(owner).map(|public_keys| {\n let owner_npk_m = public_keys.npk_m;\n let owner_npk_m_hash = owner_npk_m.hash();\n let secret = get_nhk_app(owner_npk_m_hash);\n poseidon2_hash_with_separator(\n [note_hash_for_nullification, secret],\n DOM_SEP__NOTE_NULLIFIER,\n )\n })\n }\n}\n\nimpl UintNote {\n /// Creates a partial note that will hide the owner and storage slot but not the value, since the note will be\n /// later completed in public. This is a powerful technique for scenarios in which the value cannot be known in\n /// private (e.g. because it depends on some public state, such as a DEX).\n ///\n /// This function inserts a partial note validity commitment into the nullifier tree to be later on able to verify\n /// that the partial note and completer are legitimate. See function docs of `compute_validity_commitment` for more\n /// details.\n ///\n /// Each partial note should only be used once, since otherwise multiple notes would be linked together and known\n /// to belong to the same owner.\n ///\n /// As part of the partial note creation process, a log will be sent to `recipient` so that they can discover the\n /// note. `recipient` will typically be the same as `owner`.\n pub fn partial(\n owner: AztecAddress,\n storage_slot: Field,\n context: &mut PrivateContext,\n recipient: AztecAddress,\n completer: AztecAddress,\n ) -> PartialUintNote {\n // Safety: We use the randomness to preserve the privacy of the note recipient by preventing brute-forcing, so\n // a malicious sender could use non-random values to make the note less private. But they already know the full\n // note pre-image anyway, and so the recipient already trusts them to not disclose this information. We can\n // therefore assume that the sender will cooperate in the random value generation.\n let randomness = unsafe { random() };\n\n // We create a commitment to the private data, which we then use to construct the log we send to the recipient.\n let commitment = compute_partial_commitment(owner, storage_slot, randomness);\n\n // Our partial note log encoding scheme includes a field with the tag of the public completion log, and we use\n // the commitment as the tag. This is good for multiple reasons:\n // - the commitment is uniquely tied to this partial note\n // - the commitment is already public information, so we're not revealing anything else\n // - we don't need to create any additional information, private or public, for the tag\n // - other contracts cannot impersonate us and emit logs with the same tag due to public log siloing\n let private_log_content = UintPartialNotePrivateLogContent {};\n\n let encrypted_log = compute_partial_note_private_content_log(\n private_log_content,\n owner,\n storage_slot,\n randomness,\n recipient,\n commitment,\n );\n // Regardless of the original content size, the log is padded with random bytes up to\n // `PRIVATE_LOG_SIZE_IN_FIELDS` to prevent leaking information about the actual size.\n let length = encrypted_log.len();\n context.emit_private_log(encrypted_log, length);\n\n let partial_note = PartialUintNote { commitment };\n\n // Now we compute the validity commitment and push it to the nullifier tree. It can be safely pushed to the\n // nullifier tree since it uses its own separator, making collisions with actual note nullifiers practically\n // impossible.\n let validity_commitment = partial_note.compute_validity_commitment(completer);\n context.push_nullifier(validity_commitment);\n\n partial_note\n }\n}\n\n/// Computes a commitment to the private content of a partial UintNote, i.e. the fields that will remain private. All\n/// other note fields will be made public.\n// docs:start:compute_partial_commitment\nfn compute_partial_commitment(owner: AztecAddress, storage_slot: Field, randomness: Field) -> Field {\n poseidon2_hash_with_separator(\n [owner.to_field(), storage_slot, randomness],\n DOM_SEP__NOTE_HASH,\n )\n}\n// docs:end:compute_partial_commitment\n\n#[derive(Packable)]\n// This note does not have any non-metadata (i.e. storage slot, owner, randomness) private content, as the only field\n// (value) will be public in the partial note.\nstruct UintPartialNotePrivateLogContent {}\n\nimpl NoteType for UintPartialNotePrivateLogContent {\n fn get_id() -> Field {\n UintNote::get_id()\n }\n}\n\n/// A partial instance of a UintNote. This value represents a private commitment to the owner, randomness and storage\n/// slot, but the value field has not yet been set. A partial note can be completed in public with the `complete`\n/// function (revealing the value to the public), resulting in a UintNote that can be used like any other one (except\n/// of course that its value is known).\n// docs:start:partial_uint_note_def\n#[derive(Packable, Serialize, Deserialize, Eq)]\npub struct PartialUintNote {\n commitment: Field,\n}\n// docs:end:partial_uint_note_def\n\nglobal NOTE_COMPLETION_LOG_LENGTH: u32 = 2;\n\nimpl PartialUintNote {\n /// Completes the partial note, creating a new note that can be used like any other UintNote.\n pub fn complete(self, context: PublicContext, completer: AztecAddress, value: u128) {\n // A note with a value of zero is valid, but we cannot currently complete a partial note with such a value\n // because this will result in the completion log having its last field set to 0. Public logs currently do not\n // track their length, and so trailing zeros are simply trimmed. This results in the completion log missing its\n // last field (the value), and note discovery failing. TODO(#11636): remove this\n assert(value != 0, \"Cannot complete a PartialUintNote with a value of 0\");\n\n // We verify that the partial note we're completing is valid (i.e. completer is correct, it uses the correct\n // state variable's storage slot, and it is internally consistent).\n let validity_commitment = self.compute_validity_commitment(completer);\n // Safety: we're using the existence of the nullifier as proof of the contract having validated the partial\n // note's preimage, which is safe.\n assert(\n context.nullifier_exists_unsafe(validity_commitment, context.this_address()),\n \"Invalid partial note or completer\",\n );\n\n // We need to do two things:\n // - emit a public log containing the public fields (the value). The contract will later find it by searching\n // for the expected tag (which is simply the partial note commitment).\n // - insert the completion note hash (i.e. the hash of the note) into the note hash tree. This is typically\n // only done in private to hide the preimage of the hash that is inserted, but completed partial notes are\n // inserted in public as the public values are provided and the note hash computed.\n context.emit_public_log(self.compute_note_completion_log(value));\n context.push_note_hash(self.compute_complete_note_hash(value));\n }\n\n /// Completes the partial note, creating a new note that can be used like any other UintNote. Same as `complete`\n /// function but works from private context.\n pub fn complete_from_private(self, context: &mut PrivateContext, completer: AztecAddress, value: u128) {\n // We verify that the partial note we're completing is valid (i.e. completer is correct, it uses the correct\n // state variable's storage slot, and it is internally consistent).\n let validity_commitment = self.compute_validity_commitment(completer);\n // `assert_nullifier_existed_by` function expects the nullifier to be siloed (hashed with the address of the\n // contract that emitted the nullifier) as it checks the value directly against the nullifier tree and all the\n // nullifiers in the tree are siloed by the protocol.\n let siloed_validity_commitment = compute_siloed_nullifier(context.this_address(), validity_commitment);\n assert_nullifier_existed_by(\n context.get_anchor_block_header(),\n siloed_validity_commitment,\n );\n\n // We need to do two things:\n // - emit an unencrypted log containing the public fields (the value) via the private log channel. The\n // contract will later find it by searching for the expected tag (which is simply the partial note commitment).\n // - insert the completion note hash (i.e. the hash of the note) into the note hash tree. This is typically\n // only done in private to hide the preimage of the hash that is inserted, but completed partial notes are\n // inserted in public as the public values are provided and the note hash computed.\n context.emit_private_log(\n self.compute_note_completion_log_padded_for_private_log(value),\n NOTE_COMPLETION_LOG_LENGTH,\n );\n context.push_note_hash(self.compute_complete_note_hash(value));\n }\n\n /// Computes a validity commitment for this partial note. The commitment cryptographically binds the note's private\n /// data with the designated completer address. When the note is later completed in public execution, we can load\n /// this commitment from the nullifier tree and verify that both the partial note (e.g. that the storage slot\n /// corresponds to the correct owner, and that we're using the correct state variable) and completer are\n /// legitimate.\n pub fn compute_validity_commitment(self, completer: AztecAddress) -> Field {\n poseidon2_hash_with_separator(\n [self.commitment, completer.to_field()],\n DOM_SEP__PARTIAL_NOTE_VALIDITY_COMMITMENT,\n )\n }\n\n fn compute_note_completion_log(self, value: u128) -> [Field; NOTE_COMPLETION_LOG_LENGTH] {\n // The first field of this log must be the tag that the recipient of the partial note private field logs\n // expects, which is equal to the partial note commitment.\n [self.commitment, value.to_field()]\n }\n\n fn compute_note_completion_log_padded_for_private_log(self, value: u128) -> [Field; PRIVATE_LOG_SIZE_IN_FIELDS] {\n let note_completion_log = self.compute_note_completion_log(value);\n let padding = [0; PRIVATE_LOG_SIZE_IN_FIELDS - NOTE_COMPLETION_LOG_LENGTH];\n note_completion_log.concat(padding)\n }\n\n // docs:start:compute_complete_note_hash\n fn compute_complete_note_hash(self, value: u128) -> Field {\n // Here we finalize the note hash by including the (public) value into the partial note commitment. Note that\n // we use the same generator index as we used for the first round of poseidon - this is not an issue.\n poseidon2_hash_with_separator([self.commitment, value.to_field()], DOM_SEP__NOTE_HASH)\n }\n // docs:end:compute_complete_note_hash\n}\n\nimpl ToField for PartialUintNote {\n fn to_field(self) -> Field {\n self.commitment\n }\n}\n\nimpl FromField for PartialUintNote {\n fn from_field(field: Field) -> Self {\n Self { commitment: field }\n }\n}\n\nmod test {\n use super::{compute_partial_commitment, PartialUintNote, UintNote};\n use aztec::{note::note_interface::NoteHash, protocol::{address::AztecAddress, traits::FromField}};\n\n global value: u128 = 17;\n global randomness: Field = 42;\n global owner: AztecAddress = AztecAddress::from_field(50);\n global storage_slot: Field = 13;\n\n #[test]\n fn note_hash_matches_completed_partial_note_hash() {\n // Tests that a UintNote has the same note hash as a PartialUintNote created and then completed with the same\n // private values. This requires for the same hash function to be used in both flows, with the fields in the\n // same order.\n let note = UintNote { value };\n let note_hash = note.compute_note_hash(owner, storage_slot, randomness);\n\n let partial_note = PartialUintNote { commitment: compute_partial_commitment(owner, storage_slot, randomness) };\n let completed_partial_note_hash = partial_note.compute_complete_note_hash(value);\n\n assert_eq(note_hash, completed_partial_note_hash);\n }\n}\n"
4849
4849
  },