@aztec/aztec.js 0.1.0-alpha45 → 0.1.0-alpha46

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.
@@ -153,7 +153,7 @@
153
153
  }
154
154
  ],
155
155
  "returnTypes": [],
156
- "bytecode": "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",
156
+ "bytecode": "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",
157
157
  "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f"
158
158
  }
159
159
  ],
@@ -161,12 +161,12 @@
161
161
  "debugSymbols": [
162
162
  "eJyrVsrJT04syczPK1ayqq6tBQAz9wY7",
163
163
  "eJztnMtqIzEQRf9Fay8klZ7+lWEWZiYBQ3DC2DvT/z5xYnVfcNHBjNUM6buz4VJVHFul05s+m5fXX7vT/vVwNNuzyc5sf5zN8W13uHw9nnZ/TmYrEsLGPB1+Xz5mN2zM8/7lyWztsLnJOolSrmEnycuYFjf83Jjsu3eQ7h1C9w6xe4fUvUPu3qF071B7dyi2e4fuZ7p0P9Ol+5ku3c900U9clNg6xJpmO9SaWn0rYYyGok3jkxuHCRnDl1n0k3PHLM75sb4raX6YnNrgxU0QpSrRkFs01DJVTUrU5+ivWZ/rhLs4LWzbD+llmlY+YOiHfJ0wqr6PVgpDX50rhaFv+ZXC0C+klcLQ786VwtDVfaUw/tl5vhMM/YFopTBooACDBjrBcJYKijTooEiDEoo0aKFIgxqKNOihSIMiijRookiDKoo06KJAw9FFkQZdFGnQRZEGXRRp0EWRBl0UadBFkQZdFGnQRZEGXRRoeLoo0qCLIg26KNKgiyINuijSoIsiDboo0qCLIg26KNKgiwINoYsiDboo0qCLIg26KNKgiyINuijSoIsiDboo0qCLIg26KNAIdFGkQRdFGnRRpEEXRRp0UaRBF0UadFGkQRdFGv+tfUXbojHGL2iU9q4C8X6K+jtZxGVto9p6zdZUkMXHLMve9TBLlptZlr1p52dZ9p6bn2XZW2Z+Fn3HZ8ltlhznZ5E0RmH7ZPtZXn9kvaN8CnKNJnj3SCuvb6FHlU/6Q9XDyut742Hl9VXwsPL66U6urV8pNs6W99mOf3hYZO9LdRj+An0zJrY=",
164
- "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"
164
+ "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"
165
165
  ],
166
166
  "fileMap": {
167
167
  "0": {
168
168
  "source": "mod storage;\nmod ecdsa_public_key_note;\n\n// Account contract that uses ECDSA signatures for authentication on the same curve as Ethereum.\n// The signing key is stored in an immutable private note and should be different from the signing key.\ncontract EcdsaAccount {\n use dep::std;\n use dep::aztec::entrypoint;\n use dep::aztec::entrypoint::EntrypointPayload;\n use dep::aztec::abi;\n use dep::aztec::abi::PrivateContextInputs;\n use dep::aztec::abi::CallContext;\n use dep::aztec::context::PrivateContext;\n use dep::aztec::log::emit_encrypted_log;\n use dep::aztec::oracle::get_public_key::get_public_key;\n use dep::aztec::types::vec::BoundedVec;\n use dep::aztec::types::point::Point;\n use dep::aztec::constants_gen::GENERATOR_INDEX__SIGNATURE_PAYLOAD;\n\n use dep::aztec::constants_gen::MAX_NOTE_FIELDS_LENGTH;\n use dep::aztec::note::{\n note_header::{NoteHeader},\n utils as note_utils,\n };\n\n use crate::storage::Storage;\n use crate::ecdsa_public_key_note::EcdsaPublicKeyNote;\n use crate::ecdsa_public_key_note::EcdsaPublicKeyNoteInterface;\n use crate::ecdsa_public_key_note::ECDSA_PUBLIC_KEY_NOTE_LEN;\n\n // All calls made by this account will be routed through this entrypoint\n fn entrypoint( \n inputs: pub PrivateContextInputs,\n payload: pub EntrypointPayload, // contains a set of arguments, selectors, targets and a nonce\n signature: pub [u8;64],\n ) -> distinct pub abi::PrivateCircuitPublicInputs {\n \n // Initialise context\n // ENTRYPOINT_PAYLOAD_SIZE(13) + 64\n let mut args: BoundedVec<Field, 77> = BoundedVec::new(0);\n args.push_array(payload.serialize());\n for byte in signature { args.push(byte as Field); }\n let mut context = PrivateContext::new(inputs, abi::hash_args(args.storage));\n\n // Load public key from storage\n let storage = Storage::init();\n let public_key = storage.public_key.get_note(&mut context);\n\n // Verify payload signature using Ethereum's signing scheme\n // Note that noir expects the hash of the message/challenge as input to the ECDSA verification.\n let payload_fields: [Field; entrypoint::ENTRYPOINT_PAYLOAD_SIZE] = payload.serialize();\n let message_field: Field = std::hash::pedersen_with_separator(payload_fields, GENERATOR_INDEX__SIGNATURE_PAYLOAD)[0];\n let message_bytes = message_field.to_be_bytes(32);\n let hashed_message: [u8; 32] = std::hash::sha256(message_bytes);\n let verification = std::ecdsa_secp256k1::verify_signature(public_key.x, public_key.y, signature, hashed_message);\n assert(verification == true);\n\n payload.execute_calls(&mut context);\n\n context.finish()\n }\n\n // Creates a new account out of an ECDSA public key to use for signature verification\n fn constructor(\n inputs: pub PrivateContextInputs,\n signing_pub_key_x: pub [u8;32],\n signing_pub_key_y: pub [u8;32],\n ) -> distinct pub abi::PrivateCircuitPublicInputs {\n let storage = Storage::init();\n \n let mut args: BoundedVec<Field, 64> = BoundedVec::new(0);\n for byte in signing_pub_key_x { args.push(byte as Field); }\n for byte in signing_pub_key_y { args.push(byte as Field); }\n let mut context = PrivateContext::new(inputs, abi::hash_args(args.storage));\n \n let this = context.this_address();\n let mut pub_key_note = EcdsaPublicKeyNote::new(signing_pub_key_x, signing_pub_key_y, this);\n storage.public_key.initialise(&mut context, &mut pub_key_note);\n \n emit_encrypted_log(\n &mut context,\n this,\n storage.public_key.storage_slot,\n get_public_key(this),\n pub_key_note.serialise(),\n );\n\n context.finish()\n }\n\n // Computes note hash and nullifier.\n // Note 1: Needs to be defined by every contract producing logs.\n // Note 2: Having it in all the contracts gives us the ability to compute the note hash and nullifier differently for different kind of notes.\n unconstrained fn compute_note_hash_and_nullifier(contract_address: Field, nonce: Field, storage_slot: Field, preimage: [Field; ECDSA_PUBLIC_KEY_NOTE_LEN]) -> [Field; 4] {\n assert(storage_slot == 1);\n let note_header = NoteHeader { contract_address, nonce, storage_slot };\n note_utils::compute_note_hash_and_nullifier(EcdsaPublicKeyNoteInterface, note_header, preimage)\n }\n}\n",
169
- "path": "/mnt/user-data/alvaro/aztec-packages/yarn-project/noir-contracts/src/contracts/ecdsa_account_contract/src/main"
169
+ "path": "/mnt/user-data/jan/aztec-packages/yarn-project/noir-contracts/src/contracts/ecdsa_account_contract/src/main"
170
170
  },
171
171
  "3": {
172
172
  "source": "mod poseidon;\n\n#[foreign(sha256)]\nfn sha256<N>(_input : [u8; N]) -> [u8; 32] {}\n\n#[foreign(blake2s)]\nfn blake2s<N>(_input : [u8; N]) -> [u8; 32] {}\n\nfn pedersen<N>(input : [Field; N]) -> [Field; 2] {\n pedersen_with_separator(input, 0)\n}\n\n#[foreign(pedersen)]\nfn pedersen_with_separator<N>(_input : [Field; N], _separator : u32) -> [Field; 2] {}\n\n#[foreign(hash_to_field_128_security)]\nfn hash_to_field<N>(_input : [Field; N]) -> Field {}\n\n#[foreign(keccak256)]\nfn keccak256<N>(_input : [u8; N], _message_size: u32) -> [u8; 32] {}\n\n// mimc-p/p implementation\n// constants are (publicly generated) random numbers, for instance using keccak as a ROM.\n// You must use constants generated for the native field\n// Rounds number should be ~ log(p)/log(exp)\n// For 254 bit primes, exponent 7 and 91 rounds seems to be recommended\nfn mimc<N>(x: Field, k: Field, constants: [Field; N], exp : Field) -> Field {\n //round 0\n let mut t = x + k;\n let mut h = t.pow_32(exp);\n //next rounds\n for i in 1 .. constants.len() {\n t = h + k + constants[i];\n h = t.pow_32(exp);\n };\n h + k\n}\n\nglobal MIMC_BN254_ROUNDS = 91;\n\n//mimc implementation with hardcoded parameters for BN254 curve.\nfn mimc_bn254<N>(array: [Field; N]) -> Field {\n //mimc parameters\n let exponent = 7;\n //generated from seed \"mimc\" using keccak256 \n let constants: [Field; MIMC_BN254_ROUNDS] = [\n 0, \n 20888961410941983456478427210666206549300505294776164667214940546594746570981,\n 15265126113435022738560151911929040668591755459209400716467504685752745317193,\n 8334177627492981984476504167502758309043212251641796197711684499645635709656,\n 1374324219480165500871639364801692115397519265181803854177629327624133579404,\n 11442588683664344394633565859260176446561886575962616332903193988751292992472,\n 2558901189096558760448896669327086721003508630712968559048179091037845349145,\n 11189978595292752354820141775598510151189959177917284797737745690127318076389,\n 3262966573163560839685415914157855077211340576201936620532175028036746741754,\n 17029914891543225301403832095880481731551830725367286980611178737703889171730,\n 4614037031668406927330683909387957156531244689520944789503628527855167665518,\n 19647356996769918391113967168615123299113119185942498194367262335168397100658,\n 5040699236106090655289931820723926657076483236860546282406111821875672148900,\n 2632385916954580941368956176626336146806721642583847728103570779270161510514,\n 17691411851977575435597871505860208507285462834710151833948561098560743654671,\n 11482807709115676646560379017491661435505951727793345550942389701970904563183,\n 8360838254132998143349158726141014535383109403565779450210746881879715734773,\n 12663821244032248511491386323242575231591777785787269938928497649288048289525,\n 3067001377342968891237590775929219083706800062321980129409398033259904188058,\n 8536471869378957766675292398190944925664113548202769136103887479787957959589,\n 19825444354178182240559170937204690272111734703605805530888940813160705385792,\n 16703465144013840124940690347975638755097486902749048533167980887413919317592,\n 13061236261277650370863439564453267964462486225679643020432589226741411380501,\n 10864774797625152707517901967943775867717907803542223029967000416969007792571,\n 10035653564014594269791753415727486340557376923045841607746250017541686319774,\n 3446968588058668564420958894889124905706353937375068998436129414772610003289,\n 4653317306466493184743870159523234588955994456998076243468148492375236846006,\n 8486711143589723036499933521576871883500223198263343024003617825616410932026,\n 250710584458582618659378487568129931785810765264752039738223488321597070280,\n 2104159799604932521291371026105311735948154964200596636974609406977292675173,\n 16313562605837709339799839901240652934758303521543693857533755376563489378839,\n 6032365105133504724925793806318578936233045029919447519826248813478479197288,\n 14025118133847866722315446277964222215118620050302054655768867040006542798474,\n 7400123822125662712777833064081316757896757785777291653271747396958201309118,\n 1744432620323851751204287974553233986555641872755053103823939564833813704825,\n 8316378125659383262515151597439205374263247719876250938893842106722210729522,\n 6739722627047123650704294650168547689199576889424317598327664349670094847386,\n 21211457866117465531949733809706514799713333930924902519246949506964470524162,\n 13718112532745211817410303291774369209520657938741992779396229864894885156527,\n 5264534817993325015357427094323255342713527811596856940387954546330728068658,\n 18884137497114307927425084003812022333609937761793387700010402412840002189451,\n 5148596049900083984813839872929010525572543381981952060869301611018636120248,\n 19799686398774806587970184652860783461860993790013219899147141137827718662674,\n 19240878651604412704364448729659032944342952609050243268894572835672205984837,\n 10546185249390392695582524554167530669949955276893453512788278945742408153192,\n 5507959600969845538113649209272736011390582494851145043668969080335346810411,\n 18177751737739153338153217698774510185696788019377850245260475034576050820091,\n 19603444733183990109492724100282114612026332366576932662794133334264283907557,\n 10548274686824425401349248282213580046351514091431715597441736281987273193140,\n 1823201861560942974198127384034483127920205835821334101215923769688644479957,\n 11867589662193422187545516240823411225342068709600734253659804646934346124945,\n 18718569356736340558616379408444812528964066420519677106145092918482774343613,\n 10530777752259630125564678480897857853807637120039176813174150229243735996839,\n 20486583726592018813337145844457018474256372770211860618687961310422228379031,\n 12690713110714036569415168795200156516217175005650145422920562694422306200486,\n 17386427286863519095301372413760745749282643730629659997153085139065756667205,\n 2216432659854733047132347621569505613620980842043977268828076165669557467682,\n 6309765381643925252238633914530877025934201680691496500372265330505506717193,\n 20806323192073945401862788605803131761175139076694468214027227878952047793390,\n 4037040458505567977365391535756875199663510397600316887746139396052445718861,\n 19948974083684238245321361840704327952464170097132407924861169241740046562673,\n 845322671528508199439318170916419179535949348988022948153107378280175750024,\n 16222384601744433420585982239113457177459602187868460608565289920306145389382,\n 10232118865851112229330353999139005145127746617219324244541194256766741433339,\n 6699067738555349409504843460654299019000594109597429103342076743347235369120,\n 6220784880752427143725783746407285094967584864656399181815603544365010379208,\n 6129250029437675212264306655559561251995722990149771051304736001195288083309,\n 10773245783118750721454994239248013870822765715268323522295722350908043393604,\n 4490242021765793917495398271905043433053432245571325177153467194570741607167,\n 19596995117319480189066041930051006586888908165330319666010398892494684778526,\n 837850695495734270707668553360118467905109360511302468085569220634750561083,\n 11803922811376367215191737026157445294481406304781326649717082177394185903907,\n 10201298324909697255105265958780781450978049256931478989759448189112393506592,\n 13564695482314888817576351063608519127702411536552857463682060761575100923924,\n 9262808208636973454201420823766139682381973240743541030659775288508921362724,\n 173271062536305557219323722062711383294158572562695717740068656098441040230,\n 18120430890549410286417591505529104700901943324772175772035648111937818237369,\n 20484495168135072493552514219686101965206843697794133766912991150184337935627,\n 19155651295705203459475805213866664350848604323501251939850063308319753686505,\n 11971299749478202793661982361798418342615500543489781306376058267926437157297,\n 18285310723116790056148596536349375622245669010373674803854111592441823052978,\n 7069216248902547653615508023941692395371990416048967468982099270925308100727,\n 6465151453746412132599596984628739550147379072443683076388208843341824127379,\n 16143532858389170960690347742477978826830511669766530042104134302796355145785,\n 19362583304414853660976404410208489566967618125972377176980367224623492419647,\n 1702213613534733786921602839210290505213503664731919006932367875629005980493,\n 10781825404476535814285389902565833897646945212027592373510689209734812292327,\n 4212716923652881254737947578600828255798948993302968210248673545442808456151,\n 7594017890037021425366623750593200398174488805473151513558919864633711506220,\n 18979889247746272055963929241596362599320706910852082477600815822482192194401,\n 13602139229813231349386885113156901793661719180900395818909719758150455500533,\n ];\n\n let mut r = 0;\n for elem in array {\n let h = mimc(elem, r, constants, exponent);\n r = r + elem + h;\n }\n r\n}\n",
@@ -178,47 +178,47 @@
178
178
  },
179
179
  "31": {
180
180
  "source": "use crate::constants_gen::{\n RETURN_VALUES_LENGTH,\n MAX_READ_REQUESTS_PER_CALL,\n MAX_NEW_COMMITMENTS_PER_CALL,\n MAX_NEW_NULLIFIERS_PER_CALL,\n MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL,\n MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL,\n MAX_NEW_L2_TO_L1_MSGS_PER_CALL,\n NUM_FIELDS_PER_SHA256,\n MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL,\n MAX_PUBLIC_DATA_READS_PER_CALL,\n GENERATOR_INDEX__FUNCTION_ARGS,\n HISTORIC_BLOCK_DATA_LENGTH,\n CONTRACT_DEPLOYMENT_DATA_LENGTH,\n CALL_CONTEXT_LENGTH,\n PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH,\n PRIVATE_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH,\n CONTRACT_STORAGE_UPDATE_REQUEST_LENGTH,\n CONTRACT_STORAGE_READ_LENGTH,\n PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH,\n PUBLIC_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH,\n GENERATOR_INDEX__PUBLIC_CIRCUIT_PUBLIC_INPUTS,\n GENERATOR_INDEX__FUNCTION_DATA,\n GENERATOR_INDEX__PUBLIC_DATA_READ,\n GENERATOR_INDEX__PUBLIC_DATA_UPDATE_REQUEST,\n GENERATOR_INDEX__CALL_CONTEXT,\n GENERATOR_INDEX__PRIVATE_CIRCUIT_PUBLIC_INPUTS,\n GENERATOR_INDEX__CONTRACT_DEPLOYMENT_DATA,\n};\n\nuse crate::oracle::debug_log;\nuse crate::types::vec::BoundedVec;\nuse crate::types::point::Point;\n\nstruct PrivateGlobalVariables {\n chain_id: Field,\n version: Field,\n}\n\nimpl PrivateGlobalVariables {\n fn serialize(self) -> [Field; 2] {\n [self.chain_id, self.version]\n }\n}\n\nstruct PublicGlobalVariables {\n chain_id: Field,\n version: Field,\n block_number: Field,\n timestamp: Field,\n}\n\nimpl PublicGlobalVariables {\n fn serialize(self) -> [Field; 4] {\n [self.chain_id, self.version, self.block_number, self.timestamp]\n }\n}\n\nstruct ContractDeploymentData {\n deployer_public_key: Point,\n constructor_vk_hash : Field,\n function_tree_root : Field,\n contract_address_salt : Field,\n portal_contract_address : Field,\n}\n\nimpl ContractDeploymentData {\n fn serialize(self) -> [Field; CONTRACT_DEPLOYMENT_DATA_LENGTH] {\n [\n self.deployer_public_key.x,\n self.deployer_public_key.y,\n self.constructor_vk_hash,\n self.function_tree_root,\n self.contract_address_salt,\n self.portal_contract_address,\n ]\n }\n\n fn hash(self) -> Field {\n dep::std::hash::pedersen_with_separator(self.serialize(), GENERATOR_INDEX__CONTRACT_DEPLOYMENT_DATA)[0]\n }\n}\n\n// PrivateContextInputs are expected to be provided to each private function\nstruct PrivateContextInputs {\n call_context : CallContext,\n block_data: HistoricBlockData,\n\n contract_deployment_data: ContractDeploymentData,\n\n private_global_variables: PrivateGlobalVariables,\n}\n\n// PublicContextInputs are expected to be provided to each public function\nstruct PublicContextInputs {\n call_context: CallContext,\n block_data: HistoricBlockData,\n\n public_global_variables: PublicGlobalVariables,\n}\n\nstruct CallContext {\n msg_sender : Field,\n storage_contract_address : Field,\n portal_contract_address : Field,\n\n is_delegate_call : bool,\n is_static_call : bool,\n is_contract_deployment: bool,\n}\n\nimpl CallContext {\n fn serialize(self) -> [Field; CALL_CONTEXT_LENGTH] {\n [\n self.msg_sender,\n self.storage_contract_address,\n self.portal_contract_address,\n self.is_delegate_call as Field,\n self.is_static_call as Field,\n self.is_contract_deployment as Field,\n ]\n }\n\n fn hash(self) -> Field {\n dep::std::hash::pedersen_with_separator(self.serialize(), GENERATOR_INDEX__CALL_CONTEXT)[0]\n }\n}\n\nstruct HistoricBlockData {\n private_data_tree_root : Field,\n nullifier_tree_root : Field,\n contract_tree_root : Field,\n l1_to_l2_messages_tree_root : Field,\n blocks_tree_root: Field,\n public_data_tree_root: Field,\n global_variables_hash: Field,\n}\n\nimpl HistoricBlockData {\n // NOTE: this order must match the order in `private_circuit_public_inputs.hpp`\n fn serialize(self) -> [Field; HISTORIC_BLOCK_DATA_LENGTH] {\n [\n self.private_data_tree_root,\n self.nullifier_tree_root,\n self.contract_tree_root,\n self.l1_to_l2_messages_tree_root,\n self.blocks_tree_root,\n self.public_data_tree_root,\n self.global_variables_hash,\n ]\n }\n\n fn empty() -> Self {\n Self { private_data_tree_root: 0, nullifier_tree_root: 0, contract_tree_root: 0, l1_to_l2_messages_tree_root: 0, blocks_tree_root: 0, public_data_tree_root: 0, global_variables_hash: 0 }\n }\n}\n\nstruct FunctionData {\n function_selector: Field,\n is_internal: bool,\n is_private: bool,\n is_constructor: bool,\n}\n\nimpl FunctionData {\n fn hash(self) -> Field {\n dep::std::hash::pedersen_with_separator([\n self.function_selector,\n self.is_internal as Field,\n self.is_private as Field,\n self.is_constructor as Field,\n ], GENERATOR_INDEX__FUNCTION_DATA)[0]\n }\n}\n\nstruct PrivateCircuitPublicInputs {\n call_context: CallContext,\n args_hash: Field,\n return_values: [Field; RETURN_VALUES_LENGTH],\n read_requests: [Field; crate::abi::MAX_READ_REQUESTS_PER_CALL],\n new_commitments: [Field; MAX_NEW_COMMITMENTS_PER_CALL],\n new_nullifiers: [Field; MAX_NEW_NULLIFIERS_PER_CALL],\n nullified_commitments: [Field; MAX_NEW_NULLIFIERS_PER_CALL],\n private_call_stack: [Field; MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL],\n public_call_stack: [Field; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL],\n new_l2_to_l1_msgs: [Field; MAX_NEW_L2_TO_L1_MSGS_PER_CALL],\n // Explore introducing a new type like uint256 (similar to Point), so it's more explicit that\n // we're talking about a single number backed by two field elements.\n encrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n unencrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n encrypted_log_preimages_length: Field,\n unencrypted_log_preimages_length: Field,\n block_data: HistoricBlockData,\n contract_deployment_data: ContractDeploymentData,\n chain_id: Field,\n version: Field,\n}\n\nimpl PrivateCircuitPublicInputs {\n fn hash(self) -> Field {\n let mut fields: BoundedVec<Field, PRIVATE_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH> = BoundedVec::new(0); \n fields.push(self.call_context.hash());\n fields.push(self.args_hash);\n fields.push_array(self.return_values);\n fields.push_array(self.read_requests);\n fields.push_array(self.new_commitments);\n fields.push_array(self.new_nullifiers);\n fields.push_array(self.nullified_commitments);\n fields.push_array(self.private_call_stack);\n fields.push_array(self.public_call_stack);\n fields.push_array(self.new_l2_to_l1_msgs);\n fields.push_array(self.encrypted_logs_hash);\n fields.push_array(self.unencrypted_logs_hash);\n fields.push(self.encrypted_log_preimages_length);\n fields.push(self.unencrypted_log_preimages_length);\n fields.push_array(self.block_data.serialize());\n fields.push(self.contract_deployment_data.hash());\n fields.push(self.chain_id);\n fields.push(self.version);\n\n dep::std::hash::pedersen_with_separator(fields.storage, GENERATOR_INDEX__PRIVATE_CIRCUIT_PUBLIC_INPUTS)[0]\n }\n\n fn serialize(self) -> [Field; PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH] {\n let mut fields: BoundedVec<Field, PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH> = BoundedVec::new(0); \n fields.push_array(self.call_context.serialize());\n fields.push(self.args_hash);\n fields.push_array(self.return_values);\n fields.push_array(self.read_requests);\n fields.push_array(self.new_commitments);\n fields.push_array(self.new_nullifiers);\n fields.push_array(self.private_call_stack);\n fields.push_array(self.public_call_stack);\n fields.push_array(self.new_l2_to_l1_msgs);\n fields.push_array(self.encrypted_logs_hash);\n fields.push_array(self.unencrypted_logs_hash);\n fields.push(self.encrypted_log_preimages_length);\n fields.push(self.unencrypted_log_preimages_length);\n fields.push_array(self.block_data.serialize());\n fields.push_array(self.contract_deployment_data.serialize());\n fields.push(self.chain_id);\n fields.push(self.version);\n fields.storage\n }\n}\n\nstruct ContractStorageRead {\n storage_slot: Field,\n value: Field,\n}\n\nimpl ContractStorageRead {\n fn serialize(self) -> [Field; CONTRACT_STORAGE_READ_LENGTH] {\n [self.storage_slot, self.value]\n }\n\n fn hash(self) -> Field {\n dep::std::hash::pedersen_with_separator(self.serialize(), GENERATOR_INDEX__PUBLIC_DATA_READ)[0]\n }\n\n fn empty() -> Self {\n Self { storage_slot: 0, value: 0 }\n }\n}\n\nstruct ContractStorageUpdateRequest {\n storage_slot: Field,\n old_value: Field,\n new_value: Field,\n}\n\nimpl ContractStorageUpdateRequest {\n fn serialize(self) -> [Field; CONTRACT_STORAGE_UPDATE_REQUEST_LENGTH] {\n [self.storage_slot, self.old_value, self.new_value]\n }\n\n fn hash(self) -> Field {\n dep::std::hash::pedersen_with_separator(self.serialize(), GENERATOR_INDEX__PUBLIC_DATA_UPDATE_REQUEST)[0]\n }\n\n fn empty() -> Self {\n Self { storage_slot: 0, old_value: 0, new_value: 0 }\n }\n}\n\n\nstruct PublicCircuitPublicInputs {\n call_context: CallContext,\n args_hash: Field,\n return_values: [Field; RETURN_VALUES_LENGTH],\n contract_storage_update_requests: [ContractStorageUpdateRequest; MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL],\n contract_storage_read: [ContractStorageRead; MAX_PUBLIC_DATA_READS_PER_CALL],\n public_call_stack: [Field; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL],\n new_commitments: [Field; MAX_NEW_COMMITMENTS_PER_CALL],\n new_nullifiers: [Field; crate::abi::MAX_NEW_NULLIFIERS_PER_CALL],\n new_l2_to_l1_msgs: [Field; crate::abi::MAX_NEW_L2_TO_L1_MSGS_PER_CALL],\n unencrypted_logs_hash: [Field; NUM_FIELDS_PER_SHA256],\n unencrypted_log_preimages_length: Field,\n block_data: HistoricBlockData,\n prover_address: Field,\n\n // TODO: include globals in here and check them elsewhere\n // https://github.com/AztecProtocol/aztec-packages/issues/1567\n}\n\nimpl PublicCircuitPublicInputs {\n \n fn hash(self) -> Field {\n let mut inputs: BoundedVec<Field, PUBLIC_CIRCUIT_PUBLIC_INPUTS_HASH_INPUT_LENGTH> = BoundedVec::new(0);\n inputs.push(self.call_context.hash());\n inputs.push(self.args_hash);\n inputs.push_array(self.return_values);\n for i in 0..MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL {\n inputs.push(self.contract_storage_update_requests[i].hash());\n }\n for i in 0..MAX_PUBLIC_DATA_READS_PER_CALL {\n inputs.push(self.contract_storage_read[i].hash());\n }\n inputs.push_array(self.public_call_stack);\n inputs.push_array(self.new_commitments);\n inputs.push_array(self.new_nullifiers);\n inputs.push_array(self.new_l2_to_l1_msgs);\n\n // We do not include block_data since it's not in the cpp hash\n\n inputs.push_array(self.unencrypted_logs_hash);\n inputs.push(self.unencrypted_log_preimages_length);\n inputs.push_array(self.block_data.serialize()); // see https://github.com/AztecProtocol/aztec-packages/issues/1473\n inputs.push(self.prover_address);\n\n dep::std::hash::pedersen_with_separator(inputs.storage, GENERATOR_INDEX__PUBLIC_CIRCUIT_PUBLIC_INPUTS)[0]\n }\n\n fn serialize(self) -> [Field; PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH] {\n let mut fields: BoundedVec<Field, PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH> = BoundedVec::new(0); \n fields.push_array(self.call_context.serialize()); \n fields.push(self.args_hash);\n fields.push_array(self.return_values);\n for i in 0..MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL {\n fields.push_array(self.contract_storage_update_requests[i].serialize());\n }\n for i in 0..MAX_PUBLIC_DATA_READS_PER_CALL {\n fields.push_array(self.contract_storage_read[i].serialize());\n }\n fields.push_array(self.public_call_stack);\n fields.push_array(self.new_commitments);\n fields.push_array(self.new_nullifiers);\n fields.push_array(self.new_l2_to_l1_msgs);\n fields.push_array(self.unencrypted_logs_hash);\n fields.push(self.unencrypted_log_preimages_length);\n fields.push_array(self.block_data.serialize());\n fields.push(self.prover_address);\n fields.storage\n }\n}\n\nglobal ARGS_HASH_CHUNK_LENGTH: u32 = 32;\nglobal ARGS_HASH_CHUNK_COUNT: u32 = 16;\n\nfn hash_args<N>(args: [Field; N]) -> Field {\n if args.len() == 0 {\n 0\n } else {\n let mut chunks_hashes = [0; ARGS_HASH_CHUNK_COUNT];\n for i in 0..ARGS_HASH_CHUNK_COUNT {\n let mut chunk_hash = 0;\n let start_chunk_index = i * ARGS_HASH_CHUNK_LENGTH;\n if start_chunk_index < (args.len() as u32) {\n let mut chunk_args = [0; ARGS_HASH_CHUNK_LENGTH];\n for j in 0..ARGS_HASH_CHUNK_LENGTH {\n let item_index = i * ARGS_HASH_CHUNK_LENGTH + j;\n if item_index < (args.len() as u32) {\n chunk_args[j] = args[item_index];\n }\n }\n chunk_hash = dep::std::hash::pedersen_with_separator(chunk_args, GENERATOR_INDEX__FUNCTION_ARGS)[0];\n }\n chunks_hashes[i] = chunk_hash;\n }\n dep::std::hash::pedersen_with_separator(chunks_hashes, GENERATOR_INDEX__FUNCTION_ARGS)[0]\n }\n}\n",
181
- "path": "/mnt/user-data/alvaro/aztec-packages/yarn-project/noir-libs/noir-aztec/src/abi"
181
+ "path": "/mnt/user-data/jan/aztec-packages/yarn-project/noir-libs/noir-aztec/src/abi"
182
182
  },
183
183
  "32": {
184
184
  "source": "use crate::constants_gen::{\n EMPTY_NULLIFIED_COMMITMENT,\n MAX_NEW_COMMITMENTS_PER_CALL,\n MAX_NEW_L2_TO_L1_MSGS_PER_CALL,\n MAX_NEW_NULLIFIERS_PER_CALL,\n MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL,\n MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL,\n MAX_PUBLIC_DATA_READS_PER_CALL,\n MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL,\n MAX_READ_REQUESTS_PER_CALL,\n NUM_FIELDS_PER_SHA256,\n RETURN_VALUES_LENGTH,\n};\n\nuse crate::abi;\n\nuse crate::abi::{\n hash_args,\n CallContext,\n ContractDeploymentData,\n HistoricBlockData,\n FunctionData,\n PrivateCircuitPublicInputs,\n PublicCircuitPublicInputs,\n};\n\n// TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n// use dep::std::collections::vec::Vec;\n\n// l1 to l2 messaging\nuse crate::messaging::process_l1_to_l2_message;\nuse crate::private_call_stack_item::PrivateCallStackItem;\nuse crate::public_call_stack_item::PublicCallStackItem;\n\nuse crate::types::{\n vec::BoundedVec,\n point::Point,\n};\n\nuse crate::utils::arr_copy_slice;\n\nuse crate::oracle::{\n arguments,\n call_private_function::call_private_function_internal,\n public_call::call_public_function_internal,\n enqueue_public_function_call::enqueue_public_function_call_internal,\n context::get_portal_address,\n};\n\n\n// When finished, one can call .finish() to convert back to the abi\nstruct PrivateContext {\n inputs: abi::PrivateContextInputs,\n\n args_hash : Field,\n return_values : BoundedVec<Field, RETURN_VALUES_LENGTH>,\n\n read_requests: BoundedVec<Field, MAX_READ_REQUESTS_PER_CALL>,\n\n new_commitments: BoundedVec<Field, MAX_NEW_COMMITMENTS_PER_CALL>,\n new_nullifiers: BoundedVec<Field, MAX_NEW_NULLIFIERS_PER_CALL>,\n nullified_commitments: BoundedVec<Field, MAX_NEW_NULLIFIERS_PER_CALL>,\n\n private_call_stack : BoundedVec<Field, MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL>,\n public_call_stack : BoundedVec<Field, MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL>,\n new_l2_to_l1_msgs : BoundedVec<Field, MAX_NEW_L2_TO_L1_MSGS_PER_CALL>,\n\n block_data: HistoricBlockData,\n\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n // encrypted_logs_preimages: Vec<Field>,\n // unencrypted_logs_preimages: Vec<Field>,\n}\n\nimpl PrivateContext {\n fn new(inputs: abi::PrivateContextInputs, args_hash: Field) -> PrivateContext {\n PrivateContext {\n inputs: inputs,\n\n args_hash: args_hash,\n return_values: BoundedVec::new(0),\n\n read_requests: BoundedVec::new(0),\n\n new_commitments: BoundedVec::new(0),\n new_nullifiers: BoundedVec::new(0),\n nullified_commitments: BoundedVec::new(0),\n\n block_data: inputs.block_data,\n\n private_call_stack: BoundedVec::new(0),\n public_call_stack: BoundedVec::new(0),\n new_l2_to_l1_msgs: BoundedVec::new(0),\n\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n // encrypted_logs_preimages: Vec::new(),\n // unencrypted_logs_preimages: Vec::new(),\n }\n }\n\n fn msg_sender(self) -> Field {\n self.inputs.call_context.msg_sender\n }\n\n fn this_address(self) -> Field {\n self.inputs.call_context.storage_contract_address\n }\n\n fn this_portal_address(self) -> Field {\n self.inputs.call_context.portal_contract_address\n }\n\n fn chain_id(self) -> Field {\n self.inputs.private_global_variables.chain_id\n }\n\n fn version(self) -> Field {\n self.inputs.private_global_variables.version\n }\n\n fn finish(self) -> abi::PrivateCircuitPublicInputs {\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n let encrypted_logs_hash = [0; NUM_FIELDS_PER_SHA256];\n let unencrypted_logs_hash = [0; NUM_FIELDS_PER_SHA256];\n let encrypted_log_preimages_length = 0;\n let unencrypted_log_preimages_length = 0;\n\n let priv_circuit_pub_inputs = abi::PrivateCircuitPublicInputs {\n call_context: self.inputs.call_context,\n args_hash: self.args_hash,\n return_values: self.return_values.storage,\n read_requests: self.read_requests.storage,\n new_commitments: self.new_commitments.storage,\n new_nullifiers: self.new_nullifiers.storage,\n nullified_commitments: self.nullified_commitments.storage,\n private_call_stack: self.private_call_stack.storage,\n public_call_stack: self.public_call_stack.storage,\n new_l2_to_l1_msgs: self.new_l2_to_l1_msgs.storage,\n encrypted_logs_hash: encrypted_logs_hash,\n unencrypted_logs_hash: unencrypted_logs_hash,\n encrypted_log_preimages_length: encrypted_log_preimages_length,\n unencrypted_log_preimages_length: unencrypted_log_preimages_length,\n block_data: self.block_data,\n contract_deployment_data: self.inputs.contract_deployment_data,\n chain_id: self.inputs.private_global_variables.chain_id,\n version: self.inputs.private_global_variables.version,\n };\n priv_circuit_pub_inputs\n }\n\n fn push_read_request(&mut self, read_request: Field) {\n self.read_requests.push(read_request);\n }\n\n fn push_new_note_hash(&mut self, note_hash: Field) {\n self.new_commitments.push(note_hash);\n }\n\n fn push_new_nullifier(&mut self, nullifier: Field, nullified_commitment: Field) {\n self.new_nullifiers.push(nullifier);\n self.nullified_commitments.push(nullified_commitment);\n }\n\n fn message_portal(&mut self, content: Field) {\n self.new_l2_to_l1_msgs.push(content);\n }\n\n // PrivateContextInputs must be temporarily passed in to prevent too many unknowns\n // Note this returns self to get around an issue where mutable structs do not maintain mutations unless reassigned\n fn consume_l1_to_l2_message(&mut self, inputs: abi::PrivateContextInputs, msg_key: Field, content: Field, secret: Field) {\n let nullifier = process_l1_to_l2_message(inputs.block_data.l1_to_l2_messages_tree_root, inputs.call_context.storage_contract_address, msg_key, content, secret);\n\n // Push nullifier (and the \"commitment\" corresponding to this can be \"empty\")\n self.push_new_nullifier(nullifier, EMPTY_NULLIFIED_COMMITMENT)\n }\n\n fn accumulate_encrypted_logs<N>(&mut self, log: [Field; N]) {\n let _void1 = self.inputs;\n let _void2 = log;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n }\n\n fn accumulate_unencrypted_logs<T>(&mut self, log: T) {\n let _void1 = self.inputs;\n let _void2 = log;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n }\n\n fn call_private_function<ARGS_COUNT>(\n &mut self,\n contract_address: Field, \n function_selector: Field, \n args: [Field; ARGS_COUNT]\n ) -> [Field; RETURN_VALUES_LENGTH] {\n let args_hash = hash_args(args);\n assert(args_hash == arguments::pack_arguments(args));\n self.call_private_function_with_packed_args(contract_address, function_selector, args_hash)\n }\n\n fn call_private_function_no_args(\n &mut self,\n contract_address: Field, \n function_selector: Field, \n ) -> [Field; RETURN_VALUES_LENGTH] {\n self.call_private_function_with_packed_args(contract_address, function_selector, 0)\n }\n\n fn call_private_function_with_packed_args(\n &mut self,\n contract_address: Field,\n function_selector: Field,\n args_hash: Field\n ) -> [Field; RETURN_VALUES_LENGTH] {\n let fields = call_private_function_internal(\n contract_address, \n function_selector, \n args_hash\n );\n let item = PrivateCallStackItem {\n contract_address: fields[0],\n function_data: FunctionData {\n function_selector: fields[1],\n is_internal: fields[2] as bool,\n is_private: fields[3] as bool,\n is_constructor: fields[4] as bool,\n },\n public_inputs: PrivateCircuitPublicInputs {\n call_context: CallContext {\n msg_sender : fields[5],\n storage_contract_address : fields[6],\n portal_contract_address : fields[7],\n \n is_delegate_call : fields[8] as bool,\n is_static_call : fields[9] as bool,\n is_contract_deployment: fields[10] as bool,\n },\n // TODO handle the offsets as a variable incremented during extraction?\n args_hash: fields[11],\n return_values: arr_copy_slice(fields, [0; RETURN_VALUES_LENGTH], 12),\n read_requests: arr_copy_slice(fields, [0; MAX_READ_REQUESTS_PER_CALL], 16),\n new_commitments: arr_copy_slice(fields, [0; MAX_NEW_COMMITMENTS_PER_CALL], 20),\n new_nullifiers: arr_copy_slice(fields, [0; MAX_NEW_NULLIFIERS_PER_CALL], 24),\n nullified_commitments: arr_copy_slice(fields, [0; MAX_NEW_NULLIFIERS_PER_CALL], 28),\n private_call_stack: arr_copy_slice(fields, [0; MAX_PRIVATE_CALL_STACK_LENGTH_PER_CALL], 32),\n public_call_stack: arr_copy_slice(fields, [0; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL], 36),\n new_l2_to_l1_msgs: arr_copy_slice(fields, [0; MAX_NEW_L2_TO_L1_MSGS_PER_CALL], 40),\n encrypted_logs_hash: arr_copy_slice(fields, [0; NUM_FIELDS_PER_SHA256], 42),\n unencrypted_logs_hash: arr_copy_slice(fields, [0; NUM_FIELDS_PER_SHA256], 44),\n encrypted_log_preimages_length: fields[46],\n unencrypted_log_preimages_length: fields[47],\n block_data: HistoricBlockData {\n // Must match order in `private_circuit_public_inputs.hpp`\n private_data_tree_root : fields[48],\n nullifier_tree_root : fields[49],\n contract_tree_root : fields[50],\n l1_to_l2_messages_tree_root : fields[51],\n blocks_tree_root : fields[52],\n public_data_tree_root: fields[53],\n global_variables_hash: fields[54],\n },\n contract_deployment_data: ContractDeploymentData {\n deployer_public_key: Point::new(fields[55], fields[56]),\n constructor_vk_hash : fields[57],\n function_tree_root : fields[58],\n contract_address_salt : fields[59],\n portal_contract_address : fields[60],\n },\n chain_id: fields[61],\n version: fields[62],\n },\n is_execution_request: fields[63] as bool,\n };\n assert(contract_address == item.contract_address);\n assert(function_selector == item.function_data.function_selector);\n\n assert(args_hash == item.public_inputs.args_hash);\n\n assert(item.is_execution_request == false);\n\n // Assert that the call context of the enqueued call generated by the oracle matches our request.\n // We are issuing a regular call which is not delegate, static, or deployment. We also constrain\n // the msg_sender in the nested call to be equal to our address, and the execution context address\n // for the nested call to be equal to the address we actually called.\n assert(item.public_inputs.call_context.is_delegate_call == false);\n assert(item.public_inputs.call_context.is_static_call == false);\n assert(item.public_inputs.call_context.is_contract_deployment == false);\n assert(item.public_inputs.call_context.msg_sender == self.inputs.call_context.storage_contract_address);\n assert(item.public_inputs.call_context.storage_contract_address == contract_address);\n\n self.private_call_stack.push(item.hash());\n\n item.public_inputs.return_values\n }\n\n fn call_public_function<ARGS_COUNT>(\n &mut self,\n contract_address: Field, \n function_selector: Field, \n args: [Field; ARGS_COUNT]\n ) {\n let args_hash = hash_args(args);\n assert(args_hash == arguments::pack_arguments(args));\n self.call_public_function_with_packed_args(contract_address, function_selector, args_hash)\n }\n\n fn call_public_function_no_args(\n &mut self,\n contract_address: Field, \n function_selector: Field,\n ) {\n self.call_public_function_with_packed_args(contract_address, function_selector, 0)\n }\n\n fn call_public_function_with_packed_args(\n &mut self,\n contract_address: Field,\n function_selector: Field,\n args_hash: Field\n ) {\n let fields = enqueue_public_function_call_internal(\n contract_address, \n function_selector, \n args_hash\n );\n let item = PublicCallStackItem {\n contract_address: fields[0],\n function_data: FunctionData {\n function_selector: fields[1],\n is_internal: fields[2] as bool,\n is_private: fields[3] as bool,\n is_constructor: fields[4] as bool,\n },\n public_inputs: PublicCircuitPublicInputs {\n call_context: CallContext {\n msg_sender : fields[5],\n storage_contract_address : fields[6],\n portal_contract_address : fields[7],\n \n is_delegate_call : fields[8] as bool,\n is_static_call : fields[9] as bool,\n is_contract_deployment: fields[10] as bool,\n },\n args_hash: fields[11],\n return_values: [0; RETURN_VALUES_LENGTH],\n contract_storage_update_requests: [ContractStorageUpdateRequest::empty(); MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL],\n contract_storage_read: [ContractStorageRead::empty(); MAX_PUBLIC_DATA_READS_PER_CALL],\n public_call_stack: [0; MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL],\n new_commitments: [0; MAX_NEW_COMMITMENTS_PER_CALL],\n new_nullifiers: [0; MAX_NEW_NULLIFIERS_PER_CALL],\n new_l2_to_l1_msgs:[0; MAX_NEW_L2_TO_L1_MSGS_PER_CALL],\n unencrypted_logs_hash:[0; NUM_FIELDS_PER_SHA256],\n unencrypted_log_preimages_length: 0,\n block_data: HistoricBlockData::empty(),\n prover_address: 0,\n },\n is_execution_request: true,\n };\n\n assert(contract_address == item.contract_address);\n assert(function_selector == item.function_data.function_selector);\n \n assert(args_hash == item.public_inputs.args_hash);\n\n // Assert that the call context of the enqueued call generated by the oracle matches our request.\n // We are issuing a regular call which is not delegate, static, or deployment. We also constrain\n // the msg_sender in the nested call to be equal to our address, and the execution context address\n // for the nested call to be equal to the address we actually called.\n assert(item.public_inputs.call_context.is_delegate_call == false);\n assert(item.public_inputs.call_context.is_static_call == false);\n assert(item.public_inputs.call_context.is_contract_deployment == false);\n assert(item.public_inputs.call_context.msg_sender == self.inputs.call_context.storage_contract_address);\n assert(item.public_inputs.call_context.storage_contract_address == contract_address);\n\n self.public_call_stack.push(item.hash());\n }\n}\n\nuse crate::abi::{\n ContractStorageRead,\n ContractStorageUpdateRequest\n};\n\nstruct PublicContext {\n inputs: abi::PublicContextInputs,\n\n args_hash : Field,\n return_values : BoundedVec<Field, RETURN_VALUES_LENGTH>,\n\n contract_storage_update_requests: BoundedVec<ContractStorageUpdateRequest, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_CALL>,\n contract_storage_read: BoundedVec<ContractStorageRead, MAX_PUBLIC_DATA_READS_PER_CALL>,\n public_call_stack: BoundedVec<Field, MAX_PUBLIC_CALL_STACK_LENGTH_PER_CALL>,\n\n new_commitments: BoundedVec<Field, MAX_NEW_COMMITMENTS_PER_CALL>,\n new_nullifiers: BoundedVec<Field, crate::abi::MAX_NEW_NULLIFIERS_PER_CALL>,\n\n new_l2_to_l1_msgs: BoundedVec<Field, crate::abi::MAX_NEW_L2_TO_L1_MSGS_PER_CALL>,\n\n unencrypted_logs_hash: BoundedVec<Field, NUM_FIELDS_PER_SHA256>,\n unencrypted_logs_preimages_length: Field,\n\n block_data: HistoricBlockData,\n prover_address: Field,\n}\n\nimpl PublicContext {\n fn new(inputs: abi::PublicContextInputs, args_hash: Field) -> PublicContext {\n let empty_storage_read = ContractStorageRead::empty();\n let empty_storage_update = ContractStorageUpdateRequest::empty();\n PublicContext {\n inputs: inputs,\n\n args_hash: args_hash,\n return_values: BoundedVec::new(0),\n\n contract_storage_update_requests: BoundedVec::new(empty_storage_update),\n contract_storage_read: BoundedVec::new(empty_storage_read),\n public_call_stack: BoundedVec::new(0),\n\n new_commitments: BoundedVec::new(0),\n new_nullifiers: BoundedVec::new(0),\n\n new_l2_to_l1_msgs: BoundedVec::new(0),\n\n \n unencrypted_logs_hash: BoundedVec::new(0),\n unencrypted_logs_preimages_length: 0,\n\n block_data: inputs.block_data,\n prover_address: 0,\n\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n // encrypted_logs_preimages: Vec::new(),\n // unencrypted_logs_preimages: Vec::new(),\n }\n }\n\n fn msg_sender(self) -> Field {\n self.inputs.call_context.msg_sender\n }\n\n fn this_address(self) -> Field {\n self.inputs.call_context.storage_contract_address\n }\n\n fn this_portal_address(self) -> Field {\n self.inputs.call_context.portal_contract_address\n }\n\n fn chain_id(self) -> Field {\n self.inputs.public_global_variables.chain_id\n }\n\n fn version(self) -> Field {\n self.inputs.public_global_variables.version\n }\n\n fn block_number(self) -> Field {\n self.inputs.public_global_variables.block_number\n }\n\n fn timestamp(self) -> Field {\n self.inputs.public_global_variables.timestamp\n }\n\n fn finish(self) -> abi::PublicCircuitPublicInputs {\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n let unencrypted_logs_hash = [0; NUM_FIELDS_PER_SHA256];\n let unencrypted_log_preimages_length = 0;\n\n\n // Compute the public call stack hashes\n let pub_circuit_pub_inputs = abi::PublicCircuitPublicInputs {\n call_context: self.inputs.call_context, // Done\n args_hash: self.args_hash, // Done\n contract_storage_update_requests: self.contract_storage_update_requests.storage,\n contract_storage_read: self.contract_storage_read.storage,\n return_values: self.return_values.storage,\n new_commitments: self.new_commitments.storage,\n new_nullifiers: self.new_nullifiers.storage,\n public_call_stack: self.public_call_stack.storage,\n new_l2_to_l1_msgs: self.new_l2_to_l1_msgs.storage,\n unencrypted_logs_hash: unencrypted_logs_hash,\n unencrypted_log_preimages_length: unencrypted_log_preimages_length,\n block_data: self.inputs.block_data,\n prover_address: self.prover_address,\n };\n pub_circuit_pub_inputs\n }\n\n fn push_new_note_hash(&mut self, note_hash: Field) {\n self.new_commitments.push(note_hash);\n }\n\n fn push_new_nullifier(&mut self, nullifier: Field, _nullified_commitment: Field) {\n self.new_nullifiers.push(nullifier);\n }\n\n fn message_portal(&mut self, content: Field) {\n self.new_l2_to_l1_msgs.push(content);\n }\n\n // PrivateContextInputs must be temporarily passed in to prevent too many unknowns\n // Note this returns self to get around an issue where mutable structs do not maintain mutations unless reassigned\n fn consume_l1_to_l2_message(&mut self, msg_key: Field, content: Field, secret: Field) {\n let this = (*self).this_address();\n let nullifier = process_l1_to_l2_message(self.block_data.l1_to_l2_messages_tree_root, this, msg_key, content, secret);\n\n // Push nullifier (and the \"commitment\" corresponding to this can be \"empty\")\n self.push_new_nullifier(nullifier, EMPTY_NULLIFIED_COMMITMENT)\n }\n\n fn accumulate_encrypted_logs<N>(&mut self, log: [Field; N]) {\n let _void1 = self;\n let _void2 = log;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n }\n\n fn accumulate_unencrypted_logs<T>(&mut self, log: T) {\n let _void1 = self;\n let _void2 = log;\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1165)\n }\n\n fn call_public_function<ARGS_COUNT>(\n _self: Self,\n contract_address: Field, \n function_selector: Field,\n args: [Field; ARGS_COUNT],\n ) -> [Field; RETURN_VALUES_LENGTH] {\n let args_hash = abi::hash_args(args);\n assert(args_hash == arguments::pack_arguments(args));\n call_public_function_internal(\n contract_address, \n function_selector, \n args_hash,\n )\n }\n\n fn call_public_function_no_args(\n _self: Self,\n contract_address: Field, \n function_selector: Field,\n ) -> [Field; RETURN_VALUES_LENGTH] {\n call_public_function_internal(\n contract_address, \n function_selector, \n 0,\n )\n }\n\n}",
185
- "path": "/mnt/user-data/alvaro/aztec-packages/yarn-project/noir-libs/noir-aztec/src/context"
185
+ "path": "/mnt/user-data/jan/aztec-packages/yarn-project/noir-libs/noir-aztec/src/context"
186
186
  },
187
187
  "33": {
188
188
  "source": "use crate::context::PrivateContext;\nuse crate::oracle;\nuse crate::types::point::Point;\n\nfn emit_encrypted_log<N>(\n context: &mut PrivateContext,\n contract_address: Field,\n storage_slot: Field,\n encryption_pub_key: Point,\n log: [Field; N],\n) {\n let _ = oracle::logs::emit_encrypted_log(contract_address, storage_slot, encryption_pub_key, log);\n context.accumulate_encrypted_logs(log);\n}\n\nfn emit_unencrypted_log<T>(\n context: &mut PrivateContext,\n log: T,\n) {\n let _ = oracle::logs::emit_unencrypted_log(log);\n context.accumulate_unencrypted_logs(log);\n}\n",
189
- "path": "/mnt/user-data/alvaro/aztec-packages/yarn-project/noir-libs/noir-aztec/src/log"
189
+ "path": "/mnt/user-data/jan/aztec-packages/yarn-project/noir-libs/noir-aztec/src/log"
190
190
  },
191
191
  "39": {
192
192
  "source": "use dep::std::option::Option;\nuse crate::abi::PublicContextInputs;\nuse crate::context::{\n PrivateContext,\n PublicContext,\n};\nuse crate::note::{\n note_header::NoteHeader,\n note_interface::NoteInterface,\n utils::compute_inner_note_hash,\n};\nuse crate::oracle::notes::{notify_created_note, notify_nullified_note};\nuse crate::constants_gen::EMPTY_NULLIFIED_COMMITMENT;\n\nfn create_note<Note, N>(\n context: &mut PrivateContext,\n storage_slot: Field,\n note: &mut Note,\n note_interface: NoteInterface<Note, N>,\n) {\n let contract_address = (*context).this_address();\n\n let header = NoteHeader { contract_address, storage_slot, nonce: 0 };\n let set_header = note_interface.set_header;\n set_header(note, header);\n let inner_note_hash = compute_inner_note_hash(note_interface, *note);\n\n let serialise = note_interface.serialise;\n let preimage = serialise(*note);\n assert(notify_created_note(storage_slot, preimage, inner_note_hash) == 0);\n\n context.push_new_note_hash(inner_note_hash);\n}\n\nfn create_note_hash_from_public<Note, N>(\n context: &mut PublicContext,\n storage_slot: Field,\n note: &mut Note,\n note_interface: NoteInterface<Note, N>,\n) {\n let contract_address = (*context).this_address();\n\n let header = NoteHeader { contract_address, storage_slot, nonce: 0 };\n let set_header = note_interface.set_header;\n set_header(note, header);\n let inner_note_hash = compute_inner_note_hash(note_interface, *note);\n\n context.push_new_note_hash(inner_note_hash);\n}\n\nfn destroy_note<Note, N>(\n context: &mut PrivateContext,\n storage_slot: Field,\n note: Note,\n note_interface: NoteInterface<Note, N>,\n) {\n let mut nullifier = 0;\n let mut nullified_commitment: Field = EMPTY_NULLIFIED_COMMITMENT;\n let compute_nullifier = note_interface.compute_nullifier;\n nullifier = compute_nullifier(note);\n\n let serialise = note_interface.serialise;\n let preimage = serialise(note);\n\n // We also need the note commitment corresponding to the \"nullifier\"\n let get_header = note_interface.get_header;\n let header = get_header(note);\n // 0 nonce implies \"transient\" nullifier (must nullify a commitment in this TX).\n // `nullified_commitment` is used to inform the kernel which pending commitment\n // the nullifier corresponds to so they can be matched and both squashed/deleted.\n // nonzero nonce implies \"persistable\" nullifier (nullifies a persistent/in-tree\n // commitment) in which case `nullified_commitment` is not used since the kernel\n // just siloes and forwards the nullier to its output.\n if (header.nonce == 0) {\n // TODO(suyash): Can we reuse the note commitment computed in `compute_nullifier`?\n nullified_commitment = compute_inner_note_hash(note_interface, note);\n }\n assert(notify_nullified_note(storage_slot, nullifier, preimage, nullified_commitment) == 0);\n\n context.push_new_nullifier(nullifier, nullified_commitment)\n}",
193
- "path": "/mnt/user-data/alvaro/aztec-packages/yarn-project/noir-libs/noir-aztec/src/note/lifecycle"
193
+ "path": "/mnt/user-data/jan/aztec-packages/yarn-project/noir-libs/noir-aztec/src/note/lifecycle"
194
194
  },
195
195
  "40": {
196
196
  "source": "use dep::std::option::Option;\nuse crate::constants_gen::{\n MAX_READ_REQUESTS_PER_CALL,\n GET_NOTE_ORACLE_RETURN_LENGTH,\n GET_NOTES_ORACLE_RETURN_LENGTH,\n MAX_NOTES_PER_PAGE,\n VIEW_NOTE_ORACLE_RETURN_LENGTH,\n};\nuse crate::context::PrivateContext;\nuse crate::note::{\n note_getter_options::{NoteGetterOptions, Select, Sort},\n note_interface::NoteInterface,\n note_header::NoteHeader,\n note_viewer_options::NoteViewerOptions,\n utils::compute_note_hash_for_read_or_nullify,\n utils::compute_unique_siloed_note_hash,\n utils::compute_inner_note_hash,\n utils::compute_siloed_note_hash,\n};\nuse crate::messaging::get_commitment_getter_data::make_commitment_getter_data;\nuse crate::oracle;\nuse crate::types::vec::BoundedVec;\n\nfn check_note_header<Note, N>(\n context: PrivateContext,\n storage_slot: Field,\n note_interface: NoteInterface<Note, N>,\n note: Note,\n) {\n let get_header = note_interface.get_header;\n let header = get_header(note);\n let contract_address = context.this_address();\n assert(header.contract_address == contract_address);\n assert(header.storage_slot == storage_slot);\n}\n\nfn ensure_note_exists<Note, N>(\n context: &mut PrivateContext,\n storage_slot: Field,\n note_interface: NoteInterface<Note, N>,\n note: &mut Note,\n) {\n let saved_note = get_note_internal(storage_slot, note_interface);\n\n // Only copy over the header to the original note to make sure the preimage is the same.\n let get_header = note_interface.get_header;\n let set_header = note_interface.set_header;\n let note_header = get_header(saved_note);\n set_header(note, note_header);\n\n check_note_header(*context, storage_slot, note_interface, *note);\n\n let note_hash_for_read_request = compute_note_hash_for_read_or_nullify(note_interface, *note);\n context.push_read_request(note_hash_for_read_request);\n}\n\n// Ensure a note's hash exists in the tree without retrieving the entire\n// notes via the oracle.\n// Modifies the note by populating it with header info.\nfn ensure_note_hash_exists<Note, N>(\n context: &mut PrivateContext,\n storage_slot: Field,\n note_interface: NoteInterface<Note, N>,\n note: &mut Note,\n) {\n // Initialize header of note. Must be done before computing note hashes as it initializes the:\n // - storage slot (used in inner note hash)\n // - the contract address (used in siloed note hash)\n // - and the nonce (used in the unique siloed note hash)\n let set_header = note_interface.set_header;\n let note_header = NoteHeader {\n contract_address: (*context).this_address(),\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1386): should be\n // real nonce (once public kernel applies nonces).\n nonce: 0,\n storage_slot\n };\n set_header(note, note_header);\n\n // Get a note from oracle and early out if it doesn't exist.\n let inner_note_hash = compute_inner_note_hash(note_interface, *note);\n\n let raw_oracle_ret = oracle::get_commitment::get_commitment(inner_note_hash);\n let deserialized_oracle_ret = make_commitment_getter_data(raw_oracle_ret, 0);\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1386): should be\n // unique_siloed_note_hash once public kernel applies nonces\n let saved_siloed_note_hash = deserialized_oracle_ret.message;\n\n assert(saved_siloed_note_hash != 0); // TODO(dbanks12): necessary?\n\n check_note_header(*context, storage_slot, note_interface, *note);\n\n // Ensure that the note hash retrieved from oracle matches the one computed from note.\n let computed_siloed_note_hash = compute_siloed_note_hash(note_interface, *note);\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1386): should be\n // compute_note_hash_for_read_or_nullify once public kernel applies nonces\n assert(computed_siloed_note_hash == saved_siloed_note_hash);\n\n context.push_read_request(computed_siloed_note_hash);\n}\n\nfn get_note<Note, N>(\n context: &mut PrivateContext,\n storage_slot: Field,\n note_interface: NoteInterface<Note, N>,\n) -> Note {\n let note = get_note_internal(storage_slot, note_interface);\n\n check_note_header(*context, storage_slot, note_interface, note);\n\n let note_hash_for_read_request = compute_note_hash_for_read_or_nullify(note_interface, note);\n\n context.push_read_request(note_hash_for_read_request);\n note\n}\n\nfn get_notes<Note, N, FILTER_ARGS>(\n context: &mut PrivateContext,\n storage_slot: Field,\n note_interface: NoteInterface<Note, N>,\n options: NoteGetterOptions<Note, N, FILTER_ARGS>,\n) -> [Option<Note>; MAX_READ_REQUESTS_PER_CALL] {\n let opt_notes = get_notes_internal(storage_slot, note_interface, options);\n for i in 0..opt_notes.len() {\n let opt_note = opt_notes[i];\n let mut note_hash_for_read_request = 0;\n if opt_note.is_some() {\n let note = opt_note.unwrap_unchecked();\n check_note_header(*context, storage_slot, note_interface, note);\n note_hash_for_read_request = compute_note_hash_for_read_or_nullify(note_interface, note);\n };\n // TODO(https://github.com/AztecProtocol/aztec-packages/issues/1410): test to ensure\n // failure if malicious oracle injects 0 nonce here for a \"pre-existing\" note.\n context.push_read_request(note_hash_for_read_request);\n };\n\n // TODO(#1660)\n // Move it back to get_notes_internal and only make read request for selected notes.\n let filter = options.filter;\n let filter_args = options.filter_args;\n filter(opt_notes, filter_args)\n}\n\nunconstrained fn get_note_internal<Note, N>(\n storage_slot: Field,\n note_interface: NoteInterface<Note, N>,\n) -> Note {\n let placeholder_note = [Option::none()];\n let placeholder_fields = [0; GET_NOTE_ORACLE_RETURN_LENGTH];\n oracle::notes::get_notes(\n storage_slot,\n note_interface,\n 0,\n [],\n [],\n [],\n [],\n 1, // limit\n 0, // offset\n placeholder_note,\n placeholder_fields,\n )[0].unwrap() // Notice: we don't allow dummies to be returned from get_note (singular).\n}\n\nunconstrained fn get_notes_internal<Note, N, FILTER_ARGS>(\n storage_slot: Field,\n note_interface: NoteInterface<Note, N>,\n options: NoteGetterOptions<Note, N, FILTER_ARGS>,\n) -> [Option<Note>; MAX_READ_REQUESTS_PER_CALL] {\n let (num_selects, select_by, select_values, sort_by, sort_order) = flatten_options(options.selects, options.sorts);\n let placeholder_opt_notes = [Option::none(); MAX_READ_REQUESTS_PER_CALL];\n let placeholder_fields = [0; GET_NOTES_ORACLE_RETURN_LENGTH];\n oracle::notes::get_notes(\n storage_slot,\n note_interface,\n num_selects,\n select_by,\n select_values,\n sort_by,\n sort_order,\n options.limit,\n options.offset,\n placeholder_opt_notes,\n placeholder_fields,\n )\n}\n\nunconstrained fn view_notes<Note, N>(\n storage_slot: Field,\n note_interface: NoteInterface<Note, N>,\n options: NoteViewerOptions<Note, N>,\n) -> [Option<Note>; MAX_NOTES_PER_PAGE] {\n let (num_selects, select_by, select_values, sort_by, sort_order) = flatten_options(options.selects, options.sorts);\n let placeholder_opt_notes = [Option::none(); MAX_NOTES_PER_PAGE];\n let placeholder_fields = [0; VIEW_NOTE_ORACLE_RETURN_LENGTH];\n oracle::notes::get_notes(\n storage_slot,\n note_interface,\n num_selects,\n select_by,\n select_values,\n sort_by,\n sort_order,\n options.limit,\n options.offset,\n placeholder_opt_notes,\n placeholder_fields,\n )\n}\n\nunconstrained fn flatten_options<Note, N>(\n selects: BoundedVec<Option<Select>, N>,\n sorts: BoundedVec<Option<Sort>, N>,\n) -> (u8, [u8; N], [Field; N], [u8; N], [u2; N]) {\n let mut num_selects = 0;\n let mut select_by = [0; N];\n let mut select_values = [0; N];\n for i in 0..selects.len {\n let select = selects.get(i);\n if select.is_some() {\n select_by[num_selects] = select.unwrap_unchecked().field_index;\n select_values[num_selects] = select.unwrap_unchecked().value;\n num_selects += 1;\n };\n };\n\n let mut sort_by = [0; N];\n let mut sort_order = [0; N];\n for i in 0..sorts.len {\n let sort = sorts.get(i);\n if sort.is_some() {\n sort_by[i] = sort.unwrap_unchecked().field_index;\n sort_order[i] = sort.unwrap_unchecked().order;\n };\n };\n\n (num_selects, select_by, select_values, sort_by, sort_order)\n}",
197
- "path": "/mnt/user-data/alvaro/aztec-packages/yarn-project/noir-libs/noir-aztec/src/note/note_getter"
197
+ "path": "/mnt/user-data/jan/aztec-packages/yarn-project/noir-libs/noir-aztec/src/note/note_getter"
198
198
  },
199
199
  "42": {
200
200
  "source": "use dep::std::hash::{pedersen, pedersen_with_separator};\nuse crate::constants_gen::{GENERATOR_INDEX__UNIQUE_COMMITMENT, GENERATOR_INDEX__SILOED_COMMITMENT};\n\nfn compute_inner_hash(storage_slot: Field, note_hash: Field) -> Field {\n // TODO(#1205) Do we need a generator index here?\n pedersen([storage_slot, note_hash])[0]\n}\n\nfn compute_siloed_hash(contract_address: Field, inner_note_hash: Field) -> Field {\n let inputs = [contract_address, inner_note_hash];\n pedersen_with_separator(inputs, GENERATOR_INDEX__SILOED_COMMITMENT)[0]\n}\n\nfn compute_unique_hash(nonce: Field, siloed_note_hash: Field) -> Field {\n let inputs = [nonce, siloed_note_hash];\n pedersen_with_separator(inputs, GENERATOR_INDEX__UNIQUE_COMMITMENT)[0]\n}\n",
201
- "path": "/mnt/user-data/alvaro/aztec-packages/yarn-project/noir-libs/noir-aztec/src/note/note_hash"
201
+ "path": "/mnt/user-data/jan/aztec-packages/yarn-project/noir-libs/noir-aztec/src/note/note_hash"
202
202
  },
203
203
  "46": {
204
204
  "source": "use crate::note::{\n note_hash::{compute_inner_hash, compute_siloed_hash, compute_unique_hash},\n note_header::NoteHeader,\n note_interface::NoteInterface,\n};\nuse crate::utils::arr_copy_slice;\n\nfn compute_inner_note_hash<Note, N>(\n note_interface: NoteInterface<Note, N>,\n note: Note,\n) -> Field {\n let get_header = note_interface.get_header;\n let header = get_header(note);\n\n let compute_note_hash = note_interface.compute_note_hash;\n let note_hash = compute_note_hash(note);\n\n compute_inner_hash(header.storage_slot, note_hash)\n}\n\nfn compute_siloed_note_hash<Note, N>(\n note_interface: NoteInterface<Note, N>,\n note_with_header: Note,\n) -> Field {\n let get_header = note_interface.get_header;\n let header = get_header(note_with_header);\n\n let inner_note_hash = compute_inner_note_hash(note_interface, note_with_header);\n\n compute_siloed_hash(header.contract_address, inner_note_hash)\n}\n\nfn compute_unique_siloed_note_hash<Note, N>(\n note_interface: NoteInterface<Note, N>,\n note_with_header: Note,\n) -> Field {\n let get_header = note_interface.get_header;\n let header = get_header(note_with_header);\n\n let siloed_note_hash = compute_siloed_note_hash(note_interface, note_with_header);\n\n compute_unique_hash(header.nonce, siloed_note_hash)\n}\n\nfn compute_note_hash_for_read_or_nullify<Note, N>(\n note_interface: NoteInterface<Note, N>,\n note_with_header: Note,\n) -> Field {\n let get_header = note_interface.get_header;\n let header = get_header(note_with_header);\n\n if (header.nonce == 0) {\n // when nonce is zero, that means we are reading a pending note (doesn't have a nonce yet),\n // so we just read the inner_note_hash (kernel will silo by contract address)\n compute_inner_note_hash(note_interface, note_with_header)\n } else {\n // When nonce is nonzero, that means we are reading a settled note (from tree) created in a\n // previous TX. So we need the unique_siloed_note_hash which has already been hashed with\n // contract address and then nonce. This hash will match the existing leaf in the private\n // data tree, so the kernel can just perform a membership check directly on this hash/leaf.\n compute_unique_siloed_note_hash(note_interface, note_with_header)\n }\n\n}\n\nfn compute_note_hash_and_nullifier<Note, N, S>(\n note_interface: NoteInterface<Note, N>,\n note_header: NoteHeader,\n preimage: [Field; S],\n) -> [Field; 4] {\n let deserialise = note_interface.deserialise;\n let set_header = note_interface.set_header;\n let mut note = deserialise(arr_copy_slice(preimage, [0; N], 0));\n set_header(&mut note, note_header);\n\n let compute_note_hash = note_interface.compute_note_hash;\n let note_hash = compute_note_hash(note);\n let inner_note_hash = compute_inner_hash(note_header.storage_slot, note_hash);\n\n let siloed_note_hash = compute_siloed_hash(note_header.contract_address, inner_note_hash);\n\n let unique_siloed_note_hash = compute_unique_hash(note_header.nonce, siloed_note_hash);\n\n let compute_nullifier = note_interface.compute_nullifier;\n let inner_nullifier = compute_nullifier(note);\n\n [inner_note_hash, siloed_note_hash, unique_siloed_note_hash, inner_nullifier]\n}\n",
205
- "path": "/mnt/user-data/alvaro/aztec-packages/yarn-project/noir-libs/noir-aztec/src/note/utils"
205
+ "path": "/mnt/user-data/jan/aztec-packages/yarn-project/noir-libs/noir-aztec/src/note/utils"
206
206
  },
207
207
  "48": {
208
208
  "source": "use dep::std::hash::pedersen_with_separator;\nuse crate::context::PrivateContext;\nuse crate::note::{\n lifecycle::create_note,\n note_getter::{get_note, view_notes},\n note_interface::NoteInterface,\n note_viewer_options::NoteViewerOptions,\n};\nuse crate::oracle;\nuse crate::constants_gen::{\n GENERATOR_INDEX__INITIALISATION_NULLIFIER,\n EMPTY_NULLIFIED_COMMITMENT,\n};\n\nstruct ImmutableSingleton<Note, N> {\n storage_slot: Field,\n note_interface: NoteInterface<Note, N>,\n}\n\nimpl<Note, N> ImmutableSingleton<Note, N> {\n fn new(storage_slot: Field, note_interface: NoteInterface<Note, N>) -> Self {\n ImmutableSingleton { storage_slot, note_interface }\n }\n\n unconstrained fn is_initialised(self) -> bool {\n let nullifier = self.compute_initialisation_nullifier();\n oracle::notes::is_nullifier_emitted(nullifier)\n }\n\n fn initialise(self, context: &mut PrivateContext, note: &mut Note) {\n // Nullify the storage slot.\n let nullifier = self.compute_initialisation_nullifier();\n context.push_new_nullifier(nullifier, EMPTY_NULLIFIED_COMMITMENT);\n\n create_note(context, self.storage_slot, note, self.note_interface);\n }\n\n fn compute_initialisation_nullifier(self) -> Field {\n pedersen_with_separator([self.storage_slot], GENERATOR_INDEX__INITIALISATION_NULLIFIER)[0]\n }\n \n fn get_note(self, context: &mut PrivateContext) -> Note {\n let storage_slot = self.storage_slot;\n get_note(context, storage_slot, self.note_interface)\n }\n\n unconstrained fn view_note(self) -> Note {\n let options = NoteViewerOptions::new().set_limit(1);\n view_notes(self.storage_slot, self.note_interface, options)[0].unwrap()\n }\n}",
209
- "path": "/mnt/user-data/alvaro/aztec-packages/yarn-project/noir-libs/noir-aztec/src/state_vars/immutable_singleton"
209
+ "path": "/mnt/user-data/jan/aztec-packages/yarn-project/noir-libs/noir-aztec/src/state_vars/immutable_singleton"
210
210
  },
211
211
  "55": {
212
212
  "source": "\nstruct BoundedVec<T, MaxLen> {\n storage: [T; MaxLen],\n len: Field,\n}\n\nimpl<T, MaxLen> BoundedVec<T, MaxLen> {\n fn new(initial_value: T) -> Self {\n BoundedVec { storage: [initial_value; MaxLen], len: 0 }\n }\n\n fn get(mut self: Self, index: Field) -> T {\n assert(index as u64 < self.len as u64);\n self.storage[index]\n }\n\n fn push(&mut self, elem: T) {\n assert(self.len as u64 < MaxLen as u64);\n\n self.storage[self.len] = elem;\n self.len += 1;\n }\n\n fn push_array<Len>(&mut self, array: [T; Len]) {\n let newLen = self.len + array.len();\n assert(newLen as u64 <= MaxLen as u64);\n for i in 0..array.len() {\n self.storage[self.len + i] = array[i];\n }\n self.len = newLen;\n }\n\n fn pop(&mut self) -> T {\n assert(self.len as u64 > 0);\n\n let elem = self.storage[self.len - 1];\n self.len -= 1;\n elem\n }\n}\n\n// #[test]\n// fn test_vec() {\n// let vec: BoundedVec<Field, 2> = BoundedVec::new(0);\n// assert(vec.len == 0);\n// let vec1 = vec.push(1);\n// assert(vec1.len == 1);\n// let vec2 = vec1.push(1);\n// assert(vec2.len == 2);\n// let vec3 = vec2.push(1);\n// assert(vec3.len == 3);\n// let x = vec3.pop();\n// assert(x == 1);\n// }",
213
- "path": "/mnt/user-data/alvaro/aztec-packages/yarn-project/noir-libs/noir-aztec/src/types/vec"
213
+ "path": "/mnt/user-data/jan/aztec-packages/yarn-project/noir-libs/noir-aztec/src/types/vec"
214
214
  },
215
215
  "70": {
216
216
  "source": "use crate::types::point::Point;\nuse dep::std::hash;\nuse crate::constants_gen::GENERATOR_INDEX__CONTRACT_ADDRESS;\n\n#[oracle(getPublicKey)]\nfn get_public_key_oracle(_address: Field) -> [Field; 3] {}\n\nunconstrained fn get_public_key_internal(address: Field) -> [Field; 3] {\n get_public_key_oracle(address)\n}\n\nfn get_public_key(address: Field) -> Point {\n let result = get_public_key_internal(address);\n let pub_key_x = result[0];\n let pub_key_y = result[1];\n let partial_address = result[2];\n \n let calculated_address = hash::pedersen_with_separator([pub_key_x, pub_key_y, partial_address], GENERATOR_INDEX__CONTRACT_ADDRESS)[0];\n assert(calculated_address == address);\n \n Point::new(pub_key_x, pub_key_y)\n}\n",
217
- "path": "/mnt/user-data/alvaro/aztec-packages/yarn-project/noir-libs/noir-aztec/src/oracle/get_public_key"
217
+ "path": "/mnt/user-data/jan/aztec-packages/yarn-project/noir-libs/noir-aztec/src/oracle/get_public_key"
218
218
  },
219
219
  "78": {
220
220
  "source": "use crate::abi;\nuse crate::types::vec::BoundedVec;\nuse crate::context::PrivateContext;\nuse crate::private_call_stack_item::PrivateCallStackItem;\nuse crate::public_call_stack_item::PublicCallStackItem; \n\nglobal ACCOUNT_MAX_PRIVATE_CALLS: Field = 2;\nglobal ACCOUNT_MAX_PUBLIC_CALLS: Field = 2;\nglobal ACCOUNT_MAX_CALLS: Field = 4;\n// 1 (ARGS_HASH) + 1 (FUNCTION_SELECTOR) + 1 (TARGET_ADDRESS)\nglobal FUNCTION_CALL_SIZE: Field = 3;\n\nstruct FunctionCall {\n args_hash: Field,\n function_selector: Field,\n target_address: Field,\n}\n\nimpl FunctionCall {\n fn serialize(self) -> [Field; FUNCTION_CALL_SIZE] {\n [self.args_hash, self.function_selector, self.target_address]\n }\n}\n\n// FUNCTION_CALL_SIZE * (ACCOUNT_MAX_PUBLIC_CALLS + ACCOUNT_MAX_PRIVATE_CALLS) + 1\nglobal ENTRYPOINT_PAYLOAD_SIZE: Field = 13;\nglobal ENTRYPOINT_PAYLOAD_SIZE_IN_BYTES: Field = 416;\n\nstruct EntrypointPayload {\n // Noir doesnt support nested arrays or structs yet so we flatten everything\n flattened_args_hashes: [Field; ACCOUNT_MAX_CALLS],\n flattened_selectors: [Field; ACCOUNT_MAX_CALLS],\n flattened_targets: [Field; ACCOUNT_MAX_CALLS],\n nonce: Field,\n}\n\nimpl EntrypointPayload {\n // TODO(#1207) Do we need a generator index?\n fn hash(self) -> Field {\n dep::std::hash::pedersen(self.serialize())[0]\n }\n\n // Serializes the entrypoint struct\n fn serialize(self) -> [Field; ENTRYPOINT_PAYLOAD_SIZE] {\n let mut fields: BoundedVec<Field, ENTRYPOINT_PAYLOAD_SIZE> = BoundedVec::new(0); \n fields.push_array(self.flattened_args_hashes);\n fields.push_array(self.flattened_selectors);\n fields.push_array(self.flattened_targets);\n fields.push(self.nonce);\n fields.storage\n }\n\n // Serializes the payload as an array of bytes. Useful for hashing with sha256.\n fn to_be_bytes(self) -> [u8; ENTRYPOINT_PAYLOAD_SIZE_IN_BYTES] {\n let mut bytes: [u8; ENTRYPOINT_PAYLOAD_SIZE_IN_BYTES] = [0; ENTRYPOINT_PAYLOAD_SIZE_IN_BYTES];\n\n let args_len = self.flattened_args_hashes.len();\n let selectors_len = self.flattened_selectors.len();\n let targets_len = self.flattened_targets.len();\n\n for i in 0..args_len {\n let item_bytes = self.flattened_args_hashes[i].to_be_bytes(32);\n for j in 0..32 { \n bytes[i * 32 + j] = item_bytes[j];\n }\n }\n\n for i in 0..selectors_len {\n let item_bytes = self.flattened_selectors[i].to_be_bytes(32);\n for j in 0..32 { \n bytes[args_len * 32 + i * 32 + j] = item_bytes[j];\n }\n }\n\n for i in 0..targets_len {\n let item_bytes = self.flattened_targets[i].to_be_bytes(32);\n for j in 0..32 { \n bytes[(args_len + selectors_len) * 32 + i * 32 + j] = item_bytes[j];\n }\n }\n \n let item_bytes = self.nonce.to_be_bytes(32);\n for j in 0..32 { \n bytes[(args_len + selectors_len + targets_len) * 32 + j] = item_bytes[j];\n }\n\n bytes\n }\n\n // Executes all private and public calls \n fn execute_calls(self, context: &mut PrivateContext) {\n for i in 0..ACCOUNT_MAX_PRIVATE_CALLS {\n let target_address = self.flattened_targets[i];\n if target_address != 0 {\n let function_selector = self.flattened_selectors[i];\n let args_hash = self.flattened_args_hashes[i];\n let _callStackItem = context.call_private_function_with_packed_args(target_address, function_selector, args_hash);\n }\n }\n for i in ACCOUNT_MAX_PRIVATE_CALLS..ACCOUNT_MAX_CALLS {\n let target_address = self.flattened_targets[i];\n if target_address != 0 {\n let function_selector = self.flattened_selectors[i];\n let args_hash = self.flattened_args_hashes[i];\n let _callStackItem = context.call_public_function_with_packed_args(target_address, function_selector, args_hash);\n }\n }\n }\n}",
221
- "path": "/mnt/user-data/alvaro/aztec-packages/yarn-project/noir-libs/noir-aztec/src/entrypoint"
221
+ "path": "/mnt/user-data/jan/aztec-packages/yarn-project/noir-libs/noir-aztec/src/entrypoint"
222
222
  }
223
223
  }
224
224
  }