Skip to content

Commit

Permalink
feat: Use poseidon for merkle tree hashing (#7356)
Browse files Browse the repository at this point in the history
Switches all merkle trees used in aztec to poseidon2
  • Loading branch information
sirasistant authored Aug 5, 2024
1 parent bdfd272 commit 2daf2ab
Show file tree
Hide file tree
Showing 32 changed files with 409 additions and 360 deletions.
2 changes: 1 addition & 1 deletion .github/ensure-tester-with-images/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ inputs:
tester_ttl:
required: false
description: "Time to live for the tester instance in minutes"
default: 30
default: 45
runs:
# define an action, runs in OS of caller
using: composite
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,8 @@ template <typename FF_> class MegaArith {
this->aux = 1400000;
this->lookup = 460000;
this->busread = 1 << 7;
this->poseidon_external = 15000;
this->poseidon_internal = 85000;
this->poseidon_external = 30000;
this->poseidon_internal = 170000;
}
};

Expand Down
10 changes: 5 additions & 5 deletions l1-contracts/src/core/libraries/ConstantsGen.sol
Original file line number Diff line number Diff line change
Expand Up @@ -124,15 +124,15 @@ library Constants {
uint256 internal constant L2_GAS_PER_NOTE_HASH = 32;
uint256 internal constant L2_GAS_PER_NULLIFIER = 64;
uint256 internal constant CANONICAL_KEY_REGISTRY_ADDRESS =
1846248480517165521743643626257274710444505994181338106189373716137867887031;
13457222047904330765774796260088567201269649167356521005501223652902339211182;
uint256 internal constant CANONICAL_AUTH_REGISTRY_ADDRESS =
291851909807592677788453151491906806151300647123080163180507453297558628774;
16522644890256297179255458951626875692461008240031142745359776058397274208468;
uint256 internal constant DEPLOYER_CONTRACT_ADDRESS =
9256947041321027089533495832830405543710101516429552788062967841445602134030;
19310994760783330368337163480198602393920956587162708699802190083077641908361;
uint256 internal constant REGISTERER_CONTRACT_ADDRESS =
867409746588255642605883457564767101821478729272763062990600291025697803994;
2631409926445785927331173506476539962589925110142857699603561302478860342858;
uint256 internal constant GAS_TOKEN_ADDRESS =
8777298866013239306861859762114222884687709421566494727011568767822269644915;
5232557136129983235483007223848855544006161252993804924983404332852577870185;
uint256 internal constant AZTEC_ADDRESS_LENGTH = 1;
uint256 internal constant GAS_FEES_LENGTH = 2;
uint256 internal constant GAS_LENGTH = 2;
Expand Down
4 changes: 2 additions & 2 deletions noir-projects/aztec-nr/aztec/src/history/note_inclusion.nr
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use std::merkle::compute_merkle_root;
use dep::protocol_types::merkle_tree::root::root_from_sibling_path;
use dep::protocol_types::header::Header;

use crate::{
Expand All @@ -20,7 +20,7 @@ impl ProveNoteInclusion for Header {

// 3) Prove that the commitment is in the note hash tree
assert_eq(
self.state.partial.note_hash_tree.root, compute_merkle_root(note_hash, witness.index, witness.path), "Proving note inclusion failed"
self.state.partial.note_hash_tree.root, root_from_sibling_path(note_hash, witness.index, witness.path), "Proving note inclusion failed"
);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use std::merkle::compute_merkle_root;
use dep::protocol_types::merkle_tree::root::root_from_sibling_path;
use dep::protocol_types::header::Header;

use crate::{
Expand All @@ -24,7 +24,7 @@ impl ProveNullifierInclusion for Header {
// 4) Prove that the nullifier is in the nullifier tree
assert(
self.state.partial.nullifier_tree.root
== compute_merkle_root(nullifier_leaf, witness.index, witness.path), "Proving nullifier inclusion failed"
== root_from_sibling_path(nullifier_leaf, witness.index, witness.path), "Proving nullifier inclusion failed"
);
// --> Now we have traversed the trees all the way up to archive root and verified that the nullifier
// was included in the nullifier tree.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use std::merkle::compute_merkle_root;
use dep::protocol_types::merkle_tree::root::root_from_sibling_path;
use dep::protocol_types::{header::Header, utils::field::{full_field_less_than, full_field_greater_than}};
use crate::{
context::PrivateContext, note::{utils::compute_siloed_nullifier, note_interface::NoteInterface},
Expand All @@ -20,7 +20,7 @@ impl ProveNullifierNonInclusion for Header {
let low_nullifier_leaf = witness.leaf_preimage.hash();
assert(
self.state.partial.nullifier_tree.root
== compute_merkle_root(low_nullifier_leaf, witness.index, witness.path), "Proving nullifier non-inclusion failed: Could not prove low nullifier inclusion"
== root_from_sibling_path(low_nullifier_leaf, witness.index, witness.path), "Proving nullifier non-inclusion failed: Could not prove low nullifier inclusion"
);

// 2.b) Prove that the low nullifier is smaller than the nullifier
Expand Down
4 changes: 2 additions & 2 deletions noir-projects/aztec-nr/aztec/src/history/public_storage.nr
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use dep::protocol_types::{
constants::GENERATOR_INDEX__PUBLIC_LEAF_INDEX, hash::poseidon2_hash_with_separator,
address::AztecAddress, header::Header, utils::field::full_field_less_than
};
use std::merkle::compute_merkle_root;
use dep::protocol_types::merkle_tree::root::root_from_sibling_path;

use crate::{context::PrivateContext, oracle::get_public_data_witness::get_public_data_witness};

Expand Down Expand Up @@ -46,7 +46,7 @@ impl PublicStorageHistoricalRead for Header {
// but also the metadata (slot, next index and next slot).
assert(
self.state.partial.public_data_tree.root
== compute_merkle_root(preimage.hash(), witness.index, witness.path), "Proving public value inclusion failed"
== root_from_sibling_path(preimage.hash(), witness.index, witness.path), "Proving public value inclusion failed"
);

value
Expand Down
4 changes: 2 additions & 2 deletions noir-projects/aztec-nr/aztec/src/messaging.nr
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use crate::{
oracle::get_l1_to_l2_membership_witness::get_l1_to_l2_membership_witness
};

use std::merkle::compute_merkle_root;
use dep::protocol_types::merkle_tree::root::root_from_sibling_path;
use dep::protocol_types::{constants::L1_TO_L2_MSG_TREE_HEIGHT, address::{AztecAddress, EthAddress}, utils::arr_copy_slice};

pub fn process_l1_to_l2_message(
Expand Down Expand Up @@ -31,7 +31,7 @@ pub fn process_l1_to_l2_message(

// Check that the message is in the tree
// This is implicitly checking that the values of the message are correct
let root = compute_merkle_root(message_hash, leaf_index, sibling_path);
let root = root_from_sibling_path(message_hash, leaf_index, sibling_path);
assert(root == l1_to_l2_root, "Message not in state");

compute_message_nullifier(message_hash, secret, leaf_index)
Expand Down
4 changes: 2 additions & 2 deletions noir-projects/aztec-nr/aztec/src/oracle/header.nr
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use std::merkle::compute_merkle_root;
use dep::protocol_types::merkle_tree::root::root_from_sibling_path;
use dep::protocol_types::{constants::HEADER_LENGTH, header::Header};

use crate::{context::PrivateContext, oracle::get_membership_witness::get_archive_membership_witness};
Expand Down Expand Up @@ -42,7 +42,7 @@ pub fn get_header_at(block_number: u32, context: PrivateContext) -> Header {
// 6) Check that the block is in the archive (i.e. the witness is valid)
assert(
context.historical_header.last_archive.root
== compute_merkle_root(block_hash, witness.index, witness.path), "Proving membership of a block in archive failed"
== root_from_sibling_path(block_hash, witness.index, witness.path), "Proving membership of a block in archive failed"
);

// 7) Return the block header
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@ struct BaseParityInputs {
impl BaseParityInputs {
pub fn base_parity_circuit(self) -> ParityPublicInputs {
let sha_tree = Sha256MerkleTree::new(self.msgs);
let pedersen_tree = MerkleTree::new(self.msgs);
let poseidon_tree = MerkleTree::new(self.msgs);

ParityPublicInputs {
sha_root: sha_tree.get_root(),
converted_root: pedersen_tree.get_root(),
converted_root: poseidon_tree.get_root(),
vk_tree_root: self.vk_tree_root
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,9 @@ impl RootParityInputs {
}

let sha_tree = Sha256MerkleTree::new(sha_roots);
let pedersen_tree = MerkleTree::new(converted_roots);
let poseidon_tree = MerkleTree::new(converted_roots);

ParityPublicInputs { sha_root: sha_tree.get_root(), converted_root: pedersen_tree.get_root(), vk_tree_root }
ParityPublicInputs { sha_root: sha_tree.get_root(), converted_root: poseidon_tree.get_root(), vk_tree_root }
}

fn verify_child_proofs(self) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ impl Hash for NullifierLeafPreimage {
if self.is_empty() {
0
} else {
std::hash::pedersen_hash(self.serialize())
crate::hash::poseidon2_hash(self.serialize())
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -175,11 +175,11 @@ global L2_GAS_PER_NOTE_HASH: u32 = 32;
global L2_GAS_PER_NULLIFIER: u32 = 64;

// CANONICAL CONTRACT ADDRESSES
global CANONICAL_KEY_REGISTRY_ADDRESS = 0x0414f08a3241bff274504c14522869898d5ed3aa6c3d6e20f216953ec98641b7;
global CANONICAL_AUTH_REGISTRY_ADDRESS = 0x00a52eacfd4eb01f233f5f01fce672d8f91295fded9d62ad9f708519df4529a6;
global DEPLOYER_CONTRACT_ADDRESS = 0x14773f1105c64880735d3971d29ae33fda04f8969500501d6eacecad7abc080e;
global REGISTERER_CONTRACT_ADDRESS = 0x01eaefbfac0fa59ec9f018f85809e0bfb0cd391122788c12fb31aab0bf0a8eda;
global GAS_TOKEN_ADDRESS = 0x1367c66d6702663df6aa283bbd675463593376cd09eb310a1a8fe6086dba0073;
global CANONICAL_KEY_REGISTRY_ADDRESS = 0x1dc0848be99ba522c157b46ab5ed64d86703a74e7df8fe1b3a82f45e2dbdefae;
global CANONICAL_AUTH_REGISTRY_ADDRESS = 0x24877c50868f86712240eb535d90d1c97403d074805dd3758c3aecb02958f8d4;
global DEPLOYER_CONTRACT_ADDRESS = 0x2ab1a2bd6d07d8d61ea56d85861446349e52c6b7c0612b702cb1e6db6ad0b089;
global REGISTERER_CONTRACT_ADDRESS = 0x05d15342d76e46e5be07d3cda0d753158431cdc5e39d29ce4e8fe1f5c070564a;
global GAS_TOKEN_ADDRESS = 0x0b9185bb21ae5ec07011d459dca15a226712e49d9f6238ba0799bd6c2768a169;

// LENGTH OF STRUCTS SERIALIZED TO FIELDS
global AZTEC_ADDRESS_LENGTH = 1;
Expand Down
7 changes: 5 additions & 2 deletions noir-projects/noir-protocol-circuits/crates/types/src/hash.nr
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ pub fn silo_unencrypted_log_hash(log_hash: ScopedLogHash) -> Field {
}

pub fn merkle_hash(left: Field, right: Field) -> Field {
pedersen_hash([left, right], 0)
poseidon2_hash([left, right])
}

pub fn stdlib_recursion_verification_key_compress_native_vk(_vk: VerificationKey) -> Field {
Expand Down Expand Up @@ -256,7 +256,10 @@ pub fn poseidon2_hash<let N: u32>(inputs: [Field; N]) -> Field {
}

#[no_predicates]
pub fn poseidon2_hash_with_separator<N, T>(inputs: [Field; N], separator: T) -> Field where T: ToField {
pub fn poseidon2_hash_with_separator<let N: u32, T>(
inputs: [Field; N],
separator: T
) -> Field where T: ToField {
// We manually hash the inputs here, since we cannot express with the type system a constant size inputs array of N + 1
let in_len = N + 1;
let two_pow_64 = 18446744073709551616;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
use crate::traits::Empty;
use crate::merkle_tree::membership::assert_check_membership;
use crate::{traits::Empty, hash::merkle_hash};

struct MerkleTree<let N: u32> {
leaves: [Field; N],
Expand All @@ -25,12 +24,12 @@ impl<let N: u32> MerkleTree<N> {

// hash base layer
for i in 0..half_size {
nodes[i] = std::hash::pedersen_hash([leaves[2*i], leaves[2*i+1]]);
nodes[i] = merkle_hash(leaves[2*i], leaves[2*i+1]);
}

// hash the other layers
for i in 0..(total_nodes - half_size) {
nodes[half_size+i] = std::hash::pedersen_hash([nodes[2*i], nodes[2*i+1]]);
nodes[half_size+i] = merkle_hash(nodes[2*i], nodes[2*i+1]);
}

MerkleTree { leaves, nodes }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,25 +42,25 @@ pub fn calculate_empty_tree_root(depth: u32) -> Field {
if depth == 0 {
0
} else if depth == 1 {
0x27b1d0839a5b23baf12a8d195b18ac288fcf401afb2f70b8a4b529ede5fa9fed
0x0b63a53787021a4a962a452c2921b3663aff1ffd8d5510540f8e659e782956f1
} else if depth == 2 {
0x21dbfd1d029bf447152fcf89e355c334610d1632436ba170f738107266a71550
0x0e34ac2c09f45a503d2908bcb12f1cbae5fa4065759c88d501c097506a8b2290
} else if depth == 3 {
0x0bcd1f91cf7bdd471d0a30c58c4706f3fdab3807a954b8f5b5e3bfec87d001bb
0x21f9172d72fdcdafc312eee05cf5092980dda821da5b760a9fb8dbdf607c8a20
} else if depth == 4 {
0x06e62084ee7b602fe9abc15632dda3269f56fb0c6e12519a2eb2ec897091919d
0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e
} else if depth == 5 {
0x03c9e2e67178ac638746f068907e6677b4cc7a9592ef234ab6ab518f17efffa0
0x120157cfaaa49ce3da30f8b47879114977c24b266d58b0ac18b325d878aafddf
} else if depth == 6 {
0x15d28cad4c0736decea8997cb324cf0a0e0602f4d74472cd977bce2c8dd9923f
0x01c28fe1059ae0237b72334700697bdf465e03df03986fe05200cadeda66bd76
} else if depth == 7 {
0x268ed1e1c94c3a45a14db4108bc306613a1c23fab68e0466a002dfb0a3f8d2ab
0x2d78ed82f93b61ba718b17c2dfe5b52375b4d37cbbed6f1fc98b47614b0cf21b
} else if depth == 8 {
0x0cd8d5695bc2dde99dd531671f76f1482f14ddba8eeca7cb9686d4a62359c257
0x067243231eddf4222f3911defbba7705aff06ed45960b27f6f91319196ef97e1
} else if depth == 9 {
0x047fbb7eb974155702149e58ea6ad91f4c6e953e693db35e953e250d8ceac9a9
0x1849b85f3c693693e732dfc4577217acc18295193bede09ce8b97ad910310972
} else if depth == 10 {
0x00c5ae2526e665e2c7c698c11a06098b7159f720606d50e7660deb55758b0b02
0x2a775ea761d20435b31fa2c33ff07663e24542ffb9e7b293dfce3042eb104686
} else {
assert(false, "depth should be between 0 and 10");
0
Expand All @@ -73,10 +73,10 @@ fn test_merkle_root_interop_test() {
// You can grep for `TEST_F(root_rollup_tests, noir_interop_test)`
// to find the test that matches this.
let root = calculate_subtree_root([1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]);
assert(0x17e8bb70a11d0c946345950879484d2f4f9fef397ff6adbfdec3baab2d41faab == root);
assert(0x1a09d935ae110b4c861fcec8f9099ec30b4485022aeb3d3cf9d7168e38fdc231 == root);

let empty_root = calculate_subtree_root([0; 16]);
assert(0x06e62084ee7b602fe9abc15632dda3269f56fb0c6e12519a2eb2ec897091919d == empty_root);
assert(0x2373ea368857ec7af97e7b470d705848e2bf93ed7bef142a490f2119bcf82d8e == empty_root);
}

#[test]
Expand All @@ -103,4 +103,13 @@ fn test_empty_subroot() {

let expected_empty_root_128 = calculate_subtree_root([0; 128]);
assert(calculate_empty_tree_root(7) == expected_empty_root_128);

let expected_empty_root_256 = calculate_subtree_root([0; 256]);
assert(calculate_empty_tree_root(8) == expected_empty_root_256);

let expected_empty_root_512 = calculate_subtree_root([0; 512]);
assert(calculate_empty_tree_root(9) == expected_empty_root_512);

let expected_empty_root_1024 = calculate_subtree_root([0; 1024]);
assert(calculate_empty_tree_root(10) == expected_empty_root_1024);
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ impl Hash for PublicDataTreeLeafPreimage {
if self.is_empty() {
0
} else {
std::hash::pedersen_hash([self.slot, self.value, (self.next_index as Field), self.next_slot])
crate::hash::poseidon2_hash([self.slot, self.value, (self.next_index as Field), self.next_slot])
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@ global default_private_function = ContractFunction {
leaf_index: 0,
sibling_path: [
0x1eca11cd2abe68905eab86bc4f207cde29eb7c2b4c2c9b27e3d8c2f8b8234c87,
0x21dbfd1d029bf447152fcf89e355c334610d1632436ba170f738107266a71550,
0x0bcd1f91cf7bdd471d0a30c58c4706f3fdab3807a954b8f5b5e3bfec87d001bb,
0x06e62084ee7b602fe9abc15632dda3269f56fb0c6e12519a2eb2ec897091919d,
0x03c9e2e67178ac638746f068907e6677b4cc7a9592ef234ab6ab518f17efffa0,
0x233d10e0c959338e062b1c76fb81e17fcf61643da568eac372bb7feac8bfa357,
0x0e1ce4f11f4d51a7d3136abbd625315fff3876d322e46ad8401da96f8e43a614,
0x1a0ca5eecb1430479902264f04e557160a4666fb42bb8b283c6397e3d17ac937,
0x2a6595890719fef7967c209488728aa5342438ba52058a3c770202f55acf6854,
],
},
};
Expand All @@ -39,11 +39,11 @@ global default_public_function = ContractFunction {
membership_witness: MembershipWitness {
leaf_index: 2,
sibling_path: [
0x2d72ef5ebb7c974e1f5a8bed092f1cf1bf0a0cb1eda28516221ca7e5811ecf15,
0x0d18bf69ba03cceb5b3ad320c0439559ae10eabd18dea07ea239c8eb2a96c3f8,
0x0837a67313f4dbbd8d6971c0672f961f0a3b9e218c1395d327915209292acbbf,
0x2e0ef36ddc5db29acb6ef904999046f835ce7c78a40c3f7a0edb03b2f917a765,
0x1a9fdb505152f9c2baaffe4a30ee80775b58ebf8c2dde76435835b085c6f70ca,
0x27b1d0839a5b23baf12a8d195b18ac288fcf401afb2f70b8a4b529ede5fa9fed,
0x1204fec45a58f11be9981f153319860aea2ece9152efab01885006e53dd70a79,
0x0e1ce4f11f4d51a7d3136abbd625315fff3876d322e46ad8401da96f8e43a614,
0x1a0ca5eecb1430479902264f04e557160a4666fb42bb8b283c6397e3d17ac937,
0x2a6595890719fef7967c209488728aa5342438ba52058a3c770202f55acf6854,
],
},
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@ global default_contract = ContractData {
contract_address_salt: 0x000000000000000000000000000000000000000000000000000000000000ddd5,
artifact_hash: 0x0000000000000000000000000000000000000000000000000000000000003039,
public_bytecode_commitment: 0x0000000000000000000000000000000000000000000000000000000000000005,
private_functions_root: 0x04c207a8a83f20ee6c6dbeb40636e8132bc18e971927f7d81f18cb92705ee817,
address: AztecAddress { inner: 0x10f0c308adf33bceef3ed638bf8a5b403691eefc4ee7a0c20f0438c8a7096226 },
partial_address: PartialAddress { inner: 0x08e858be915646809621b06c4fcea0bfcf2817b07c1885e9a0497554638be93f },
contract_class_id: ContractClassId { inner: 0x227e7a3a22b2a95ce3b91fbb47a80669d7d68ee34db7bf998cb9457ee59f3179 },
private_functions_root: 0x25d76df45434ec75a83321daf941cfc667ff3a9027942e17105da4f50d1d13f9,
address: AztecAddress { inner: 0x0e66d7cd9692428c550b93c9ef5f49ca9f02c03e98cb3c922d8c773f78f79fed },
partial_address: PartialAddress { inner: 0x0cf203c94c91bed28440b00ecd888d88cce1f86ddf2aa8d33acbb9b6fc06d382 },
contract_class_id: ContractClassId { inner: 0x28e91aaf764bc6083e2796ff884079ad895d4b948d6ce8f37f01b29d0bc95a21 },
public_keys_hash: PublicKeysHash { inner: 0x000000000000000000000000000000000000000000000000000000000000b26e },
salted_initialization_hash: SaltedInitializationHash { inner: 0x13a939daa511233e5446905ed2cadbee14948fa75df183b53b5c14b612bffe88 },
deployer: AztecAddress { inner: 0x0000000000000000000000000000000000000000000000000000000000000000 }
Expand All @@ -34,10 +34,10 @@ global parent_contract = ContractData {
contract_address_salt: 0x0000000000000000000000000000000000000000000000000000000000001618,
artifact_hash: 0x00000000000000000000000000000000000000000000000000000000000004bc,
public_bytecode_commitment: 0x0000000000000000000000000000000000000000000000000000000000000005,
private_functions_root: 0x13911dea3b1d55fe459c95739f42df2cd7c2c610ab16a5632ab649760f3d0522,
address: AztecAddress { inner: 0x0df89b4b442718bc22a06f5ac353e83562adb5c48465dd2663e90648067ab87b },
partial_address: PartialAddress { inner: 0x2e150667b5cd21814d880d7c853a637d3818fc545209a8a90521079351e836c7 },
contract_class_id: ContractClassId { inner: 0x198333ba87796984608fe55a13c975fd3fa8ce721ee4d4b97b6886818a1d8fdb },
private_functions_root: 0x1228b39ba6702af03e595300e8484c6373f00790d0148cc3d4ff0fd1c778a83a,
address: AztecAddress { inner: 0x24415b2e716d6c7099580ab8e383fd5b16dc9fb441aa308571d8e24a2257da24 },
partial_address: PartialAddress { inner: 0x245df9f519d616473880260dd64b19a838081bb44dc17cd6ea5d870a63d2bf57 },
contract_class_id: ContractClassId { inner: 0x00236b0dc6c537d5106543053c5b85c4cbe95b0474f8238b094bae63f1cbcfee },
public_keys_hash: PublicKeysHash { inner: 0x00000000000000000000000000000000000000000000000000000000000011c1 },
salted_initialization_hash: SaltedInitializationHash { inner: 0x24bd6ac7a182e2cf25e437c72f53544ef81dfd97d9afee23abb07a638e7be749 },
deployer: AztecAddress { inner: 0x0000000000000000000000000000000000000000000000000000000000000000 }
Expand Down
Loading

0 comments on commit 2daf2ab

Please sign in to comment.