diff --git a/circuits/Nargo.toml b/circuits/Nargo.toml index 5ee295d..fb16709 100644 --- a/circuits/Nargo.toml +++ b/circuits/Nargo.toml @@ -17,4 +17,6 @@ members = [ "app/p2sh_p2wsh", "app/blocks_recursive/recursive_base", "app/blocks_recursive/recursive", + "app/proof_of_reserve/coins", + "app/proof_of_reserve/utxos_tree", ] diff --git a/circuits/app/proof_of_reserve/coins/Nargo.toml b/circuits/app/proof_of_reserve/coins/Nargo.toml new file mode 100644 index 0000000..33d3d0d --- /dev/null +++ b/circuits/app/proof_of_reserve/coins/Nargo.toml @@ -0,0 +1,9 @@ +[package] +name = "coins" +type = "bin" + +[dependencies] +sha256 = { tag = "v0.2.1", git = "https://github.com/noir-lang/sha256" } +ripemd160 = { tag = "v0.0.4", git = "https://github.com/distributed-lab/noir-ripemd160" } +utils = { path = "../../../crates/utils" } +crypto = { path = "../../../crates/crypto" } diff --git a/circuits/app/proof_of_reserve/coins/provers/Prover1.toml b/circuits/app/proof_of_reserve/coins/provers/Prover1.toml new file mode 100644 index 0000000..e93d80a --- /dev/null +++ b/circuits/app/proof_of_reserve/coins/provers/Prover1.toml @@ -0,0 +1,66 @@ +const_message_hash = [49, 95, 91, 219, 118, 208, 120, 196, 59, 138, 192, 6, 78, 74, 1, 100, 97, 43, 31, 206, 119, 200, 105, 52, 91, 252, 148, 199, 88, 148, 237, 211] +finalize_mr = false + +[[coins_database]] +script_pub_key = [118, 169, 20, 121, 176, 0, 136, 118, 38, 178, 148, 169, 20, 80, 26, 76, 210, 38, 181, 139, 35, 89, 131, 136, 172] +amount = 9958792 + +[[coins_database]] +script_pub_key = [118, 169, 20, 121, 176, 0, 136, 118, 38, 178, 148, 169, 20, 80, 26, 76, 210, 38, 181, 139, 35, 89, 131, 136, 172] +amount = 7890518 + +[[coins_database]] +script_pub_key = [118, 169, 20, 121, 176, 0, 136, 118, 38, 178, 148, 169, 20, 80, 26, 76, 210, 38, 181, 139, 35, 89, 131, 136, 172] +amount = 1713909 + +[[coins_database]] +script_pub_key = [118, 169, 20, 121, 176, 0, 136, 118, 38, 178, 148, 169, 20, 80, 26, 76, 210, 38, 181, 139, 35, 89, 131, 136, 172] +amount = 3185577 + +[[coins_database]] +script_pub_key = [118, 169, 20, 121, 176, 0, 136, 118, 38, 178, 148, 169, 20, 80, 26, 76, 210, 38, 181, 139, 35, 89, 131, 136, 172] +amount = 8493002 + +[[coins_database]] +script_pub_key = [118, 169, 20, 121, 176, 0, 136, 118, 38, 178, 148, 169, 20, 80, 26, 76, 210, 38, 181, 139, 35, 89, 131, 136, 172] +amount = 979956 + +[[coins_database]] +script_pub_key = [118, 169, 20, 121, 176, 0, 136, 118, 38, 178, 148, 169, 20, 80, 26, 76, 210, 38, 181, 139, 35, 89, 131, 136, 172] +amount = 372481 + +[[coins_database]] +script_pub_key = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +amount = 0 + +[[own_utxos]] +witness = [48, 69, 2, 33, 0, 176, 13, 195, 19, 255, 73, 45, 45, 108, 64, 66, 69, 250, 68, 134, 160, 179, 250, 237, 127, 30, 197, 101, 2, 107, 209, 142, 13, 184, 235, 138, 56, 2, 32, 120, 103, 36, 158, 33, 198, 151, 26, 30, 56, 250, 37, 73, 202, 33, 166, 26, 253, 114, 192, 163, 252, 223, 56, 48, 150, 15, 48, 27, 224, 6, 63, 0] +pub_key = [3, 27, 132, 197, 86, 123, 18, 100, 64, 153, 93, 62, 213, 170, 186, 5, 101, 215, 30, 24, 52, 96, 72, 25, 255, 156, 23, 245, 233, 213, 221, 7, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + +[[own_utxos]] +witness = [48, 69, 2, 33, 0, 176, 13, 195, 19, 255, 73, 45, 45, 108, 64, 66, 69, 250, 68, 134, 160, 179, 250, 237, 127, 30, 197, 101, 2, 107, 209, 142, 13, 184, 235, 138, 56, 2, 32, 120, 103, 36, 158, 33, 198, 151, 26, 30, 56, 250, 37, 73, 202, 33, 166, 26, 253, 114, 192, 163, 252, 223, 56, 48, 150, 15, 48, 27, 224, 6, 63, 0] +pub_key = [3, 27, 132, 197, 86, 123, 18, 100, 64, 153, 93, 62, 213, 170, 186, 5, 101, 215, 30, 24, 52, 96, 72, 25, 255, 156, 23, 245, 233, 213, 221, 7, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + +[[own_utxos]] +witness = [48, 69, 2, 33, 0, 176, 13, 195, 19, 255, 73, 45, 45, 108, 64, 66, 69, 250, 68, 134, 160, 179, 250, 237, 127, 30, 197, 101, 2, 107, 209, 142, 13, 184, 235, 138, 56, 2, 32, 120, 103, 36, 158, 33, 198, 151, 26, 30, 56, 250, 37, 73, 202, 33, 166, 26, 253, 114, 192, 163, 252, 223, 56, 48, 150, 15, 48, 27, 224, 6, 63, 0] +pub_key = [3, 27, 132, 197, 86, 123, 18, 100, 64, 153, 93, 62, 213, 170, 186, 5, 101, 215, 30, 24, 52, 96, 72, 25, 255, 156, 23, 245, 233, 213, 221, 7, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + +[[own_utxos]] +witness = [48, 69, 2, 33, 0, 176, 13, 195, 19, 255, 73, 45, 45, 108, 64, 66, 69, 250, 68, 134, 160, 179, 250, 237, 127, 30, 197, 101, 2, 107, 209, 142, 13, 184, 235, 138, 56, 2, 32, 120, 103, 36, 158, 33, 198, 151, 26, 30, 56, 250, 37, 73, 202, 33, 166, 26, 253, 114, 192, 163, 252, 223, 56, 48, 150, 15, 48, 27, 224, 6, 63, 0] +pub_key = [3, 27, 132, 197, 86, 123, 18, 100, 64, 153, 93, 62, 213, 170, 186, 5, 101, 215, 30, 24, 52, 96, 72, 25, 255, 156, 23, 245, 233, 213, 221, 7, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + +[[own_utxos]] +witness = [48, 69, 2, 33, 0, 176, 13, 195, 19, 255, 73, 45, 45, 108, 64, 66, 69, 250, 68, 134, 160, 179, 250, 237, 127, 30, 197, 101, 2, 107, 209, 142, 13, 184, 235, 138, 56, 2, 32, 120, 103, 36, 158, 33, 198, 151, 26, 30, 56, 250, 37, 73, 202, 33, 166, 26, 253, 114, 192, 163, 252, 223, 56, 48, 150, 15, 48, 27, 224, 6, 63, 0] +pub_key = [3, 27, 132, 197, 86, 123, 18, 100, 64, 153, 93, 62, 213, 170, 186, 5, 101, 215, 30, 24, 52, 96, 72, 25, 255, 156, 23, 245, 233, 213, 221, 7, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + +[[own_utxos]] +witness = [48, 69, 2, 33, 0, 176, 13, 195, 19, 255, 73, 45, 45, 108, 64, 66, 69, 250, 68, 134, 160, 179, 250, 237, 127, 30, 197, 101, 2, 107, 209, 142, 13, 184, 235, 138, 56, 2, 32, 120, 103, 36, 158, 33, 198, 151, 26, 30, 56, 250, 37, 73, 202, 33, 166, 26, 253, 114, 192, 163, 252, 223, 56, 48, 150, 15, 48, 27, 224, 6, 63, 0] +pub_key = [3, 27, 132, 197, 86, 123, 18, 100, 64, 153, 93, 62, 213, 170, 186, 5, 101, 215, 30, 24, 52, 96, 72, 25, 255, 156, 23, 245, 233, 213, 221, 7, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + +[[own_utxos]] +witness = [48, 69, 2, 33, 0, 176, 13, 195, 19, 255, 73, 45, 45, 108, 64, 66, 69, 250, 68, 134, 160, 179, 250, 237, 127, 30, 197, 101, 2, 107, 209, 142, 13, 184, 235, 138, 56, 2, 32, 120, 103, 36, 158, 33, 198, 151, 26, 30, 56, 250, 37, 73, 202, 33, 166, 26, 253, 114, 192, 163, 252, 223, 56, 48, 150, 15, 48, 27, 224, 6, 63, 0] +pub_key = [3, 27, 132, 197, 86, 123, 18, 100, 64, 153, 93, 62, 213, 170, 186, 5, 101, 215, 30, 24, 52, 96, 72, 25, 255, 156, 23, 245, 233, 213, 221, 7, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + +[[own_utxos]] +witness = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +pub_key = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] diff --git a/circuits/app/proof_of_reserve/coins/provers/Prover2.toml b/circuits/app/proof_of_reserve/coins/provers/Prover2.toml new file mode 100644 index 0000000..c8dad68 --- /dev/null +++ b/circuits/app/proof_of_reserve/coins/provers/Prover2.toml @@ -0,0 +1,34 @@ +const_message_hash = [49, 95, 91, 219, 118, 208, 120, 196, 59, 138, 192, 6, 78, 74, 1, 100, 97, 43, 31, 206, 119, 200, 105, 52, 91, 252, 148, 199, 88, 148, 237, 211] +finalize_mr = true + +[[coins_database]] +script_pub_key = [118, 169, 20, 121, 176, 0, 136, 118, 38, 178, 148, 169, 20, 80, 26, 76, 210, 38, 181, 139, 35, 89, 131, 136, 172] +amount = 622954 + +[[coins_database]] +script_pub_key = [118, 169, 20, 121, 176, 0, 136, 118, 38, 178, 148, 169, 20, 80, 26, 76, 210, 38, 181, 139, 35, 89, 131, 136, 172] +amount = 2383456 + +[[coins_database]] +script_pub_key = [118, 169, 20, 121, 176, 0, 136, 118, 38, 178, 148, 169, 20, 80, 26, 76, 210, 38, 181, 139, 35, 89, 131, 136, 172] +amount = 2875827 + +[[coins_database]] +script_pub_key = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +amount = 0 + +[[own_utxos]] +witness = [48, 69, 2, 33, 0, 176, 13, 195, 19, 255, 73, 45, 45, 108, 64, 66, 69, 250, 68, 134, 160, 179, 250, 237, 127, 30, 197, 101, 2, 107, 209, 142, 13, 184, 235, 138, 56, 2, 32, 120, 103, 36, 158, 33, 198, 151, 26, 30, 56, 250, 37, 73, 202, 33, 166, 26, 253, 114, 192, 163, 252, 223, 56, 48, 150, 15, 48, 27, 224, 6, 63, 0] +pub_key = [3, 27, 132, 197, 86, 123, 18, 100, 64, 153, 93, 62, 213, 170, 186, 5, 101, 215, 30, 24, 52, 96, 72, 25, 255, 156, 23, 245, 233, 213, 221, 7, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + +[[own_utxos]] +witness = [48, 69, 2, 33, 0, 176, 13, 195, 19, 255, 73, 45, 45, 108, 64, 66, 69, 250, 68, 134, 160, 179, 250, 237, 127, 30, 197, 101, 2, 107, 209, 142, 13, 184, 235, 138, 56, 2, 32, 120, 103, 36, 158, 33, 198, 151, 26, 30, 56, 250, 37, 73, 202, 33, 166, 26, 253, 114, 192, 163, 252, 223, 56, 48, 150, 15, 48, 27, 224, 6, 63, 0] +pub_key = [3, 27, 132, 197, 86, 123, 18, 100, 64, 153, 93, 62, 213, 170, 186, 5, 101, 215, 30, 24, 52, 96, 72, 25, 255, 156, 23, 245, 233, 213, 221, 7, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + +[[own_utxos]] +witness = [48, 69, 2, 33, 0, 176, 13, 195, 19, 255, 73, 45, 45, 108, 64, 66, 69, 250, 68, 134, 160, 179, 250, 237, 127, 30, 197, 101, 2, 107, 209, 142, 13, 184, 235, 138, 56, 2, 32, 120, 103, 36, 158, 33, 198, 151, 26, 30, 56, 250, 37, 73, 202, 33, 166, 26, 253, 114, 192, 163, 252, 223, 56, 48, 150, 15, 48, 27, 224, 6, 63, 0] +pub_key = [3, 27, 132, 197, 86, 123, 18, 100, 64, 153, 93, 62, 213, 170, 186, 5, 101, 215, 30, 24, 52, 96, 72, 25, 255, 156, 23, 245, 233, 213, 221, 7, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + +[[own_utxos]] +witness = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] +pub_key = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] diff --git a/circuits/app/proof_of_reserve/coins/src/constants.nr b/circuits/app/proof_of_reserve/coins/src/constants.nr new file mode 100644 index 0000000..78c035b --- /dev/null +++ b/circuits/app/proof_of_reserve/coins/src/constants.nr @@ -0,0 +1,5 @@ +pub global MAX_COINS_DATABASE_AMOUNT: u32 = 8; +pub global MAX_MERKLE_TREE_LEVELS: u32 = 4; + +pub global SHA256_HASH_SIZE: u32 = 32; +pub global RIPEMD160_HASH_SIZE: u32 = 20; diff --git a/circuits/app/proof_of_reserve/coins/src/main.nr b/circuits/app/proof_of_reserve/coins/src/main.nr new file mode 100644 index 0000000..1a14f95 --- /dev/null +++ b/circuits/app/proof_of_reserve/coins/src/main.nr @@ -0,0 +1,92 @@ +// First proof +// Checks if user own corresponding utxos and accumulate amount + +mod constants; + +use constants::{ + MAX_COINS_DATABASE_AMOUNT, MAX_MERKLE_TREE_LEVELS, RIPEMD160_HASH_SIZE, SHA256_HASH_SIZE, +}; +use crypto::ecdsa::{ + ecdsa_verify, get_rs_from_signature, get_xy_from_compressed_pubkey, + get_xy_from_uncompressed_pubkey, +}; +use utils::merkle_root::merkle_root; + +// p2pkh +struct CoinsDatabaseElement { + script_pub_key: [u8; 25], + amount: u64, +} + +struct Spending { + witness: [u8; 72], + pub_key: [u8; 65], +} + +fn main( + const_message_hash: pub [u8; SHA256_HASH_SIZE], + coins_database: [CoinsDatabaseElement; MAX_COINS_DATABASE_AMOUNT], + own_utxos: [Spending; MAX_COINS_DATABASE_AMOUNT], + finalize_mr: bool, +) -> pub ([u8; SHA256_HASH_SIZE], u64) { + let mut owned_amount = 0; + let mut coins_hashes = [[0; SHA256_HASH_SIZE]; MAX_COINS_DATABASE_AMOUNT]; + + for i in 0..MAX_COINS_DATABASE_AMOUNT { + if !own_utxos[i].witness.all(|e| e == 0) { + let signature = get_rs_from_signature(own_utxos[i].witness); + let mut key_hash = [0; RIPEMD160_HASH_SIZE]; + + let (x, y) = if own_utxos[i].pub_key[0] == 4 { + key_hash = ripemd160::ripemd160(sha256::digest(own_utxos[i].pub_key)); + get_xy_from_uncompressed_pubkey(own_utxos[i].pub_key) + } else { + let mut c_key = [0; 33]; + for j in 0..33 { + c_key[j] = own_utxos[i].pub_key[j] + } + + key_hash = ripemd160::ripemd160(sha256::digest(c_key)); + get_xy_from_compressed_pubkey(c_key) + }; + + let mut hash_in_spk = [0; RIPEMD160_HASH_SIZE]; + for j in 0..RIPEMD160_HASH_SIZE { + hash_in_spk[j] = coins_database[i].script_pub_key[j + 3]; + } + + assert( + key_hash == hash_in_spk, + "The specified public key does not match the key in the script_pub_key", + ); + + if ecdsa_verify(x, y, signature, const_message_hash) { + owned_amount += coins_database[i].amount; + } else { + assert(false, f"ECDSA signature check failed on utxo with index {i}"); + } + } + + let mut utx_bytes = [0; 33]; + + let amount_bytes = Field::to_le_bytes::<8>(coins_database[i].amount as Field); + for j in 0..8 { + utx_bytes[j] = amount_bytes[j]; + } + + for j in 0..25 { + utx_bytes[j + 8] = coins_database[i].script_pub_key[j]; + } + + coins_hashes[i] = if coins_database[i].amount != 0 { + sha256::digest(utx_bytes) + } else { + [0; SHA256_HASH_SIZE] + }; + } + + ( + merkle_root::(coins_hashes, finalize_mr), + owned_amount, + ) +} diff --git a/circuits/app/proof_of_reserve/utxos_tree/Nargo.toml b/circuits/app/proof_of_reserve/utxos_tree/Nargo.toml new file mode 100644 index 0000000..a4b272a --- /dev/null +++ b/circuits/app/proof_of_reserve/utxos_tree/Nargo.toml @@ -0,0 +1,7 @@ +[package] +name = "utxos_tree" +type = "bin" + +[dependencies] +utils = { path = "../../../crates/utils" } +bb_proof_verification = { git = "https://github.com/AztecProtocol/aztec-packages/", tag = "v3.0.0-nightly.20251104", directory = "barretenberg/noir/bb_proof_verification" } \ No newline at end of file diff --git a/circuits/app/proof_of_reserve/utxos_tree/provers/Prover_0_1.toml b/circuits/app/proof_of_reserve/utxos_tree/provers/Prover_0_1.toml new file mode 100644 index 0000000..6040f67 --- /dev/null +++ b/circuits/app/proof_of_reserve/utxos_tree/provers/Prover_0_1.toml @@ -0,0 +1,11 @@ +verification_key = ["0x0000000000000000000000000000000000000000000000000000000000000014", "0x0000000000000000000000000000000000000000000000000000000000000051", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x000000000000000000000000000000febd2fb7950f58aa8ae4ddfd24ce130a80", "0x00000000000000000000000000000000001a8a54657bb2850a11fb4d7898eaf6", "0x0000000000000000000000000000000967ca3b0a637c60268b1651df900c9bab", "0x000000000000000000000000000000000006828f437242dcbf7ef4d238ba39f9", "0x00000000000000000000000000000045dc3a05abc6bc79a39b2544582b97c7a2", "0x00000000000000000000000000000000001555f8c49ef8bb43a2ec20a790ed2a", "0x000000000000000000000000000000d8bb1d268a2ff9e72cf745f63aa6a0e852", "0x00000000000000000000000000000000002243a2257189b0e3609c2233619f3f", "0x000000000000000000000000000000d273bd08625b0ac7bf21f850f1d5c88a81", "0x00000000000000000000000000000000000b89b98a51808f4b5a11f1b8b1cfdc", "0x000000000000000000000000000000fcd6a6fe2964b0279f81e825f8a3e36fdc", "0x00000000000000000000000000000000002a5335eeff0e651adb8b3278458b00", "0x00000000000000000000000000000084a8a387f889549afc6b13b55e849e8941", "0x00000000000000000000000000000000001aba4700b6d0dd97ed5242919df74b", "0x00000000000000000000000000000030723960261c6a9f1ebc7deaa32f7d2875", "0x0000000000000000000000000000000000034759bcaa31eac944c3315c4e1dd9", "0x000000000000000000000000000000c973e494a5f8fc1e970870c24045634e97", "0x00000000000000000000000000000000002adde606790d1e665efee01ad70e32", "0x000000000000000000000000000000a91c17e02e199a09654ec554a2c2c3cfb6", "0x0000000000000000000000000000000000302dd18caf71d1b8c5b0c0c545412b", "0x0000000000000000000000000000004de63caf156bbb4903b9b4f82bee9a8297", "0x00000000000000000000000000000000000d42a3b548e46112b0185b2a5bc136", "0x0000000000000000000000000000008f578f6a688f807c0c7a9969443927fc1b", "0x000000000000000000000000000000000009f6b9ecf59adaccfd699c6227d044", "0x0000000000000000000000000000008eceb12be4338a40cf13c2ebe6cb47a8b5", "0x00000000000000000000000000000000001dec0a1b8c7f85242d99df7c3f907c", "0x000000000000000000000000000000d14d8fefdca48464f3831acbc2c95f413c", "0x000000000000000000000000000000000017fb837988b37ae3ba72004a5ef498", "0x000000000000000000000000000000ebeb7011932f9b4eb9fc1c1fb2e1643ad8", "0x000000000000000000000000000000000018f9498547581f16dd1d373f691467", "0x000000000000000000000000000000b9af1913f1cd576aa157b05f8798d54f10", "0x0000000000000000000000000000000000200f0b00578bb7a59d3f0afe307354", "0x00000000000000000000000000000050fedcb51b4c1a5aef7ff45e3733ecd8c8", "0x00000000000000000000000000000000001f9b949aca495549d18fc2cdef981c", "0x000000000000000000000000000000a1258140455b81cb6ad0f034cd9cdbc6be", "0x00000000000000000000000000000000000947bc45a299868f1598f1668ce5b9", "0x000000000000000000000000000000b381c559cb3f9bf082c154e4a82ecc9452", "0x00000000000000000000000000000000000c18e3b9924d0e2e91b3c4cdea4530", "0x0000000000000000000000000000006e523556ffe1f7a62a311d15ae19050c85", "0x000000000000000000000000000000000025bee54ad6e78acbb7438caee7f56b", "0x000000000000000000000000000000174d27b1b2f637481c2becf522abeecec7", "0x000000000000000000000000000000000026a6ab2d50319fdacf1bd5ee3bf453", "0x0000000000000000000000000000002d9c6b1f4d30d8047ba4d2c0795b85f75c", "0x00000000000000000000000000000000001b0466fb06808a88e6b8b689e64cae", "0x000000000000000000000000000000e602483d3ac2309ff3932ebcffa2d6a514", "0x000000000000000000000000000000000007845682e5405ea724e27f8f6c7b89", "0x000000000000000000000000000000520299fa772fe9a7c5eac75cb0064a993e", "0x000000000000000000000000000000000025c5d877cfed07e62662000d1b3b59", "0x000000000000000000000000000000a6b950d8f01e8e8d19c78f621559a73da7", "0x00000000000000000000000000000000002c1ad3021848756517dd05d54d00f5", "0x0000000000000000000000000000000ee8598cd4312356911a93055380357528", "0x0000000000000000000000000000000000106fa7dce21f442bd14036e3fc8b8a", "0x000000000000000000000000000000071151da7b9cfcfce96c35955c110ace1b", "0x000000000000000000000000000000000001debfe591a1c4f9fb916fc8f9af9f", "0x00000000000000000000000000000023330905fe860a7208bc5eae156889a547", "0x00000000000000000000000000000000001ba25b884f9925daf588d4ff278c5e", "0x000000000000000000000000000000fd069295a6d458c47d230bdb1b2a99f4f5", "0x000000000000000000000000000000000006bb8d50cbf6c0bd721747968f1455", "0x000000000000000000000000000000eff5c31ccd60033b2d66e31e45f51716dc", "0x00000000000000000000000000000000002235e4288ac7cf78bd7838bb6e7a72", "0x000000000000000000000000000000a2fcbb3c418d29f0778e4136e8f39fb654", "0x00000000000000000000000000000000002f2624533378e8131c64bcc5eefaeb", "0x0000000000000000000000000000004c20cb52057beb8b5d52dce5d24c47a80d", "0x0000000000000000000000000000000000294ec7400c870b553405ec1ce1bafc", "0x0000000000000000000000000000006397d9937026ee6a8ea8af912fbb335474", "0x00000000000000000000000000000000000f6bf16da544a5c83275e11e590728", "0x000000000000000000000000000000596253d2f71705fdaa9afc04c7262b2dae", "0x000000000000000000000000000000000011a523b025172443f6092f9ccf2273", "0x00000000000000000000000000000087df1eeefb3b667bc897790e02eeee0d67", "0x00000000000000000000000000000000000b89f153ec3b7677ad9c75bbbe79dd", "0x000000000000000000000000000000eaca8e1e2bdbe51683b162cb770d1ab638", "0x000000000000000000000000000000000022c9c25105be90ecc26a96068eba23", "0x0000000000000000000000000000009f3cd7307b1ab940565043efefd7e756bc", "0x00000000000000000000000000000000002e78974e03f831189cb905a419faef", "0x0000000000000000000000000000004c310dbe102c4d62a4aeeab5337516abfd", "0x0000000000000000000000000000000000143e16cb9d97009974aad3e8ffb33d", "0x000000000000000000000000000000084e8594ab604aaf9908c19443c15f21b8", "0x00000000000000000000000000000000002eb28b890f4a19f4163d76c6ce8cf7", "0x000000000000000000000000000000f04ff4a2a136bcedd6fcc0cb7356214a82", "0x000000000000000000000000000000000021076a05fe4aec13191d5a6df7aa91", "0x000000000000000000000000000000d8c98dab90c6425b9f69c871e89ab4e5d9", "0x0000000000000000000000000000000000153cd78f68d12326dc4fa6beb1c2d3", "0x000000000000000000000000000000115297e0fea83cb32622792bfb020038b3", "0x000000000000000000000000000000000009bddcbdf3ce935234053e3e0c6224", "0x000000000000000000000000000000f0af00a31793411ede94b4331fce95dd80", "0x0000000000000000000000000000000000053d070cbf6e89cff74e818f4ab111", "0x000000000000000000000000000000916ba1938d78323b84ac586b2bf0f8e19f", "0x000000000000000000000000000000000027477bc5b7d44cd4721073ef1677ba", "0x0000000000000000000000000000001421ead3d3098923a8d990a16deeb687a1", "0x00000000000000000000000000000000000552ea0c0ad5769eb11e756a002fca", "0x000000000000000000000000000000faee319aaad3e81d8bef826232404ae124", "0x0000000000000000000000000000000000280ad71428ffafebedc28e270befea", "0x0000000000000000000000000000008ac39b91325eb167fe35e00e6bc6e5d3dc", "0x0000000000000000000000000000000000283eb6a5c330f1ec3bf32c11efd83f", "0x0000000000000000000000000000005f3adaf60053f3f8c37147b15a4eceee61", "0x000000000000000000000000000000000016d02d958a3d06ffee84fe638205c6", "0x000000000000000000000000000000118084dfacb144dde05dba8178cd3ea34c", "0x00000000000000000000000000000000002144d21f47480458c3de31aae06e5d", "0x0000000000000000000000000000009709b1a88b651ac0a4aaa30b1dc8b421d9", "0x0000000000000000000000000000000000304d47e6420b2e795c785117d612b0", "0x00000000000000000000000000000034d2a86df540272f96a148531118c6208e", "0x0000000000000000000000000000000000239fe86822c69dcf3956b51591d163", "0x000000000000000000000000000000776bc9f096d7a8a594254c537247a6a0be", "0x000000000000000000000000000000000006c2a08c6ee026c79d8da892bab2c3", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000002", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x000000000000000000000000000000c0d3c73a15fd00cf25afc0dc60e61bba66", "0x00000000000000000000000000000000000f10d0a83d92bf42429f03258e379b", "0x000000000000000000000000000000edd077841f610c5587c9caec122a2ba2f0", "0x00000000000000000000000000000000000d55e2e557fe60be5fa35302ed3346"] +key_hash = "0x246cc4af1b7d54d473226d92b76c88997d63f60c27dc94b2552dc25d717fcb47" +finalize_mr = false + +[[node_proofs]] +proof = ["0x0000000000000000000000000000000000000000000000042ab5d6d1986846cf", "0x00000000000000000000000000000000000000000000000b75c020998797da78", "0x0000000000000000000000000000000000000000000000005a107acb64952eca", "0x000000000000000000000000000000000000000000000000000031e97a575e9d", "0x00000000000000000000000000000000000000000000000b5666547acf8bd5a4", "0x00000000000000000000000000000000000000000000000c410db10a01750aeb", "0x00000000000000000000000000000000000000000000000d722669117f9758a4", "0x000000000000000000000000000000000000000000000000000178cbf4206471", "0x000000000000000000000000000000000000000000000000e91b8a11e7842c38", "0x000000000000000000000000000000000000000000000007fd51009034b3357f", "0x000000000000000000000000000000000000000000000009889939f81e9c7402", "0x0000000000000000000000000000000000000000000000000000f94656a2ca48", "0x000000000000000000000000000000000000000000000006fb128b46c1ddb67f", "0x0000000000000000000000000000000000000000000000093fe27776f50224bd", "0x000000000000000000000000000000000000000000000004a0c80c0da527a081", "0x0000000000000000000000000000000000000000000000000001b52c2020d746", "0x000000000000000000000000000000883a58f99bacf821e0680a5db0de71700b", "0x00000000000000000000000000000000002d485006ccadaa7884e5b5add4a6d7", "0x00000000000000000000000000000031a26b2b9f1183a63a61591b69a8f2c7aa", "0x0000000000000000000000000000000000246f6e5ddcbee4222c03f575679fd0", "0x000000000000000000000000000000f1386f2f554a592d9d1d3f714e11d52829", "0x000000000000000000000000000000000006988120cf960748137b5607bbb7cd", "0x000000000000000000000000000000b778318fa88dd4473bee3fb57cd61374bf", "0x00000000000000000000000000000000002c4af94766676fb3e717fc418f2e18", "0x000000000000000000000000000000b7eac7e9402b399fb4ddb2fe71fe8ee34c", "0x00000000000000000000000000000000000b5a253bcb95de94ca11cba2cfb799", "0x000000000000000000000000000000d8fbcdd33648dc11b553b5283f5236c4cf", "0x00000000000000000000000000000000002b0ce9129dae0cc4c7d61be22b0d45", "0x00000000000000000000000000000085c21464aca8554a5ce7398ab05fa2c9f1", "0x00000000000000000000000000000000001dd9f24d0e36d4447d5e5a813a7e47", "0x000000000000000000000000000000882158c7c27ebabe5a9121cfea6511b6b2", "0x000000000000000000000000000000000025894407e08efb3e6a4703b92f8576", "0x0000000000000000000000000000009a5c5d6daa262a71e63d293d457023d8b9", "0x00000000000000000000000000000000000c961ffe5df6c135bbc924ec24dec7", "0x000000000000000000000000000000214961189140abd1fe86880e72c3411da5", "0x0000000000000000000000000000000000000c20152c8ce1e9d826aec9099f70", "0x000000000000000000000000000000ca86bcf09c1d07328297cd4ccf3fd90ca2", "0x000000000000000000000000000000000026bc3ca3804ff427889d39d1d9747f", "0x0000000000000000000000000000003b001eefd881fe5ab0a682597a3dbb2d98", "0x0000000000000000000000000000000000133accaab452a062c5d7d88f5f325c", "0x0000000000000000000000000000008274e695b2a1512339ad70e9c6a92b7537", "0x00000000000000000000000000000000002e3d9967bd1f3a2165cc1f3cd3992c", "0x00000000000000000000000000000091f70d22923e534bdb00a91e3004efa24c", "0x00000000000000000000000000000000002740fcc3289326784f2d162553019b", "0x000000000000000000000000000000dc1af141fac94d289d25e6d51e5254260a", "0x000000000000000000000000000000000008eb19f00b127dd72b1bd16b4ec3bd", "0x00000000000000000000000000000069bde1457688197a27bacc0e0573b794f0", "0x0000000000000000000000000000000000089de0108412519669be6108fe7bf7", "0x0000000000000000000000000000007a863e16efc731f97ee36108d01c48fcd1", "0x00000000000000000000000000000000002fb82504ca9018a11c92d5ae9371f3", "0x00000000000000000000000000000043095c6781369d451e6d1e5fd54b9403f6", "0x000000000000000000000000000000000029a6f747812e49932359bb72904edb", "0x0c5b6f0bbcb037bc58b14a61ff1c214df45ffa0ee5619eafa20eb0f770c55e1b", "0x24e943a08ac4306b0b32e407a0a0e411ee36ec9d07b78b5f562bac27e05ee12d", "0x133969ab006e103a2e73e1bb48ac1940386b85499a87b86b70e3b70ff81d319d", "0x2722ff7f2f39abb2871df661a273725cb44d9f6112be1bca475252eb043b0c72", "0x04ee2fcba7a0f380a4834e9412c3cfa1b049ccc6f02492933477d7144516a31a", "0x21a9e5a4e9e41e931bd6efd813aaec8af1213997562a4dc9250d9c0d43f33d4d", "0x2d3727c7f01c1242beaeb4e900b240060873f05c864cb050de0798f5ae7bb902", "0x19eed895f0502f5259e6a12dee0edea8f8c13eb7a57d28fb6b0e1e59d2b89430", "0x12545e1c1e2fa44cd29bccca70c429775cacaeadc4f191191afec6a80943a710", "0x117e68fbd17af7b4cfb528f6abc7b5856249f0c3aef7d26b3f07b907918088e9", "0x2499778b6b70ac516545433ea2900abf13c39b7cf6add4b24c29422a3d1183d6", "0x1958289f4047fabb506cc5efa58ededae053d59deb6a8729b485717297744346", "0x0862af64d9c889c8313684602badc3a4658db655c693d6fa90ac42e735ccaf02", "0x0906ccdc962fb9d89dcbf155566b374b98f45ac7e57135188d9a9e9753ba20a8", "0x007563589f50bc7acee6e6ef60518a698710b33790ce99c10e8802935cf05ebc", "0x22d8a5c21f2336fdfc08f4ec47a0acec1c20466a540962ac045b0b63d111ba75", "0x0ffb807980d145b1dc6541bd9594afe3d7e23a55e03edccfbd94464c0a835c64", "0x1a4aa77cd1464151e1fd84929e00dd0d9d44b297c9a6f719920de6b32078fe01", "0x08b890929a9fe69d37196bd92451fa339af2f8d1e6c250babb1355c5192e18b4", "0x0ff01687c17c5eeaf4d40ccf4df33f33b334ff178e3a7a0c266c4072d7b7a285", "0x1654034cb6e235fe0df5cde1518c91bd664aa29e7109ca69fbbc95c03a9dd4f9", "0x0a2446fef733314a43c86e4bd45dc7f2655c5651735d75eccf7d40bd2cccc258", "0x19271b81389410bbc24174440a76a274dd5866d81db563b4a22b835f18291342", "0x2fc62957cc3950ce891479c6b5daf8839c9dc7d92ac7ca4a1199b2968b9753ca", "0x17151c1fbc0930906b8dc504613938fa459a6aca4a4162b2b0a6037f958db4ec", "0x2b4f5bdcbb31f8eae8bbe2830afd517d22e20506ea1eac43feeb06816942d26c", "0x3031615743f0f6cb33b21491bb7d4442e5590394acb9cd993ee299da581ff831", "0x0747fe5eb1ffc6963ea1427d9936079f66e392b1f669c7606536df4bf310b152", "0x2ca33b2ce11daab8aea56b1ec849c8ebfb0e297c9f9ab0e8ebaf106ff7f0938f", "0x11f764e58e22622d8ee9d3e295032b8e71b5570167f7abc34d0bfa2b3abe8bfa", "0x2ce06340504e545e4ddf00c879c6de58217e00c5df7c69c903af9f3feeb863c7", "0x0a389a96b1c06555f3955f7ba1783ec74c13d235ee5070ca609af1b8ed854cec", "0x29572fda9e3f24aa7f945a14e3c266b8758f26a97df4fc5e1db41abbacb77a25", "0x0fde72fbe8f44665d793cfbbd54ea6ac7981352f97f5cf9edc7d41a505f3e091", "0x072534f3a47e639a181afbf3109de45e20954bcab71e509d01ac14c09f24bc75", "0x25a86a9d446ef1b98c2afc0d58dd19cae7edf8ea5a6a857f25ffcff2898e6d16", "0x2e1c7b38cb62fb753212892f79ad41393657cb6984f44b0c62e5a7c63f6f6cca", "0x1b422628005addbf82d449b89188560c97fefbbd0bf79b9f54f04cb41cbf6b13", "0x2e7ba4bd98879e148ffe7e8f0f06c9a5eeff52209d1d609468e152a7a5806e9e", "0x0c2af6fecf58e7a4506cb62261ffe6992500db409fc15c8b399c4a9644571d95", "0x0525d7dfe44a694334261e451c8c378f76d038c49f2fc3d4318ff47a1f88cc9b", "0x2dba213f781061e03c718202921a2279b3175d265169b4fc7fdfe5f50ec04a05", "0x122b151ce0bec45a00fb30ff3b3cbf670dc945f25baf89e2431c3ae3a8e1ea68", "0x1b9716356f076d2fc852617f915c98b01e3e8bf11a1fd9b58a91b2c960550a48", "0x0d756361470402941d13d0d1484860904208c7efa8db573f7ee04d3a451b2819", "0x161798a33d52bb961ae5659a665034def52aa812e0501544ff755150c8f31c26", "0x2a93e1cc4a5cc071a2ed690924e802b32edc9263f06c284f4dc0f5a8752e771c", "0x08b5115c0ee9e951cad96001abd80c31563a4aaaa8a16fb63095ca111d992143", "0x2d24bff1bc1873b136d26f73f31209c13af5cd019169a4f6a357a5043fd4d51e", "0x017b7982e7d7bf9dc001a302cc33ea44c4db0684be415780e686863237b49edc", "0x0b30f68cf5ea9fa9b173f25e7e050265aafc204cb2e03a813552f917067bb5d0", "0x2f0df260ccd2dee06308b2591217d2f1305eaf4184a1c74574166eca78cb6c94", "0x221df5378c0d7907d616a7f8eba9b11a408ef6e52cc166afd10ada6d6c676dd8", "0x142d86f9d562451b5e49f631f5fb9eb0ff731166b6886554d4dc92f7e3457b32", "0x281068c688ad3828386a0f6247e94217a84e861cf974fec622cb11dcdd1b77cc", "0x0343b7345ce58bf1f73bbd11ac01a1931b5d38ecdacca8028a13080857977458", "0x15700246f8899bb85034bbce51cb4e4ac6842e66d32ed5e8de545149f59caf9c", "0x2ff8e8d1decfc1c7107ad0b6951018d1cc9f8d98240c4c5bb352e910c2430b76", "0x3000e7d56ef7940177261339cc0302b30a52565f8b578be2ea01ae223a4d4432", "0x23a1c1f6cf69e2192ea2edbb458009a290d70a6b8cc72dca976e5163d129ad01", "0x0a3d29bcb16bc633ac9095f817a28307f5482be07fd59efe3d9ec89120e94255", "0x0f53d21a7d57b8aa8034f46f96a8b175a10cb408f77b60624112f00d3fb2836c", "0x2344d02ba707bc6ab6595f5a7f0707ea6c6e47709a71d5d3f7970d34a6d5803b", "0x245f2b123ef570563407465ced600f54a78f3d5c91f5711ce4b3fd7ad2bf1259", "0x03301f894431ffd73f5ab95b76e8fe16e63b6654fdb0f081f41dba816de88998", "0x2f53a6009f2f6cc2d3320f573c16c5b7c017d2c897a572beaa6d3c816d58484e", "0x09e1b15e7e027be868f35de1019fd0ea438be120af8e526085c480ebf37aff9a", "0x0d1141f26e03d390409515996f256fc657e50759b8bd6f1fb598eb102865a48e", "0x06028e1a3de586dd2d0f26ff7f3759e52cec865951abcc1f9e4850de700d5ccd", "0x112fac1a57457b1553d48970003ce99c0878cb17845cd53455e9ab5f0dcd2a7f", "0x0a18d1fa80a44ad82b47d18a9b104f49f8250925158bf5c0588ec6220564f406", "0x2d0e21cbceb83cbcf74d2c2210734b3e6fbf405f8671108d71ee8ffb795ba987", "0x16dca4f4d69a5be161194081c6dd08954af4354bd01876773c1db202893ca97b", "0x2dff02f4ed1d337eb2db0101ecb232776391188740782d4828805dd278d79d8f", "0x09f5d2351f0fa281d021d2f6142a74fae6121f23320c54c93d5820e71f8b7d78", "0x1247051b6a01a3decdc9f99c2322224afecc6c21facad4a2eb4563a352aecea9", "0x0579f60b2bd6c9adf5bcdd1a0ac0283bc91813f2282b003a980b851fdb3c1ddf", "0x0de1ef65e02f3e5de629c8dd7b8507d58a0c4b1c0cc19c369d0cb0bd2b17859d", "0x1fee2c7eb845b908f606c076765d65cad3ec2b6d353497bf3df73ea9b16cb9c8", "0x1bea3f769810a93deb7d3c4a138228b8c54d8ee6e1e204b578eb9eb885bdfc46", "0x0c0181b13ad75e90eb002cd6b7092a7a49d4523112edfcda8550744eb050c789", "0x0f618526729e8b3a2ed9f0437c21dec53167a7ee1ef57ca78ed598ab08df5a6c", "0x2e93564f246b6383cf11712f66a95275a72d41490e8fc153ee4cdc1d008f9418", "0x073bf1b0acf33df8236444ae1194476f9ba2c9d1b132d1ab2d76b69d04c74e71", "0x045309d51d2beae28014e8b82cbfa116ff2fd7f0a87f8aeea0d903581349c0df", "0x1e1858976976b2a6c19dad0366faa511fdeb81cf28c50a11509bc27368b97764", "0x0258889d62716e080a388665802a7280f5cfb9abf4aa08f72fe46296b37ab295", "0x068675e5d1e75f9701a9f96eedc18255776da8e3cd1df1fa5ad8dd2b3acefa22", "0x17af17f99662281ef4b485bc1d1b60af47b30bde6bd6def582e2bb06b46322c7", "0x17645c8cfe3311b0a597ecda4453d9a8a19f4f96daef2e97c5cc9a0aecdd87ea", "0x036131a71ab97d2c79b29f4fb65f2c49289c13377f58ad6ed822ea778a83eb75", "0x2227ae41dceb08234fd7e5f35c03525c7fbe8560ac3c2583baa822bef747dcfe", "0x20c850d466d6870b010f851da611b2635168b667b96f1afafae16b31762ade6b", "0x2d55de777dfb2cc5ea0a8c992b77943d4c3828e0a1e533b62ecc4f06aa846245", "0x29270f67557be2402af3848dd4350abdbc027f53472b1d30b63d1c426244c71a", "0x187a056e19b529cd158175e8b9c5205a1b4afd9da99951d46e3039c17c55d1ee", "0x062dc295d5e6bbe96782df0c7d75c4ba6b20c709dbab9a182b3d3abc053d118f", "0x29f4d6e8f79db66b00abb94c3cbd7f1124a64f0bdfddfa84cf18afc2bcff89f9", "0x0e555347c1067ee4b89699ea0d7296d0d85720ed18fac5cf782708cf1ce15313", "0x12a725025aafe59099fb36031d045bccda95e5d685dc750821c91ca11ac04852", "0x021041d2fe4ab68935d38170ccbae12f58aee3133c5c50880c1b2b64797fb56d", "0x04b9c19cf1e129631e513d21e6476b67a8124e5e0e5d24827ad17d39ca30e7fe", "0x1db8f791e032a05c5d91d314f1c36d1ee23685b3a996ef77df72e5517f650e04", "0x0fb7c9ca3e4b0bd50f2c58575d61a8e98d66247d02b31f53924d40ca0e3dfedd", "0x217ac2a02414cd79ddf8479630e92eb91d434b25bd69d2e91317b8b5ced9d948", "0x11ba3b3b9c5db44ceb4dec6485ac8ad07077f0a48340112c2abac5a218c70e38", "0x1d9316fc02f04ea454b8976ee2d6c1840c33f5685c3da1ec70469996a73b2a38", "0x274b8524b2f49d458fe9bc866426711eecbf046dccd6537dc964bca00474c0bd", "0x2c9370d5ce1e339962e751cbd188ad5523c3e8eb904924a0bd4186c60acb49e0", "0x11ad144bfb14a12abdf7545be2cd0ad96b7462a8191c2341e1d8fa3801639b72", "0x2d86e889c7dea6e1a4cf6969fda53ed9289a0900649921f18527b4aba7ec8924", "0x1e81c3ad72faf80f863996e9ca99cc184f008827aa63343fc0556b405a6f3baf", "0x11d0c3364e4d2e2548305bf04a3b0a7ce547543dd5e69d7b39b3d12845bc03df", "0x02343230af396af5c5f39a88b620f55d5021924153d5854813a3bf075c3c0a57", "0x09b73d904baef38758042b9dc5653f77b10247f57fcf2a732ffad03a96736719", "0x0ee0c4dcda392f359b65e973eb55e015c03cd1cff76d9a538f2ae3d059b71988", "0x0526ea30fa892df7dfad875ef2c8d715c93332d57277cfe4d1c2b1a55db29cf6", "0x0b6b5a833fcdde0b1d02384de21aada4f4349cd417ee3a26dd28bdf2b7da3ebf", "0x1830f3e5dea0da7648b5e07a02f92374c4ba433edfae8ab64e9058e453808e30", "0x1f10ec196ddf1f846d61889811b031f8c9d6f7d92fa02cf5011ddcef8a4bf5eb", "0x014fe9d5cdd762748fef550d10450313695eecc38c7ca244a00ab637cb323e37", "0x0a216a4523a3df760144a7347c0595f4871437adf62a290660d6b36320c3c31e", "0x1487eff921766493700ff0752f00b1aa56f6a12104b2fbf0f46e922c5333b9d4", "0x1734246840151728fe4cb4603dbfef0d124777eae75d1b4fdaf788f3bd628b15", "0x2573a0fb0c6a14ed7bf972af0dac747e8834ed100e724c7cc45b02ea52b51bee", "0x2a2fbbc0e0cbd8b380b40bf1b7119f45d8b8e4823565f84a97b76ea817e6a4cd", "0x00b300b54058b8f70ed1afff7be6f4cfa7d5dc88f9a17ab31475d7cb872a17c5", "0x24e09a8d53d5eb6d50e4a9a670745d348cbe57c245b131af94b6458042b4c362", "0x00e4925912094dd744c410e725a097236af623e36dcb5f587159891ea42b6eda", "0x09aa6eb7ae8070da07ac49a98909ef86a281ed2f4a82668f46999f8bcb800e64", "0x12508020619ee49736a457b64266bb7d68d230f65e8f14178d2ab727ff02325b", "0x18193beb0bdc18b6149681f46644ba725faca6111d53cdbcbac1ce0cf8fc9158", "0x1f55bff63891124b7442f8898a35fb2e0cb50595bc33e0bc070e6b3f297492a3", "0x12f3d33da769dda52f31afc1c2ec03d947947bcf4dacdd98dbb4b143ef24089b", "0x13917b43d9bf2fad3c489298caea3ec87bac557d48d7a1b9861a8fbf61fdb7c9", "0x14c5bb782c441aad1d089563db4ca949702bdceae5336f07c6aae4c33b39176b", "0x120c064c91ef8db08c3281e6bf11b1cae8be4d07c968c2446d5ac42c67345fee", "0x1430658230eb452e489c059885df7432f4963b0221920dbeaaf2bc6a0d89792c", "0x0032acc355e97556ca1c242969071761abc9ccd6473937f681ffb4a69e1f3348", "0x03e4cb661ed7f69885140951925d53e243cd68993aafeecab41426f37e99c4c2", "0x2870fffe4f3361e4c7aa132250ff53c3c72444d1007c08fef8cee7510d86ca74", "0x1e69d365ae55e858e93b5de5dc2d2c84accb64a688be14aaee9c14c1b895f046", "0x11f072c91ef8e9a4354d77d48510cd94d64b15d78bb29f31a3164a85ababd1d9", "0x2345dd6e89257943804bbecb00a52994b2d54e84ba40d34b28281018d7def98b", "0x2ee01e475bd02af776e6fa71646eab7d0209382a6eb04a7badf76e9c3964563e", "0x0d4aa58534bbb7c45c94a06c2380b7fbd06bfe27a0a99925f6baf7be5e919999", "0x117daeb93465a718b2749bfb782ffb4827eb5a7cce2ff77d15334f2620d8254b", "0x1896fa9d0b2ad80e437ec0fd8d51e15f6537b5c55da1856f7bfd5176fd732048", "0x0a2fc794a3783f1364f738c2ab8f8756b7430a644ebabee383af3b5f9e7d25dd", "0x02d0169db0bab2b271ed80c1eaeaaf5c77be7216e58744f887c1f30d038e060a", "0x012907df62cf183f652850d2a819bfa331d76583b8080f4dd7952adb30034f49", "0x1b12a34e61fac74951f855743145f4b17f205c552b98196ade51aea9e3d6f704", "0x140b8a5759ab766445a5835374757f5e47dd697081e63b3c54e06e37e10e3869", "0x02a6ca7e29d14d77353c1e8525172afb46bf8f36c2f9c49296fb46b14de58911", "0x1739bafd58bcbbeaaa1e5201af5c1005135e8fb80fd18c924ce2ddc21944886b", "0x228448526d21ee2735377ded40631a65d2d8db5fe381eded189cb17a6d72ea59", "0x02d54abd1370484703ca70f22a740e6c1eec5dc8f1b46f941b8add11c7462fd6", "0x1c5a8a50408de15290276dd646a37a098b09563fedc4c309c5f5da62b2b52766", "0x0e7e223d0f3922d95da032122c40a2d53908f09b1b383f1731b4c1d2838fd7b6", "0x0e68e0a4f3454131fc1bcd7afd6b5760ea3bfab5de683ad1e986d5a427fe3543", "0x2d4e1bc8015a0b01cba4003e43ce82c04784faba8797cc559c68619789181a59", "0x10c94e6374352387a9a4c0fda2d1a91be00e3cc6b71a1f840108a65e1c3913c1", "0x0b2a5ffb6615869dfb1610aaa778c1e08b21ede40fba01dad4115db183907c35", "0x0c789f2e570e706badd03a9da34483824a7e5f0701efbfe64b354b7b0d69ded5", "0x2ead9f80bb7619128fed2a10de17eeecffd63c6f5bfe72f7fd3bef93ffcb79cd", "0x1be166584d3e08b65ef4858b724fdc6ab9899e982281d961a0c05f01cd1c72a4", "0x14521ad7fa3bb0cf7e33e809dee8a566cad2135fca75cc27811c4ffb2cf910e0", "0x2e9ed47538a4a5e59fc082d2ce76b46c7aebcba1a0e8174c1b057a40beed0951", "0x2cc9440506d64fdffd69b79978a1ca4278ff432ad35715e27000e98a2607509a", "0x175384058547dc5518c3d8fc65d5822295d5875458d2a3c7cb33799d0dd8cd28", "0x129d2e923e1eacf91a98fff8191dff1750337a8c71045616da2d83623d36d29a", "0x1a2c2bd823e98475ffab085738f1bdf899d807d8a99c590f610528827eeb9ad8", "0x13411ba64f7cfa6c317821df77f184fdd5c1de7c6a5ab6d80b9c09f78116c1b6", "0x1c0735fc7d85384b826822be6de0f153609b2dda646c689f2c6b5b8a08ede7ef", "0x12405fc1100eb5d12a6a41892b958c5cf2e414f77529454ded0a42c00ec0ec7d", "0x1ca5ce2590396e5f155a28a45300f1178d7b5ec47fc354e5e5420ac283dba78b", "0x00e47e0c030628ea6991f06bd74d3f4fe1a6b63f9000823006f972c7a13d6c1f", "0x158dbb09213e129bb7186e72d403475baaf0f45bae7060ae9b59b5c2319e34d8", "0x0213bf78675bdac63b08ea04a11911e519ef48aff604c4ff7cbb874ffd892465", "0x02d3c2a56753ecaa54bc0dbc6804d839cef5ea47db973a1f8e7786a608409f45", "0x0353d6c790972d9e6cdd33143a8969a723671bdca948b7c14fcf1ee608475eac", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x00f33b3ac873cf4d4ef27b6b3bf7cb0843335d9e11e7bd43a56b04179368c555", "0x0321a7c6c36b2f7bdc30c123752bed08f09da84db236e9f0ed888407fb945f47", "0x069f63bf4c2e4d0b529021a716072d52034633847298bc4652f46975b4b50779", "0x279dd1bb5f08c22d278f4bba0c4cc0a577fe70fda4a44b23ee19c2df4c2f1fed", "0x14bc00b18f449d224c0dd02c14c1d416d7b16eac85ef6167da1bf2fe397ee306", "0x0b779000a78247a2d7fa06adba13f35f0036498397e8acbce70bdc0f2088591e", "0x302656c456300ddfbabf4c04c468a26839e86e760eabab155036ba2a54f5ec79", "0x1f28eb0d755d181f5e792a7801e9db0284d68c0bd59c31da224db4b04263ccb0", "0x1f65b4c4bce7d63829832fba4805e43398f4ec0c9ed611f443433f61e0bbcfd5", "0x224e9b9757296cb721b537c11713d4fe9066c882da2824877502155e427277a2", "0x0aa7d0afcedac95bb0a9de0237123f1d926363508b46817ccd513fafa5febc01", "0x19ec8d797c1c2fec5876bd87c224f9be9336eb576844b54d98bed314562c06e3", "0x04ef3d6abad59b63b097024b69fef866dd1af61d9df525ac597e35f01a025ef1", "0x2159701ff4de304375056c692c1794621f9b6a1ecca47417ac0eaf089acafc81", "0x113eff969467ebfb834c1b9e1ed9e8f306c5c877c673649c5cff6d1af28a194e", "0x15fbe69410395723f5876b45c6c8c5ce8bd22e085e239a542aa0d467e91b712d", "0x02ceeeb0abf30eb2fd51668ed97cd9ca45b1b38a4dbc0de7864e5c342c0fc02b", "0x0339fa9d420da08d8e8d71773bd8782df91eca6a17ca16cf8d8550147c36fd4e", "0x0d2a62130a9ccd09fd2484f708a68aced5bf88adbd8792991be0a12973e6a80e", "0x032d4f99ad0ffa853bdcf0feaf5a35ddc0ad81c172e643ef2d05628f1e094053", "0x036b109b1c02e616ae4761653827ce96cd08d1d644a387fc30643fe5f027fbd5", "0x10fb9790d6a70251cbce057415fef5bcc1b9315700a7b253ce41ccac3ddbf33f", "0x15fc1d49cbd9a8974eb6a32153ee0551ced324811fe21b966dc3f91c656ca93d", "0x0c75a9f820a824ff4ca5eccbdaaebb933b42a64d8ac3e1690fe0ae302a851bd4", "0x17f0f324a3eba2a044d9944ad9e7c83638930d2d23e620d8314e50ac0f09155f", "0x1ef8a74ede032c12c80d530a153e610a4a3f8cdb195d26ddd7e2fa08767a88c6", "0x1ebbd1a614e70a0bd4469e67c4de42e5bd8db811485097d4b3ac0cfec4791762", "0x12199efc9b44b029fba9200f3d7b287746445640ec4a2a393e018c6e0caa2b9e", "0x156a23eec7db968f6b55fd07e25590c11f6e533c224f7866b3385d1dfd86dea7", "0x155dd2ba3e1313d08dea30719253e297ec466cd6aac363eed5f9acd44fd1791f", "0x161d915c2611a01e8ce7c626f6bbbf5232caf6358e7312994756f86d814fcd30", "0x1c758ea94f32607e94a1958d01665b6c715e705db31132dd402886d0e24997ce", "0x10c5f1a12b3b1c2e75bf487b751036354b6131c50123f98e93fd5c3cb4c57915", "0x10d67b4a7a8c64570b57caffe0894330ee16fdcdfbaca4900f8921f1eb858f18", "0x29fd1331fa0a28ea2113ce0a95a40327a9b5cac511e64074460b262409f72480", "0x17b40950124da15e3ba1e3884fb6eb3b02e7a5d4afa4b68a07118f82bd8f085a", "0x008db5514726d8563be37fbca7caedf38201886f626f3d18b66d2a8e63bb585e", "0x2e867747f9146321e9b4793d0b6cf696a0ee5e6034f4dc415d544cfa25851a94", "0x22ac2d3cab0b80ea628030e88f8272bdf4daa388bb74e9c5bd9598b5027cf17c", "0x07b3ec9fe827bb0e981e09cdcede0977a094cd86e02d002324aee480fc6ef5a8", "0x1ba68c615c0397f584213edd65a6bb46d97619d5fd66e98e7b8bba4c12d2ed69", "0x0d028a72178430a1613434c685c3455cc7f0f9c1748d69ac8236cd9de61fdf9c", "0x000000000000000000000000000000e24b83e861424dc3e33457797f96396821", "0x00000000000000000000000000000000002df36086f8767e58f07f3097a1f067", "0x00000000000000000000000000000034c98f4ee86f127b7695f8786ca06dcc77", "0x00000000000000000000000000000000001cd7984a8cece6ff0ef406686c62e4", "0x000000000000000000000000000000dcf9fff6bbd435426e06c8d96705adcbd1", "0x00000000000000000000000000000000001085de9ffaadc14e663a6fed00b16e", "0x0000000000000000000000000000002f75a6c8c2390d688f7a2d36e8220a6c84", "0x00000000000000000000000000000000000aff19d5949f82960616a3a0d0ffbf", "0x000000000000000000000000000000877ed0a68b8e428f026220d321cb346477", "0x000000000000000000000000000000000008daef715d04f6265e766c0960eafb", "0x0000000000000000000000000000004d16fbf088e2c2dec7eab2973edaa4de7b", "0x00000000000000000000000000000000002720ae53b47397fda36bcb75bc5c03", "0x2e70a5820c61cee09e56e145211e82f4974c52c1f97441a59857fe3a55dafbdb", "0x0000000000000000000000000000009cb57cc0e9209732ad9e322d05dd2b6bfd", "0x00000000000000000000000000000000002f7e4cdd5e12eafd29a088b9c360ba", "0x0000000000000000000000000000000e36a6c644c1ef874c66abb4cb7d51eddc", "0x000000000000000000000000000000000023cc79b722b7883a3c59d76ecb05a5", "0x0000000000000000000000000000009c28519cae858a63efde4c8695ba68858c", "0x00000000000000000000000000000000000d45bab9627d74302a9c0cbaa5f01c", "0x00000000000000000000000000000020a22b6add6a5da4baaefef3c190a1df30", "0x0000000000000000000000000000000000072a3709ed785f0fbaf68c24725f98", "0x00000000000000000000000000000099bb2aa35ffe6d8f5167a57bdfd396122a", "0x00000000000000000000000000000000001ce4c36cd248de5a0d265826c8a5b0", "0x0000000000000000000000000000004f0ca4fe1ee6ae3505f60d3481f5a62deb", "0x000000000000000000000000000000000002b382b7670ba2f8ffd855d427d0d8", "0x0000000000000000000000000000008cca11816aeee4f226894c33d6f03260d8", "0x00000000000000000000000000000000000ac7339995109e9ae3e51ab7d89e0b", "0x000000000000000000000000000000c76d1c6089f862a05ab094bfc37b1f0a1e", "0x00000000000000000000000000000000002760faae46b5ab7af01cbc10d9feb1", "0x00000000000000000000000000000097b14c9ad1bd2997c64dfeea87e3f561cd", "0x000000000000000000000000000000000020b496cd85f3c1de821f0c1bc365a5", "0x000000000000000000000000000000f2197ead48797636729d14fab70ec9135f", "0x000000000000000000000000000000000003e2c2624966c9758846dea130e43b", "0x0000000000000000000000000000005f84cd4bf73d007b221f870e36dcba9e1b", "0x00000000000000000000000000000000000c93fb77487272cb219b834fe94c56", "0x000000000000000000000000000000f25210101dc62d8851cbf04f587ead9d7a", "0x00000000000000000000000000000000002c2f1be236b90f6097d9683762de5a", "0x000000000000000000000000000000ccb9abb42eb86c223446c16104743735eb", "0x00000000000000000000000000000000002ca0a55c18923751318daf3a7db7d9", "0x00000000000000000000000000000024053d0d086be58fb5305b042d67bd0d07", "0x00000000000000000000000000000000001c5dcc214391d6f0236424f758301f", "0x000000000000000000000000000000da1a00ef6776c1ac87b10353545c7dfea1", "0x000000000000000000000000000000000013e7b56af721380c5558d1c0780495", "0x00000000000000000000000000000066e72385fbaaf156c3d593550fccc40a41", "0x000000000000000000000000000000000018a5bc98e3adc86919ec054688b856", "0x0000000000000000000000000000003df5b9ee8af1e8a3e8a1cd9dba90418301", "0x00000000000000000000000000000000002af8a5cfaec6c203482030f9304979", "0x00000000000000000000000000000099ff1c92d4aee6ba01cbf7577e72c47195", "0x000000000000000000000000000000000023f3e88175e94bfea0b3a74d2998f9", "0x000000000000000000000000000000410f513257341f5b0532772b348fdb2d78", "0x00000000000000000000000000000000001d5187d5aac0f71ec2c1d24545c23a", "0x000000000000000000000000000000b136a9b5acfdb1dba19fc4e54107d461d1", "0x000000000000000000000000000000000013ac039029a14740f7bfa950b0f9fd", "0x0000000000000000000000000000007433a9101bf81f77da679fb57c888dae15", "0x0000000000000000000000000000000000049b32d02fc0508a728aba41738726", "0x000000000000000000000000000000cee42e5f838de37ad5ae35a7d82727681b", "0x00000000000000000000000000000000000d3788e825e43c6456fcefaad8816e", "0x000000000000000000000000000000e2c056a21033a3695ec5b65401d9562938", "0x00000000000000000000000000000000002847499c1db8f9dd6a9bfae05ae35b", "0x0000000000000000000000000000009cd536f39c1ad910baffc35bc35da4d270", "0x0000000000000000000000000000000000148e94e305fe670bcba69bea92ef22", "0x000000000000000000000000000000309c7ff1bcff690007428f1fcce6a64640", "0x00000000000000000000000000000000001dc472649a82458363ba8fae1d3e21", "0x000000000000000000000000000000306d2443f89d2ff246b081080dda10effe", "0x000000000000000000000000000000000009c996ae23a012f1694b2688f8e518", "0x00000000000000000000000000000025f02d0b84ec5d92e327764c6c7356b63f", "0x00000000000000000000000000000000001884f451ebb83b4a3cc48a2e4a98f9", "0x00000000000000000000000000000007b1ffd60ce22f5348c13a56ad15227cf5", "0x000000000000000000000000000000000014b8a9d3eebfa8c9f6922fea390031", "0x000000000000000000000000000000d869b359dafeab208877071fb8e9721e98", "0x0000000000000000000000000000000000161babc99311eb2af009a91b708d06", "0x000000000000000000000000000000ecd35b2677223fa65d84aab0760b6f6d89", "0x000000000000000000000000000000000025347041b6315315b20443b40e9730", "0x000000000000000000000000000000f3821dc4d91c8065851a82ad19ab6e36b2", "0x00000000000000000000000000000000000fa2f9a40d4546ecfb45cf5f513d08", "0x000000000000000000000000000000c60641c32511835688d881f245c2aae8cb", "0x0000000000000000000000000000000000285c36567ee551239dd98633c6df02", "0x0000000000000000000000000000002679b8f8acf3f639da554c6b0b3e1c9c5c", "0x00000000000000000000000000000000000f967d3f96d2a3be4d0a38e7066e81", "0x00000000000000000000000000000002edc258fa3ba1e7e17dacadffc22bc3dd", "0x00000000000000000000000000000000000e31acdf8083ccf422e5bb9f4ec0ec", "0x0000000000000000000000000000001cf8b2239d34ce128397e49e764435eabd", "0x00000000000000000000000000000000000f9966fa54751284074b9b33158fcb", "0x000000000000000000000000000000038be22af6a0d33ea3d4fa60d0b6f229bb", "0x000000000000000000000000000000000029960e065f1415ea8018eb9aa4fb27", "0x00000000000000000000000000000061621e146fd50cab978799ed532939c8e7", "0x00000000000000000000000000000000001e66e223a96f66fed76ef611251175", "0x000000000000000000000000000000c61d042307658bb167c9bb9833abee9045", "0x0000000000000000000000000000000000174668eec1df70ed2d396705328651", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x26b9ff1c407f4484e6c99a9e368f27360179eb840a8e938fa1e325c0def0c3b9", "0x14329b2ceda37ab95cbcc7d13325f5980cc5c7334a9690620b16f71449bda782", "0x14d948ca6e93168d1cb9ca5b0a52fedd0291e419a7db25eb97a33339639c5357", "0x10f40e97068e5fb36b9da3bac2e22c821465ce647e20d34ca3c00a0e9079cd18", "0x22cee370e984f070eff1d87c0523da6c997a929a6302f4936e6797bdd94ffafe", "0x0ffcb429effed56feb8c0d6e29ed0040767ed6099574f6a50bcb81e666c0b47f", "0x0016e12520178ec4180fa30249fca4995aa26d3689aa3cdb59c3e6a04b957e3d", "0x0f893955bbdd45bded4547d079587a2783a44c132f49ec7100039485d09ab7de", "0x06e14b1cb21053123b46240236618753754303a84a3d589ddb36a87321761d54", "0x0b343e11116cca3ab6531c752da5686b3d29e9f0f94a1670b611b6c81c7500ee", "0x21cdea0217fd17d1c8b89562fc3b98bc14e7ca0e6ac6d3174834785cf7be6e7a", "0x23ca534bc55d1990fff6b4733eb97f6ab4decc45c309146788ec758d73898c36", "0x1afbe2d799bebec970c559704bacaa4946ae7b01904effe486c1d90e40ded141", "0x2560252e656d4a0f83f75dc45df42b609ad5da15b5a2c83c3ece89908f28b4e6", "0x274739151d07c33dcfc4d1ab81daeaa39b37c9d4fb93bbadd3b5c65c4079ca93", "0x199bdada1a0fa6aad7dedca7f0c8c89ce2e1d09c8672c1f30d0cbc868a50f90c", "0x1486c0a05f7b0ea24c3bccb27d4570817632c654a653e1aa074c553dcb35e248", "0x2cd3a5c85deb60ab64bbf0221627c122ab1a1e2aacd70cfbe14b0272423c1a21", "0x1c85506cdced34b997dfee5dd4dff34ba74558dbe3cf2c76c92f9360dc1016bb", "0x09f6641293abf69862a3d9cae7bb457f0692eaf398f20d1abaec297dc0dd8593", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x19908fa5955b5f9485d3f2f40e2f7ca12224cc42e3a1c1bb9ea185fc350e8050", "0x1befab3aca7dea914f13bf64bcf91f92c51052042bde2883328773b6db75513d", "0x1f6a6d5be869f791b077579cc9d5c00a4959b012d6f850efebfca63ae0417dce", "0x144430000f871596941c6d524d899936e90b953e1e27a0c54ba042004239a97e", "0x000000000000000000000000000000b2a7648aefde6fc8a9bbc7bfa026456673", "0x000000000000000000000000000000000023ea0e21b028318ae78e495ba06c15", "0x000000000000000000000000000000b5c8f741b821a24cfc7051b07e0669eee9", "0x00000000000000000000000000000000000043f88477314dab70a74f851a300c", "0x000000000000000000000000000000c71678f66546dbb41ab3d1f5b2387a1c16", "0x00000000000000000000000000000000002649dff7858135fd272224c1096dc0", "0x0000000000000000000000000000004f5d7e7892a518fe97b18d93fa1242f5e4", "0x000000000000000000000000000000000016751b03f7b0d23c546d28dc0011e3"] +public_inputs = ["0x0000000000000000000000000000000000000000000000000000000000000031", "0x000000000000000000000000000000000000000000000000000000000000005f", "0x000000000000000000000000000000000000000000000000000000000000005b", "0x00000000000000000000000000000000000000000000000000000000000000db", "0x0000000000000000000000000000000000000000000000000000000000000076", "0x00000000000000000000000000000000000000000000000000000000000000d0", "0x0000000000000000000000000000000000000000000000000000000000000078", "0x00000000000000000000000000000000000000000000000000000000000000c4", "0x000000000000000000000000000000000000000000000000000000000000003b", "0x000000000000000000000000000000000000000000000000000000000000008a", "0x00000000000000000000000000000000000000000000000000000000000000c0", "0x0000000000000000000000000000000000000000000000000000000000000006", "0x000000000000000000000000000000000000000000000000000000000000004e", "0x000000000000000000000000000000000000000000000000000000000000004a", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000064", "0x0000000000000000000000000000000000000000000000000000000000000061", "0x000000000000000000000000000000000000000000000000000000000000002b", "0x000000000000000000000000000000000000000000000000000000000000001f", "0x00000000000000000000000000000000000000000000000000000000000000ce", "0x0000000000000000000000000000000000000000000000000000000000000077", "0x00000000000000000000000000000000000000000000000000000000000000c8", "0x0000000000000000000000000000000000000000000000000000000000000069", "0x0000000000000000000000000000000000000000000000000000000000000034", "0x000000000000000000000000000000000000000000000000000000000000005b", "0x00000000000000000000000000000000000000000000000000000000000000fc", "0x0000000000000000000000000000000000000000000000000000000000000094", "0x00000000000000000000000000000000000000000000000000000000000000c7", "0x0000000000000000000000000000000000000000000000000000000000000058", "0x0000000000000000000000000000000000000000000000000000000000000094", "0x00000000000000000000000000000000000000000000000000000000000000ed", "0x00000000000000000000000000000000000000000000000000000000000000d3", "0x00000000000000000000000000000000000000000000000000000000000000e9", "0x00000000000000000000000000000000000000000000000000000000000000d7", "0x000000000000000000000000000000000000000000000000000000000000009c", "0x0000000000000000000000000000000000000000000000000000000000000072", "0x0000000000000000000000000000000000000000000000000000000000000046", "0x000000000000000000000000000000000000000000000000000000000000005e", "0x00000000000000000000000000000000000000000000000000000000000000f7", "0x00000000000000000000000000000000000000000000000000000000000000ce", "0x000000000000000000000000000000000000000000000000000000000000004f", "0x000000000000000000000000000000000000000000000000000000000000007a", "0x00000000000000000000000000000000000000000000000000000000000000e8", "0x0000000000000000000000000000000000000000000000000000000000000077", "0x00000000000000000000000000000000000000000000000000000000000000e5", "0x00000000000000000000000000000000000000000000000000000000000000f9", "0x0000000000000000000000000000000000000000000000000000000000000032", "0x000000000000000000000000000000000000000000000000000000000000009c", "0x00000000000000000000000000000000000000000000000000000000000000e6", "0x000000000000000000000000000000000000000000000000000000000000002d", "0x0000000000000000000000000000000000000000000000000000000000000028", "0x0000000000000000000000000000000000000000000000000000000000000063", "0x0000000000000000000000000000000000000000000000000000000000000013", "0x0000000000000000000000000000000000000000000000000000000000000053", "0x000000000000000000000000000000000000000000000000000000000000007d", "0x0000000000000000000000000000000000000000000000000000000000000030", "0x00000000000000000000000000000000000000000000000000000000000000bf", "0x000000000000000000000000000000000000000000000000000000000000005a", "0x0000000000000000000000000000000000000000000000000000000000000038", "0x0000000000000000000000000000000000000000000000000000000000000087", "0x0000000000000000000000000000000000000000000000000000000000000068", "0x00000000000000000000000000000000000000000000000000000000000000dc", "0x0000000000000000000000000000000000000000000000000000000000000046", "0x0000000000000000000000000000000000000000000000000000000000000009", "0x000000000000000000000000000000000000000000000000000000000178203e"] + +[[node_proofs]] +proof = ["0x0000000000000000000000000000000000000000000000042ab5d6d1986846cf", "0x00000000000000000000000000000000000000000000000b75c020998797da78", "0x0000000000000000000000000000000000000000000000005a107acb64952eca", "0x000000000000000000000000000000000000000000000000000031e97a575e9d", "0x00000000000000000000000000000000000000000000000b5666547acf8bd5a4", "0x00000000000000000000000000000000000000000000000c410db10a01750aeb", "0x00000000000000000000000000000000000000000000000d722669117f9758a4", "0x000000000000000000000000000000000000000000000000000178cbf4206471", "0x000000000000000000000000000000000000000000000000e91b8a11e7842c38", "0x000000000000000000000000000000000000000000000007fd51009034b3357f", "0x000000000000000000000000000000000000000000000009889939f81e9c7402", "0x0000000000000000000000000000000000000000000000000000f94656a2ca48", "0x000000000000000000000000000000000000000000000006fb128b46c1ddb67f", "0x0000000000000000000000000000000000000000000000093fe27776f50224bd", "0x000000000000000000000000000000000000000000000004a0c80c0da527a081", "0x0000000000000000000000000000000000000000000000000001b52c2020d746", "0x0000000000000000000000000000006ce0e180065909feb70e0b0accea397bcd", "0x00000000000000000000000000000000000a94296a5da2accaa44fdedda9d27c", "0x000000000000000000000000000000f77661e30d2942418e5a18cb78857a835e", "0x0000000000000000000000000000000000181101a446331b0a7bb4a6ec19d8cf", "0x0000000000000000000000000000005f7ed098d15089020512ae32dde729ad09", "0x00000000000000000000000000000000001fce42bc40dfee89f9d45d9fb9a341", "0x00000000000000000000000000000055e86fe6ff6dd03201e5df71a0758d3ea8", "0x000000000000000000000000000000000008b812294da075dc805a382afe33bc", "0x000000000000000000000000000000dcad971e4b0d03b85302a09affe1c6d91a", "0x000000000000000000000000000000000007d51701eccd66b5ed04dc5a697046", "0x0000000000000000000000000000005d6c63bbeac27854f8a2803864822b8e76", "0x00000000000000000000000000000000000148201ca126e69a605a260bb9180a", "0x0000000000000000000000000000009387b2443807eb77315d2d8fd43143b2fe", "0x00000000000000000000000000000000002936676f4f7ec4aeec6553631a2337", "0x0000000000000000000000000000005af1987e93dc405b491ed3b3e0dd01ee7a", "0x00000000000000000000000000000000000137e415c5249cdf11b8f16288638f", "0x000000000000000000000000000000c44fb5109d2279ddceb0e71dab43093ba7", "0x0000000000000000000000000000000000126f285b6761b3992abf7d84c8ca3f", "0x000000000000000000000000000000d7d42799e32a50d2a5a5089633d4a300af", "0x00000000000000000000000000000000000c6bd606d29e28c4f4de3da5994da3", "0x0000000000000000000000000000000eac234da8014647d9f5a10416c7712536", "0x00000000000000000000000000000000001bf259ccb04216dad4c079a401fa41", "0x000000000000000000000000000000c22e2165f49347c43406f217d930dee340", "0x0000000000000000000000000000000000245cd7deeb60a13f2f4574c07d4f8a", "0x000000000000000000000000000000ae932b7a2ffdcfdf2dd8063f445c290679", "0x000000000000000000000000000000000029a9b896d3bce533e968cf017e574b", "0x000000000000000000000000000000e81d3ef27d372efe4c40d2b6005c0d9bd2", "0x00000000000000000000000000000000001c66d717f17cedbfef9704b02281cf", "0x000000000000000000000000000000e96c7480731cb62b8362935f8cca97fa40", "0x000000000000000000000000000000000001447b583cadc7d3c6d3cdc36991ca", "0x000000000000000000000000000000a2ac86553a64d5a6adb16c6e306f664717", "0x0000000000000000000000000000000000085e9782c7000f93b74d7745fab146", "0x000000000000000000000000000000bf26c0bc593e5beba8c58a8dad48d2a008", "0x00000000000000000000000000000000000f088356baeabbc825db1264f6dfc0", "0x0000000000000000000000000000000752d66bf24f6f036c32d6087b3b35facf", "0x00000000000000000000000000000000000bdf05d1b39df626b3b2b558cc3ecd", "0x2d3797ceff520f769e81de67566408211308dcfa310c962c62c45a63170444e2", "0x125b4915dab6af7a6ae971a8e16a42c478242bab1489e65c509ac7c50876ce99", "0x0f75bc78d6e81b07449c6bf7148da7c583f0288f6e6f076089d3096abd54335e", "0x273cf2f56b683a9660269964e2ccce17ee0305e65296c3b26ac1c45f3ed61107", "0x076b937888d54f25f59ac89dba44ba3b2a3b224381d88738649401d0920cfd1c", "0x1d5b65b8800c62b41057bd4a531453a1baf4f9179d8ca881ae61090ddb1d8814", "0x2d65a2abb52dbb13589a9b6f2220fa761e8949c841577044a6081238329d7a5d", "0x09bcf950b393f344006abeb7bb2f8daf8509c6a7b9a35aaaf9bb430954926324", "0x228aa7551311869213da100b1acbd70d176a7e091d44173df57c319875039811", "0x040f71c4bd2ce243e597261553dd60f7c637e6eaa4905c90ca4c8a03ecf9a496", "0x2c5cc37a66908f0d2ee9c1a1b89461a0a7a3a2a80a905189f5d2455c892ad7ea", "0x2416bc76e91c4e907d4a02ae9fe316779f730aa8cdf308fdcf717f7ed47ff0ae", "0x06a2399836435f5330436287cfe46fe37ef6c9d5aba5c8a939ea848c1e79c612", "0x020df313be5ff30819bf59de236f05cba856c9128baaa91b299a908ff58a8caa", "0x066d739a1169ad4b07974cf3129400238cbc874132329af62f66a8c776098159", "0x13ef084ccda72a2d5ca3369f944b6f293dcba96ca9b716201b2fa4260f98e901", "0x2ab145af182d416de51621268b4e46c206cf35569f22e69a47b49b06db71cb0d", "0x2823c4743a1d5240b55aa3c9d6c95926a5ac369f3fd62fe00806e539d6ec3854", "0x098faa56332d42f1f9c3c2125ce3fb5596188d68d5709281bcb31e1744c4be11", "0x26ba5726bc8cb7131da65e3c8628417905002cdf89f066e2e43e08dc7a72bc87", "0x04039070a04bd1cddd0fad6f090cd3206c7f09ad867d4caadef2d253014ff1b5", "0x2557af3111f03f62174b2b40389a3bccb331d9665c5e3caa5ce55f7fac3733e4", "0x1df6e85f02781af2e0a90a2c70c2e3d4d82c42d7c2fa162364d98bd3e3bd9a46", "0x1838ac97b5674745e22c9a602eea3f7cfb61d40fe53f16486df0b95d66b8c400", "0x10363fd3a09383f86b91becd7db4ef1bf51cf7bfbc2a68c4fe6c29818a8a852b", "0x194f1460f8214a58114f17ee592efce5e266f2196b30bc18af63b9cd3af5d162", "0x0f4ff9a3ad0eaa657b5509dd3ce66f20cd6bace4729fd4462941ed79626b3900", "0x10e51033cdf82d5b6eb26df9bcfa817220e2193d6896d78a53c366ac8c970ba1", "0x23a7057066cfed65c47ea773ea12398477eefcef4f6e4cd198e222dcfbff8c35", "0x1e3dbe9214b2cf79bd2f6058884abb18d4285bf2b76801a296e1cd654de0900c", "0x2d5181015349c853b81238fc060dfd09c3a5cad96b3919179c20e565906d5b53", "0x004dcbc74001185f05a970427c8174956756558325ef6e4df152503a19b51e43", "0x2984c7e0e65186627d6de21ef860048b5142c5b99813824e9e95e495351c5385", "0x15c3ef4f9bb9ce1ad1baf28f264b619f1ba3b4cf5dd5fd95900d3ca917089c8d", "0x22e3660ecd16dd23fdf6beda583946fb863dd5962b3d37bea6e62aa9d540d721", "0x04711ec6ed69a1aaf29c268b229afaf1b10884142d83b94d5d4a36c7e7197d9c", "0x2098bef4660e2b45c0562cb0c2c58d947331eedbf4feb322859b671c4c856d1a", "0x1aacb267d985e8c28ebc57f26fa2a27b8f7a3c87526b0ccc0fd0b189ab97424c", "0x2984b97555765bf6ee4a05db92e3e5d2d4ab2a81c05b71fb06a122bce9fb98d1", "0x1b40ad3320f5108ddc9287eb77f5882f1937a9648ad03ad40822e246aa592ad9", "0x2970ae8ffacfa935d5f8301e302cb72ca749bb6a91ef5506132ff56513bca7fa", "0x1ae091b6a83f010bf61d1c4f705bbe549c8f76095209d80ed40441766684a258", "0x303f1c46bc8e7b1f7900eaaced39d7135bdf8442395d7d73389a6a1416874a85", "0x1fe4a0615b42879655bcba57fa3741f2557d01e988d0976b93e0176fdae4487e", "0x22333a73037bbed3eb9ba1650beb6d00cf79046436fbeddf18b03dad3cdbb1a6", "0x1faa03c20131a44ff43132ae8ff820a4f53e4a02f73cf97429ae444d3ac94b27", "0x0aea205c7a3a02028f7f52eacff8a7d3a3d1360229cab33beff8d11411dd5692", "0x2835b46bf1dc374f85062ca8d7b8a00da927463e940477c345fb196498c11289", "0x1263aeb8c57a521628d4b475cd22de4483f62c3beb65590cde03604800193285", "0x0d1bb89b70c9ec94b7c813965bce145ed0d05ce88cbe7e4be72fa03e1686e81e", "0x2009aa5a9f469cf8f116a74db99256bd15e9ae60ecf47d83a0c64d9e751c0d6d", "0x1d0226df6e3cd28c6714f515e788eb8bf6fb97b8e525c0113c25e758171774e3", "0x159e068130f2bc69cfd5a219343ea1e3ba939b3e94ace83f18d9a26476a573f2", "0x0eb27bc8e4484f99b84d9643850af2a8b337f8bdf36c048185a5802b449d4bfd", "0x2f9a302084c46f8bf93dd3a1efbf28d2c0f2cb4b1032a435a213dd1bcae3959c", "0x11af6afb389d853bf4f76e8dc477a66347bb5ea81c1de2a98ece45b264dc30cd", "0x19d840e7492f8ac737ea4327580f72c437e0c87eecc537cfe27a9b4e9290807a", "0x05fc917d4c85cac00e0e61d66e7619bb7e7f474898347995f6f9dd237020fc23", "0x1ceb4405223de90b076ab1a9d545df416e3d370b9479752127408306bd40d131", "0x2d1d16670f60cb5847a5fdf0cb417c54aa57b818cc90dcce861f6589dd2a47af", "0x2d58e7a4e65452163b375a4f975d834d418b05490faf8768b990670bf0c69dda", "0x298e9439ad33bbf67bd12adc7b0f1686d22f9f22c5d8fe8a87623dbff7357a87", "0x148bfd4d89ac4c6901e3ac9752754713612b9afccc813206149c47e55602fce4", "0x05b90b73a9586bfeea43dfd9ae3df7eedf0a7f8987b43a1f4b9f4ebf5366eddd", "0x228c608f733c9f85872703f22eede214294302466f37bd0b9017da9504138ee0", "0x28c19cd5b564cf378f3d30389e5b6e3f694040845cc8d50db77e55570bcf17be", "0x2a2c5c7e943ac9b62d2d18c5c8735d3127562db4c69e111a1dcc01ec6cf88daa", "0x14246007ad5a17c201d4e00d5055de4baa4e8623a75a309ca9eca82c441507af", "0x0c631e6b74ff6e5d58224109bd9c2d6366334004fda587d744e1ca009a02a778", "0x1378f45838b33db2576413456f234bae3067204ca3317ee3e30264796f8a0bcd", "0x038ed00191ce0df9ee85bbf2c5bb3770d59fab8c6c78e914b93008e1342f7644", "0x2292dc31fb025966102fbd0cf41a23a35e8377c271dbb89ba9401d75997dbfcb", "0x2831597d04965002e57e8a86fac9188c713909ae6d441cd5725857009c7b437a", "0x0242133db9df7f4d92308d2c79109926cc27bc62d361c6f39731b57834a3fda0", "0x190c4c1d2532b7fe92a39b44ffa0d5d8c542d90b2f30771f75a84fc284436c50", "0x0e1b7cab67f2bc1e722899b562db9871aad36e734b5aa44d36d29a677d4fad91", "0x19fe5866a7740c0150e41f3dbc5195ffbcd76a826956e2852c9aeb1542efeec1", "0x26a5203b688730ab3eae5cfbdc070f5d5a17c367d21aba91da69c4b7c2a6c2fd", "0x27b29f9d10ebbf554cffe08b9b98796cda0771126734c94728e930cedb79e512", "0x17696d740b91a9d15224991e0ca98c398b57ba4326bb4dc01cf533bfddb72eae", "0x20eca360d38e5842f68d481e59fa15ba1f6e31f984f028914867119dc02dc339", "0x0e51c5d837f1d604cb46b59486f2cceccceb47178be41e20f069669ac90e1855", "0x1ee31cc09ba994443809fb7634a5ca07a2b05686ab51661a4109ccc45d247c28", "0x1e2b8853a78443af77c6375544b2e9d1df4ea00b99caf46737f4f57b83a57c2b", "0x1feecbaf9ee3c9972dccf01feb0668cb23ba15124a9e59e4a082ee52c165c927", "0x2cfad868e08ad5dd2830655395d923cc27b5bc0b2da53dfa7ba7179063cfdbbd", "0x235d8653d35fd9c67e9fc52dd99ef67c3b929c811f472fbd35f380da331222ab", "0x0714198d10cdd8e5859bdabe0a683ff489349f8e881f9836c5a5e572fc2a2959", "0x2de79bc352ea86695ec1fa50c6d33da85b51e023d4e690e121f7807bd98632f9", "0x20c95e08e2b94fa4e994dc3485f96af2ebecae8715beefdcdbd1dff311b2988b", "0x2c589461640e3256eae843bb144085d80c317283e6345c6ef26e7dea9c52ced1", "0x02cb7341263f71af5fb27c513a4b378fb985077c49530cc83f2760fb898d19bb", "0x291269f5a07d7be230c41bbffff9701044a985d8f164ac715f6667a2eafa09f4", "0x225d7045d3b511901de4641af757c136206c6fb5359d5900ca76360cdf43617c", "0x121ab9ae612793146c1998db9d350b4c62c904cc25ea71eef163ff0d6d39a92d", "0x16833fe6567225440ad762274a40b0ff576947a709a9a79751e777c0336f67bb", "0x0460c71a12c4f589e5aecd9bbdac8912fd10771bc3d9bd66b918a7a8f846134a", "0x117c3c25dd184310bf036395420cd969c0b8eb7d4d8b5133f85276edd799ac1d", "0x1e57328eaee31ed575b38bd87c2726273ec4f0fb50c5f86a74107097c44ab8bd", "0x117bc3e7d39b99fbd29d92214b3c1555db4413663c3ac614f974d912cb29a97f", "0x1bb8838d578556ab212b4f434749b486c7aa424f788457093a40360e250baaf8", "0x0be4fdb085118c89d35b0912502f2a40526544cdbd60eea1ef02a52625325be4", "0x0f45511e25c01079710fb5894fea824dd5efe4dd17f18ad5ab4397f635f564b5", "0x09aeeb44ad06afe0850e7cdd9cb40dc971acae399ab9502b0ce1c25389e97052", "0x280a0e0648f9a9d377a930367209b61aad18e03420dcf21603a59d98be30d214", "0x034b178ad4db8b714b5d171f4ebbc678beaa8d814e1c26867d11cc81659afb28", "0x25ca1aefe01d21ad9cb20b85bf3e27fa4c3f1776533d15e9ac2c6faf8f1852b6", "0x03e951e0361af3663e7f74eacbfcd4bde92388973a8082c23407dfd7e9eebfca", "0x1d4726fc028484f1a26029c82f60b29a38decb5c10bcf2829c443fc3bc2df249", "0x26ddcd659a7f23fc5e4ea2a9f01b11855f7b730a44cf0f8e900a3ceb26e0df8b", "0x22f89747f30127b39a595552a3b1cca0c0a0585520a9118a1847924e09dd1c37", "0x25a0e45982f6ce1edb106c39939d0381bf2df31a7308b29a8383dc37a480c4d7", "0x2f0fcb3d6f276040f59fe40ba5a0356a644417a5fc1aed21732749a869386455", "0x10609d6acb4fb88386bf16e7547eb41962f1f3bef3535acef9e05de42a111844", "0x22bab18eb5cff9b35f51bab58ec52a5a720baafb0ec080987319b6b92332ee35", "0x204a7e6ae9dda821a54130416d2396f2615efd46a91cf80cb4b5d664893ee13d", "0x0bff61a1c7d553310a6bdf7cf52723ae1bfeaf5ae5efafa03213dc8d7a474bb7", "0x17b1e893069e2c4c92c6be3419e759f603bb7816715f6643c9bff324d39f2188", "0x018f57271028553e54b23b4c9d5b41c169ea911fa7af9c0270bb4b34fe10ed4b", "0x0cd7f2ff08c6fd22bc0ba2a7309897a20d4285ce50bcccbac91721797c0a0624", "0x2004df0d1fadb14d3fbf7c70de12b27b46e86738ab5f87918adad435986fa78e", "0x23afc877a76d9f75fa85d33ed8584fddb293866decfec1e3d7cd2f28581d3d2b", "0x248a0ec5019c9ebc0fe76061f7c322e737f1040d90738f5f0a50de1eae4adb4f", "0x06ebfe9130d87302155f726871057a4c1d1df255ed30acbe5790633ef9dce095", "0x10da00c8f30ae366a735d2c63409c69989ad46ccd6b2a2742700daafba5e74b7", "0x2e3096abafc9639cb5d0c2776b0fbfd87be85f298121a36d54fe8f2ab76ca1da", "0x0bbbb1e381348e4609eddc62876be29c4291143e8197632c5356eb24e5e06ee4", "0x0f4b4754e8042116bedfa9923fec96f2593b284be6917483dca128224a72a53e", "0x025b03e01e3a1bd1b59fcdf30e3f17cb1d223d0100630f5786ac5a9fb7f83c23", "0x194b0c554e53c17d17cadb96cae4e07086441dcfd52c39f44fb22cd2b139c7e8", "0x038f0af19f229f677b200b5d9319175202fc9fb3104806fb79a84e9e8eba4d54", "0x1c6ac9ba1dae93bfc0a0b79bb9755681d5733a6919ed44e1e1cb6286da779bba", "0x1b1a70e7d5ce82005cf377b2ead2213f04d554ba5af2a0f4606180b44a56cb49", "0x11a69f11d55e1eba0544a2fdd90eb51d77027d1b4728f5e5562a011cb40abc7f", "0x1c9b4c66ec6e0054c9df7016fc45abca760888479b730dca1a2479fcf2ff64db", "0x22a7541eaa63cf8abfd779d13025b2759c06765dd7f4ff5d40cfaddf28fb3144", "0x2169bd547649c6fdf41ab4199fd5359fdaf23491fbb579dd7999d904ba8f619b", "0x16f015d2502fbcc25b341b967d56a4b6603cecf633e8a0081e63c8a7b2fd4bf5", "0x2b53ead03bdb515b5906e02b2c31de4e5a6eef0f9260575b57084332b6dbd9c3", "0x14961cd0532b5ad8deb8ad4e6606b8f0544e9bd31d9ba702d6791e9fbe20ee58", "0x05a347c29731a29c02d432bd127d61450b2778736f41114d2856cf055474ff12", "0x2acbe29dc2dfcf395fabc9bc294443a84539dd98fc6772cfa1cd0522895c260b", "0x0a19a7edf41e48fa6f334820bc4a6012f48b48f6b11658cbbb05b42f7baf2011", "0x2b419e7698a62688871171dfe1aaea85ec896d39ceceb2d37e5c392b26ec30f6", "0x1e29872882c0624287249dc4dcc523623d77f30e5fb10e5264d6a82946550df1", "0x1797ba695f79d719fcedec68301d24a449e2ca6d1574add8c8f5229c2d75c3f0", "0x14925b96bfff03688c7db7304619fb39da58e4974a59c51da302e41076c25f6c", "0x18133b2a69f992a4082a0e7e48ab27f1f2160741d3c69bdd95ed4cbc6555d8c5", "0x022fed5d3189434d70888ce569aded6aa5756b0dc8eb00dbe65813d5747af7db", "0x176d95cecd7ffca34ae600df281174d3b1c0839c27416fd64f3f9cae1c8a08fa", "0x243a201b11496537f71ed422f8f83136863574e17315a847e20b4a6777b51dd0", "0x00cb4e0841bd6cb9e69ea896eb0cbbe8de993ab6f229cc64e7dc866c937d23b1", "0x22ef43cf7d71bc05c6d3f6d72dde11ab22c60fca4d9fc138a850658f5635f1c1", "0x22fb162fc1d729ea826b26ef3ff055c8946dcee00cf433c5c683095fb5af6bc4", "0x01db2cb287dd703d50fe1e67c335687f76a8bf8928d0e00416ecbf72b3aa30e2", "0x1598b817fb1b81e2c9600fba9934e1894a1c5d0551335b1810e6cd2661143fb8", "0x175b55d22d4676e54c00d80aeb29dffc4017579e72c8808ae40ac3ed16534581", "0x216eb7def2234cec34480fb46d3509d7860f5324eeb29940c7b3f07cf24cd426", "0x2e6640b7f4ca7af4932141901b53f500c3f3af99fa2170981ebc3d3e506cce3d", "0x05c1adc594f209fc8e3787a0b7335d3490726bfe92232eff8a50ea205cc54d52", "0x2798bc7fc05d890ccefd64c6ca8dc0a7f9164c066bda191aac235d5f4c133999", "0x0696340507c83c9f5c15dc3c2e2eaabd47e57dd6a51bf696db9e20b807645df4", "0x245ce7749c7f7d6d3f5b1c9e1f11c7f2c74defc633ab048036e630924f9404bf", "0x1a30963f92a42f3942cb700a0c0daa3a8b62cccfc43dd07c300ce6f7feb35f67", "0x127306c4ca8e7923b2674089c10297517cfb4f56f9a1cddc7ff6d762332c5b20", "0x0d5a5a7397c4d0826cc43b66544fb3a9e461f9cc16e643ddaf6b07a4092edad0", "0x22173676cf2330327f4de949d902fdac7809d32dcefe2e890dd1a4f79e32fbf8", "0x2f1e32e57986a3c8b50633a85627e87e4b680caa19fed656f10f608a84bf9bd2", "0x1156f263011f712b3799ead784f23d1572b0d569641999b280f939d40034c61f", "0x16de1594bcba57bfd8cfc53eab7332563e782c8e544ed1a7bf09c94919afd19b", "0x059a63e93d8afd4e67dcbf2538f019eaf8d41f376510e937f1a6f3f7c697c8f8", "0x1db1030fd1b86ae506db04f99ef6a4ec4dd127721ba2cc693997a033baedb814", "0x15261b98abb93e0586a791d67ad5911eac436f6f36c7089718162161cc813c3e", "0x00d70f61e2742d97c8e1fa4ba92ea3f4b5043e92c3a190e85d42742631ddd681", "0x0509d545544e5e3ed90b839f7a8ee1688ee15533ac358787842ae41ff4fd5fdb", "0x0a8308ee67e4b19d3120d2a19d49e86d3556c316a8f767488f56d9ddf5b2382a", "0x1f40a886acfb58a758abdf4352fe811814f8e1864b85a39b19bf9a2ff77cc467", "0x072aa5b489f4b6172f5b63c11f8e1e05f149c3169064478b083c78485df4de95", "0x1b54de940c8b289866f23d0cd3f330ee0484920866885d0d3f6730253586b4cc", "0x116b88c3273a438f4ca1ae52f3cac4d700a926a8b03c5cd350f53f16ddb10387", "0x1bfdba39ef83e5ac6ecd9dbd56fd7a288ab5a97a6f9a486bdd55f1f9cd121d64", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x06a961aba9c7d719b4db14db3e493303f7743af487f9de2b4117cdee9826abcb", "0x0e286b39988773c119488a3fd62d0d9fab8d793eaec834243b4cf7dcb2920b75", "0x036398facf9fd86f6fdc609cc024f2117ea33cbc233eb54c612d6e25bc5c97cb", "0x2a5fd55acdddc3640bc05624dcbe5a18683193faf17a58294a4fdaf439ef2320", "0x0ec383ca8577cb47c12abe5f262fab3415e0b2275f7a5f0a0c67d77acf390d11", "0x17793769d9b78cc744ceae1f2a21bd449b29f1f8655de63b83d96ca204449b81", "0x2b7da179a1f91334fcc430b7331a9ffc555222a8678398083d1c3ffce1f95591", "0x18776806cffb21d5779277c01e3849d93ef2045c502fa1626761435db8b8dafa", "0x076f78f645987fc540b1b65ea4df1288f6c795e566032056af050beb41018fe7", "0x0c48272c286576772c75e960a95f3b403f667b9eecd4963db3e7c435db42e4a8", "0x05e3cb5ede8d8091206842d2cbacd009d7ae3f1716bf27b012751ef724ce13c2", "0x15e9517ed07f276d058287d55de67e50ad3a2e5fb978224b29b8511594a0db00", "0x17ac9502990bf7ffb2834b03939099f624f6e6eae1328e54881fb37cc741a797", "0x2e5aa4680cae0416b9bc50b56cf21e4a58ddd828877e145c772f04ee34488fe7", "0x0b00f3b3f42a812e51688c8eff0477cb95b8da11bf452c2e1878207dc4df2843", "0x1bc1208b2dbe8605d4da8d1dfdfd2eecd3d7ab5b05ccf07291d57a36cdb3c1f3", "0x29f854dc2fef54a1268ec62c0b2e22464aa364d31caf51f12eefeb7450177829", "0x1e8ccef072b276dae1a1afbf7031b63942bf499cac8ec21ea4e904ec13967d5b", "0x2051ffa437019b6f496ff7957b65c08fc7d88fa3c23ff17b46ac9d5ec8f709ad", "0x25f347773c4800ed3278426e8f06a7d5db565591fbe7fc8174cbb7394323fbc6", "0x01e9c2c47321da76fe9a64d743b59371aab90009ede41abb9288b06b9566cbec", "0x288fce0772c2d34f516de4dbd006c05325fa1ad9c72956fac8bd00c3b11b2678", "0x1729bec3beee8ba060de8767b446c9e81a57e0b62a530143392c2640b4066e0c", "0x0fe97caf8a973521aaf8a456254cdf275b62c7c98fd3b91eaab0dca1089e9a95", "0x0ef2835e7443acf6a08fdca81bc84aa90db3f33c6f2b46ba2287453b32aa567e", "0x20a1219386cf3ea9ba956e134e1a0ead435212724e2ba87b08a8f37b96c8eed6", "0x2548052c46258e2df9651c961115c99052fd24e31c64db47644313920f556d81", "0x10f33a958c47388d90a5927a05411a12e74e679f8af663b29f18aa8138c3fee9", "0x26dd9e97a5500b9a3b1eb73c1d8288030fd2d6d66c8085c1f8db7c63e6a88d8e", "0x113c55b2f220bc56f9bece2253962090cc8018713bc3286f153fb2c9ea478a57", "0x01750fc278fe0681fe46efca953cf5929314ceeaab7400562d0a1b5699f35164", "0x2399b1bd466f6fe70b437e6e5efed3be23c0ad8bdc48ffa77dcdbe6582847148", "0x1170b899445d5fb30af1ed5095a41c3bd3f09a6febc6ad4c9ff3a7a53eb6f80a", "0x0455fe265103a2de04e78d0920f6bca01806a05819725ba7c3bd87938208a218", "0x0e81f742d8bec3103486d8c3c2c8803d69d07eb11bc797aa352fdb1dd504f92a", "0x2a46dde2885bab0dfdb139b2af7b15d9575f48e92ede989ac31bc53e7d1d065b", "0x05dbfe2e4f1455cf8e98c8712735ebfbab8de1b59b9bf8a3b80109b3e4652488", "0x255741857bff532db77c5dbbab30cdc15d9d9d8a3d1cd7226b31ac2fda2d11be", "0x01a0cb42751854a56400c6a83ee4f95ff01ec2b37c6f2dd71ef2a2dc331b37da", "0x0bca1bb99aad81d79c63b0ed4050c14453fdc027845a16719d896d4d96376078", "0x1f6dec50a617011b9a0039ea3941050b5ece3040fa98108a24204289bc112127", "0x0e41664b6d519e3fff39070257140ebbaa43d62f198511e5950ebb1d6efd1bee", "0x00000000000000000000000000000011361dd8f3aea6b7c4f8cec611e4ed3634", "0x0000000000000000000000000000000000169705a94e6a720a0995a2521fd341", "0x000000000000000000000000000000310a76bbb8f836f901f6d6636f53d22f46", "0x00000000000000000000000000000000002af4a60d8af546af6d7c28f40cac2c", "0x0000000000000000000000000000002d5a8801b5456582fec843a15937fa55e9", "0x000000000000000000000000000000000025e477c00a6782ab050c408ad087d8", "0x0000000000000000000000000000000072c5f05ca9272871fb2788bc1a500d75", "0x00000000000000000000000000000000000faf3582111f94d3798b607a7dd288", "0x000000000000000000000000000000fe1a5f8ade0c3b3a8dbc2bb5096e61713d", "0x00000000000000000000000000000000001a04a4297f4eae4678f9259e930351", "0x000000000000000000000000000000e7586720761af76a63a503ec4cbf518c8e", "0x000000000000000000000000000000000009fa067883e1ea0f1dfea639af7444", "0x0c6488436189d7a85361708a19d60b92c99b09030168312687576860e283f6ec", "0x0000000000000000000000000000009f3462f9dd192a2be4095185721acd505d", "0x00000000000000000000000000000000001d2cbe6c71dbd1eb59847438564473", "0x000000000000000000000000000000756864c551fb46f78aa2d3611884daab8a", "0x0000000000000000000000000000000000129144a47e2ad71912bef606fd2163", "0x000000000000000000000000000000aaeecc3abd8834329d65cd1aa1d6aec979", "0x00000000000000000000000000000000002d67222077fe617ee60c4767dd6be2", "0x0000000000000000000000000000002dfd15b5ecb4532e6580c11e5e379ee097", "0x0000000000000000000000000000000000077e954c0b25b77a0862a6ef0d7817", "0x0000000000000000000000000000005a21b9d70e0d46519178fc0ea6ae8c0c63", "0x00000000000000000000000000000000002b540893070ca58089404d595d64c6", "0x000000000000000000000000000000b40a86227d3125c203be31fde40a604aa3", "0x000000000000000000000000000000000012a646bf73e6016c51059416894240", "0x00000000000000000000000000000013b1271cfccda90b7bc8a9c1c488bb6d5f", "0x000000000000000000000000000000000010cc9ede7d32816d729cfc04c4f88f", "0x0000000000000000000000000000006b2f84216556fbded69f7fe1572946c89c", "0x00000000000000000000000000000000002ded9ed202fa16818e8052e262b52e", "0x0000000000000000000000000000003616b927382e71fecee754dc27aa1fc9ec", "0x0000000000000000000000000000000000287e270968ec9b5aefb0454f25fdf0", "0x000000000000000000000000000000ca80341107300095a6bea894192a0b5fe8", "0x00000000000000000000000000000000000983911297e31eca820caa75e4962c", "0x0000000000000000000000000000001b01849082a8a421d7b09cc25d19ff6b0d", "0x000000000000000000000000000000000022077a35c949e9c708652275d3ff1e", "0x000000000000000000000000000000228f1221e095ef21c9a88e24970f257090", "0x0000000000000000000000000000000000240a4481f7afdcdad55d63b40063b0", "0x00000000000000000000000000000048b9755f54132921f1c377621b194a212d", "0x0000000000000000000000000000000000132084c0c93db66d79a0d12eb21c53", "0x000000000000000000000000000000b1919bcaf01f65462dbcac0734d81f4804", "0x000000000000000000000000000000000005f2ccc5fd2549ac5d6ae6f5b0ceeb", "0x0000000000000000000000000000007898d83e884d4d4ccc2009b764043f8eb1", "0x000000000000000000000000000000000021d3ec5fe2f9434bda459772cd8f90", "0x000000000000000000000000000000211a1fe7894790c3067bb72e07f67daf78", "0x00000000000000000000000000000000000febe8b9980cb7911614f70306a23e", "0x0000000000000000000000000000001580af7cd39b2060442e1ae91143f786bd", "0x0000000000000000000000000000000000063b7681cbe0d3a7c0231d9c6d0ea7", "0x000000000000000000000000000000e81e9794dd5c51542c1a1f507019b790e1", "0x00000000000000000000000000000000000cc39578c261ff87c629ab971c3da9", "0x0000000000000000000000000000007e8dbd1b2c99f4af7b886a101a8bcedb11", "0x0000000000000000000000000000000000117afe63995381794651f690e09421", "0x000000000000000000000000000000537364e73d83971f0fab1fe876cd1fc51c", "0x0000000000000000000000000000000000003c0652b9c09c604dec6cc624d614", "0x0000000000000000000000000000007da3f6d6d378fbc993bc00e0b6d84a8ed1", "0x0000000000000000000000000000000000268f9c8d116c8c96eae07676df9300", "0x0000000000000000000000000000008daa0cfbdb7a26bb7c930dbf55bfee5c21", "0x000000000000000000000000000000000017e585583e3d4a2a69da1d1b591378", "0x000000000000000000000000000000a7d790a7d71d746504f4bb0a7d0ac44ac8", "0x00000000000000000000000000000000001f8a1515c34acb06965ec4254a2321", "0x00000000000000000000000000000070aeff0bceb65d5e7befb8d7d7712dc51a", "0x000000000000000000000000000000000011373a021045a2e7abae9fca109125", "0x000000000000000000000000000000a51be4aecf91157dab267b6b8cb62cec80", "0x0000000000000000000000000000000000218240ccb6f69e74f737890178bd1a", "0x0000000000000000000000000000008903cae72b1574d929760ea7935dc12d7d", "0x00000000000000000000000000000000002608503d31fadc7d1fa9c3fc34febb", "0x00000000000000000000000000000088c759c13649c267c263c6842a641b2f77", "0x00000000000000000000000000000000001969af1531b5e8e3a200f08fe38055", "0x000000000000000000000000000000dc6d3db18436a2da0eca84bc995454b930", "0x0000000000000000000000000000000000159991b6b6c601ce54c0f545e89988", "0x0000000000000000000000000000005562292ea2556d661cd6896f9cf4162e18", "0x000000000000000000000000000000000021aa1aa2e4ceb5dbbe9e3c1d743592", "0x00000000000000000000000000000046a0b21fec8f4f2cbb32ac7b8e8c39f8dc", "0x00000000000000000000000000000000001ace8908247bc41273ad0f5cf44c3e", "0x000000000000000000000000000000f18c36c3721495c956a07a56e6e4e088e8", "0x000000000000000000000000000000000024fb17b6685dbf922fac7c897cdef6", "0x00000000000000000000000000000005a13546afa3ed1ec5743235465849c7e5", "0x00000000000000000000000000000000000319b7b771735fec74914fa16a0692", "0x0000000000000000000000000000006edbdfe738de44a895c9c94c03032de424", "0x00000000000000000000000000000000002e02f1275dbcfccad430a196003901", "0x000000000000000000000000000000d1836ce9b13a0987d1ca4bbc7247843924", "0x000000000000000000000000000000000013c7af429f4770402179b306910878", "0x000000000000000000000000000000579c568d173b6ee1e348805bf75cdae2c9", "0x000000000000000000000000000000000004e7ebbb21670c02ea311d9a7055aa", "0x00000000000000000000000000000021f761b3047797d0bdfb0108d4fed895e8", "0x000000000000000000000000000000000005b805e2dc282481b029e52a7d6213", "0x000000000000000000000000000000873a5061c15777d5f2690b802c459d0d8e", "0x00000000000000000000000000000000000de29fcbc2246c499a06ec85056c01", "0x0000000000000000000000000000007c3a96b39a20d6e86b69eebb773139cd26", "0x00000000000000000000000000000000000e297c73dab6cdcbbf64dc7a852620", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x1743fa1427aba9ddf051f1f0bb323014bc668911a95f84eef1b2f6bd0e79d8b2", "0x1e24b846f238fafba5125c8811b30072efe785c5f43eda30166d471d7383f290", "0x080d9ae8a06c978ce252b9c4b5185035cebe7787d84084b9d4d250ec85d1e8cd", "0x2951a4b404d3317c9ad7f969bb1cea6c117ba0f1fa5c212dbe4e11a73606fda6", "0x03f7e7c2c44e3e5dd93c7355885ef66ac3a27ebfa9c6dffa68f528bbaece8e85", "0x181d6576268b92b02c36eb08bb24c4d52e076df6e9abf54c4492b69169f80a8a", "0x1baf8fe44275aaac2c2b09dd9eb924e12414ab87aac2225747db378d04b59828", "0x227619af55cd8932bb4f2daea4501dc71ad0eb6e6270d532691eae78e63d6f56", "0x2b700d370c065e095156c7ac312293975751afec410b37b0470497f562b9f9b3", "0x09bda7df963538dd5c757f636625d45aa060e5eb80fa2413f6bae8d3efdd8125", "0x2fde58acf96397096ed2cdfa67352ba0cee60a1a76cab179d7c1988a34364124", "0x07f7933bf363f4bdb4dfe2576164b654e7eaf01b86c7a34abf34bac520998384", "0x0b44ae66ef36e047ecff5823227859e4ee1d80ecbbe4178c7bcb77e38b8b5f2c", "0x2be245ac0cb675ab573bb2ae32ba7fbe2e4483c886fd366069ca7e91b3924b5b", "0x16a1955be717056483b51e621b7aebb4a6329b85d7e91c7d50db9182fa31bf65", "0x1c3feb03b92f13f6157bc648180c0b93a6bdb109068e53915175dd26256c3762", "0x1a81d61dd3de2d74c4f1d982d583ed2bcbfb348b9d3be0a7f80df5077bcb3f88", "0x080a4546e11ba9bb3dce769f83faeec2ad49601d9165d3ad42f0e25546be07c9", "0x0c9b58ef69a1d0ae6327c920bf5e038b326b3332d7fd69aa1169cc9a1a037c43", "0x058915e22f47c440d01694b95ce770e6ae3ef11690d99ed9467c45a20044a5aa", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x005c965c7d3ea931ed2168c2b89dedfb6e8a30b30aaf03877b9a2726e22650ee", "0x305682357a7d16416b086e3360875b37636caecb37e0410a0ee60aabee96d388", "0x140f739edb8b2e01398ee5def255ac0a3b3f2dd5df7c7328c489aaca086878a2", "0x2c66ed5af3e6507680850e7bf9fae125e56f77127dee30e2f52bdfcb96df2b37", "0x000000000000000000000000000000e7afc73a7d9ca578331eadd510f4195491", "0x00000000000000000000000000000000000a5183aa3bc2c65a516908f8c7d3b7", "0x000000000000000000000000000000e8dc9c94193da90c845765c059b3c9ab3a", "0x000000000000000000000000000000000005727704fa5318928e0f62b58c81f3", "0x000000000000000000000000000000bc41dbd2bdd9e4f25fdcc46749cd8f094f", "0x00000000000000000000000000000000001b407bcc16a8b66cf391358087224f", "0x000000000000000000000000000000dd6c82b13283d9135c1c58991d3be3c43e", "0x000000000000000000000000000000000020f4ff29f136dd34b110f5f468cc44"] +public_inputs = ["0x0000000000000000000000000000000000000000000000000000000000000031", "0x000000000000000000000000000000000000000000000000000000000000005f", "0x000000000000000000000000000000000000000000000000000000000000005b", "0x00000000000000000000000000000000000000000000000000000000000000db", "0x0000000000000000000000000000000000000000000000000000000000000076", "0x00000000000000000000000000000000000000000000000000000000000000d0", "0x0000000000000000000000000000000000000000000000000000000000000078", "0x00000000000000000000000000000000000000000000000000000000000000c4", "0x000000000000000000000000000000000000000000000000000000000000003b", "0x000000000000000000000000000000000000000000000000000000000000008a", "0x00000000000000000000000000000000000000000000000000000000000000c0", "0x0000000000000000000000000000000000000000000000000000000000000006", "0x000000000000000000000000000000000000000000000000000000000000004e", "0x000000000000000000000000000000000000000000000000000000000000004a", "0x0000000000000000000000000000000000000000000000000000000000000001", "0x0000000000000000000000000000000000000000000000000000000000000064", "0x0000000000000000000000000000000000000000000000000000000000000061", "0x000000000000000000000000000000000000000000000000000000000000002b", "0x000000000000000000000000000000000000000000000000000000000000001f", "0x00000000000000000000000000000000000000000000000000000000000000ce", "0x0000000000000000000000000000000000000000000000000000000000000077", "0x00000000000000000000000000000000000000000000000000000000000000c8", "0x0000000000000000000000000000000000000000000000000000000000000069", "0x0000000000000000000000000000000000000000000000000000000000000034", "0x000000000000000000000000000000000000000000000000000000000000005b", "0x00000000000000000000000000000000000000000000000000000000000000fc", "0x0000000000000000000000000000000000000000000000000000000000000094", "0x00000000000000000000000000000000000000000000000000000000000000c7", "0x0000000000000000000000000000000000000000000000000000000000000058", "0x0000000000000000000000000000000000000000000000000000000000000094", "0x00000000000000000000000000000000000000000000000000000000000000ed", "0x00000000000000000000000000000000000000000000000000000000000000d3", "0x0000000000000000000000000000000000000000000000000000000000000015", "0x0000000000000000000000000000000000000000000000000000000000000065", "0x0000000000000000000000000000000000000000000000000000000000000035", "0x0000000000000000000000000000000000000000000000000000000000000024", "0x00000000000000000000000000000000000000000000000000000000000000d5", "0x00000000000000000000000000000000000000000000000000000000000000bb", "0x00000000000000000000000000000000000000000000000000000000000000e3", "0x00000000000000000000000000000000000000000000000000000000000000e7", "0x000000000000000000000000000000000000000000000000000000000000006b", "0x0000000000000000000000000000000000000000000000000000000000000032", "0x0000000000000000000000000000000000000000000000000000000000000095", "0x000000000000000000000000000000000000000000000000000000000000008e", "0x000000000000000000000000000000000000000000000000000000000000001e", "0x00000000000000000000000000000000000000000000000000000000000000a8", "0x00000000000000000000000000000000000000000000000000000000000000d1", "0x0000000000000000000000000000000000000000000000000000000000000039", "0x0000000000000000000000000000000000000000000000000000000000000068", "0x0000000000000000000000000000000000000000000000000000000000000097", "0x00000000000000000000000000000000000000000000000000000000000000f0", "0x00000000000000000000000000000000000000000000000000000000000000ce", "0x000000000000000000000000000000000000000000000000000000000000003d", "0x000000000000000000000000000000000000000000000000000000000000001e", "0x00000000000000000000000000000000000000000000000000000000000000d7", "0x000000000000000000000000000000000000000000000000000000000000005e", "0x0000000000000000000000000000000000000000000000000000000000000015", "0x00000000000000000000000000000000000000000000000000000000000000cf", "0x00000000000000000000000000000000000000000000000000000000000000c6", "0x00000000000000000000000000000000000000000000000000000000000000c1", "0x000000000000000000000000000000000000000000000000000000000000006a", "0x00000000000000000000000000000000000000000000000000000000000000e4", "0x00000000000000000000000000000000000000000000000000000000000000bb", "0x00000000000000000000000000000000000000000000000000000000000000c0", "0x000000000000000000000000000000000000000000000000000000000059c17d"] diff --git a/circuits/app/proof_of_reserve/utxos_tree/src/constants.nr b/circuits/app/proof_of_reserve/utxos_tree/src/constants.nr new file mode 100644 index 0000000..aa6f06b --- /dev/null +++ b/circuits/app/proof_of_reserve/utxos_tree/src/constants.nr @@ -0,0 +1,6 @@ +pub global MAX_MERKLE_TREE_LEVELS: u32 = 4; +pub global MAX_NODES_AMOUNT: u32 = 8; + +pub global PUBLIC_INPUTS_SIZE: u32 = 65; + +pub global SHA256_HASH_SIZE: u32 = 32; diff --git a/circuits/app/proof_of_reserve/utxos_tree/src/main.nr b/circuits/app/proof_of_reserve/utxos_tree/src/main.nr new file mode 100644 index 0000000..ac6e6ae --- /dev/null +++ b/circuits/app/proof_of_reserve/utxos_tree/src/main.nr @@ -0,0 +1,52 @@ +// Second proof +// Build root from many nodes + +mod constants; + +use bb_proof_verification::{UltraHonkVerificationKey, UltraHonkZKProof, verify_ultrahonkzk_proof}; +use constants::{MAX_MERKLE_TREE_LEVELS, MAX_NODES_AMOUNT, PUBLIC_INPUTS_SIZE, SHA256_HASH_SIZE}; +use utils::merkle_root::merkle_root; + +struct NodeProof { + proof: UltraHonkZKProof, + public_inputs: [Field; PUBLIC_INPUTS_SIZE], +} + +fn main( + verification_key: UltraHonkVerificationKey, + key_hash: Field, + node_proofs: [NodeProof; MAX_NODES_AMOUNT], + finalize_mr: bool, +) -> pub ([u8; SHA256_HASH_SIZE], [u8; SHA256_HASH_SIZE], u64) { + let mut nodes = [[0; SHA256_HASH_SIZE]; MAX_NODES_AMOUNT]; + let mut owned_amount = 0; + + for i in 0..MAX_NODES_AMOUNT { + if !node_proofs[i].public_inputs.all(|e| e == 0) { + verify_ultrahonkzk_proof( + verification_key, + node_proofs[i].proof, + node_proofs[i].public_inputs, + key_hash, + ); + + for j in 0..SHA256_HASH_SIZE { + nodes[i][j] = node_proofs[i].public_inputs[j + SHA256_HASH_SIZE] as u8; + } + + owned_amount += node_proofs[i].public_inputs[64] as u64; + } else { + nodes[i] = [0; 32]; + } + } + + let mut const_message = [0; 32]; + for i in 0..32 { + const_message[i] = node_proofs[0].public_inputs[i] as u8; + } + + ( + const_message, merkle_root::(nodes, finalize_mr), + owned_amount, + ) +} diff --git a/circuits/crates/blocks/Nargo.toml b/circuits/crates/blocks/Nargo.toml index 1ccd468..d02f85f 100644 --- a/circuits/crates/blocks/Nargo.toml +++ b/circuits/crates/blocks/Nargo.toml @@ -4,6 +4,6 @@ type = "lib" authors = ["Distributed Lab"] [dependencies] -sha256 = { tag = "v0.1.0", git = "https://github.com/noir-lang/sha256" } -bignum = { tag = "v0.7.1", git = "https://github.com/noir-lang/noir-bignum" } +sha256 = { tag = "v0.2.1", git = "https://github.com/noir-lang/sha256" } +bignum = { tag = "v0.8.0", git = "https://github.com/noir-lang/noir-bignum" } convert = { path = "../utils" } diff --git a/circuits/crates/bvm/Nargo.toml b/circuits/crates/bvm/Nargo.toml index ff37284..c9e5564 100644 --- a/circuits/crates/bvm/Nargo.toml +++ b/circuits/crates/bvm/Nargo.toml @@ -6,8 +6,8 @@ authors = ["Distributed Lab"] [dependencies] utils = { path = "../utils" } sign = { path = "../sign" } -ripemd160 = { tag = "v0.0.3", git = "https://github.com/distributed-lab/noir-ripemd160" } -sha1 = { tag = "v0.1.0", git = "https://github.com/zac-williamson/sha1" } -sha256 = { tag = "v0.1.0", git = "https://github.com/noir-lang/sha256" } +ripemd160 = { tag = "v0.0.4", git = "https://github.com/distributed-lab/noir-ripemd160" } +sha1 = { tag = "v0.11", git = "https://github.com/zac-williamson/sha1" } +sha256 = { tag = "v0.2.1", git = "https://github.com/noir-lang/sha256" } crypto = { path = "../../crates/crypto" } -bignum = { tag = "v0.7.1", git = "https://github.com/noir-lang/noir-bignum" } \ No newline at end of file +bignum = { tag = "v0.8.0", git = "https://github.com/noir-lang/noir-bignum" } \ No newline at end of file diff --git a/circuits/crates/bvm/src/stack.nr b/circuits/crates/bvm/src/stack.nr index 8fcef99..04890fa 100644 --- a/circuits/crates/bvm/src/stack.nr +++ b/circuits/crates/bvm/src/stack.nr @@ -593,14 +593,14 @@ impl> 22) & 1) == ((num >> 22) & 1); @@ -1183,7 +1183,7 @@ impl(address); diff --git a/circuits/crates/crypto/Nargo.toml b/circuits/crates/crypto/Nargo.toml index 4cdc932..9d4d8a8 100644 --- a/circuits/crates/crypto/Nargo.toml +++ b/circuits/crates/crypto/Nargo.toml @@ -4,9 +4,9 @@ type = "lib" authors = ["Distributed Lab"] [dependencies] -bignum = { tag = "v0.7.1", git = "https://github.com/noir-lang/noir-bignum" } -bignum2 = {tag = "v0.7.3-2", git = "https://github.com/zkpassport/noir-bignum"} +bignum = { tag = "v0.8.0", git = "https://github.com/noir-lang/noir-bignum" } +bignum2 = {tag = "v0.8.0-2", git = "https://github.com/zkpassport/noir-bignum"} utils = { path = "../utils" } -noir_ecdsa = { tag = "v0.2.7", git = "https://github.com/zkpassport/noir-ecdsa" } -bigcurve = {tag = "v0.9.0-1", git = "https://github.com/zkpassport/noir_bigcurve"} -sha256 = { tag = "v0.1.0", git = "https://github.com/noir-lang/sha256" } \ No newline at end of file +noir_ecdsa = { tag = "v0.2.9", git = "https://github.com/zkpassport/noir-ecdsa" } +bigcurve = {tag = "v0.11.0-1", git = "https://github.com/zkpassport/noir_bigcurve"} +sha256 = { tag = "v0.2.1", git = "https://github.com/noir-lang/sha256" } \ No newline at end of file diff --git a/circuits/crates/script/Nargo.toml b/circuits/crates/script/Nargo.toml index bbb1811..044cfac 100644 --- a/circuits/crates/script/Nargo.toml +++ b/circuits/crates/script/Nargo.toml @@ -4,8 +4,8 @@ type = "lib" authors = ["Distributed Lab"] [dependencies] -sha256 = { tag = "v0.1.0", git = "https://github.com/noir-lang/sha256" } -ripemd160 = { tag = "v0.0.3", git = "https://github.com/distributed-lab/noir-ripemd160" } +sha256 = { tag = "v0.2.1", git = "https://github.com/noir-lang/sha256" } +ripemd160 = { tag = "v0.0.4", git = "https://github.com/distributed-lab/noir-ripemd160" } utils = { path = "../utils" } bvm = { path = "../bvm" } sign = { path = "../sign" } \ No newline at end of file diff --git a/circuits/crates/sign/Nargo.toml b/circuits/crates/sign/Nargo.toml index 41b269c..4d5bb6a 100644 --- a/circuits/crates/sign/Nargo.toml +++ b/circuits/crates/sign/Nargo.toml @@ -5,6 +5,7 @@ authors = ["Distributed Lab"] [dependencies] utils = { path = "../utils" } -sha256 = { tag = "v0.1.0", git = "https://github.com/noir-lang/sha256" } -bignum = { tag = "v0.7.1", git = "https://github.com/noir-lang/noir-bignum" } -crypto = { path = "../../crates/crypto" } \ No newline at end of file +sha256 = { tag = "v0.2.1", git = "https://github.com/noir-lang/sha256" } +bignum = { tag = "v0.8.0", git = "https://github.com/noir-lang/noir-bignum" } +crypto = { path = "../../crates/crypto" } +poseidon = { tag = "v0.1.1", git = "https://github.com/noir-lang/poseidon" } \ No newline at end of file diff --git a/circuits/crates/sign/src/compact_size.nr b/circuits/crates/sign/src/compact_size.nr index 7e5d66a..2170992 100644 --- a/circuits/crates/sign/src/compact_size.nr +++ b/circuits/crates/sign/src/compact_size.nr @@ -6,11 +6,11 @@ pub fn compact_size_to_u32(data: [u8; N], position: PositionField) - result = data[position.offset] as u32; } else if position.size == 3 { for i in 1..3 { - result += data[position.offset + i] as u32 << (8 * (i - 1) as u8); + result += data[position.offset + i] as u32 << (8 * (i - 1)); } } else if position.size == 5 { for i in 1..5 { - result += data[position.offset + i] as u32 << (8 * (i - 1) as u8); + result += data[position.offset + i] as u32 << (8 * (i - 1) as u32); } } else if position.size == 9 { assert(false, "Compact size type FF is not supported"); diff --git a/circuits/crates/sign/src/segwit.nr b/circuits/crates/sign/src/segwit.nr index d52255a..260f568 100644 --- a/circuits/crates/sign/src/segwit.nr +++ b/circuits/crates/sign/src/segwit.nr @@ -1,5 +1,4 @@ -use crate::legacy::Transaction; -use super::sig_types::{SIGHASH_ALL, SIGHASH_ANYONECANPAY, SIGHASH_NONE, SIGHASH_SINGLE}; +use super::transaction::Transaction; use utils::convert::{bytes_to_hex, hex_to_bytes}; fn prepare_preimage_hash_for_sighash_all( diff --git a/circuits/crates/sign/src/transaction.nr b/circuits/crates/sign/src/transaction.nr index 74c3044..957a24a 100644 --- a/circuits/crates/sign/src/transaction.nr +++ b/circuits/crates/sign/src/transaction.nr @@ -1,9 +1,9 @@ +use poseidon::poseidon2::Poseidon2Hasher; use std::collections::map::HashMap; use std::hash::BuildHasherDefault; -use std::hash::poseidon2::Poseidon2Hasher; use crate::compact_size; -use utils::convert::{bytes_to_hex, hex_to_bytes, reverse_bytes}; +use utils::convert::{bytes_to_hex, hex_to_bytes}; pub struct PositionField { pub offset: u32, @@ -162,8 +162,8 @@ impl> = - HashMap::default(); + let mut items: HashMap> + = HashMap::default(); assert(stack_size_u32 <= MAX_WITNESS_STACK_SIZE); for j in 0..MAX_WITNESS_STACK_SIZE { diff --git a/circuits/crates/utils/Nargo.toml b/circuits/crates/utils/Nargo.toml index 994ddcf..c394c43 100644 --- a/circuits/crates/utils/Nargo.toml +++ b/circuits/crates/utils/Nargo.toml @@ -4,5 +4,5 @@ type = "lib" authors = ["Distributed Lab"] [dependencies] -bignum = { tag = "v0.7.1", git = "https://github.com/noir-lang/noir-bignum" } -sha256 = { tag = "v0.1.0", git = "https://github.com/noir-lang/sha256" } \ No newline at end of file +bignum = { tag = "v0.8.0", git = "https://github.com/noir-lang/noir-bignum" } +sha256 = { tag = "v0.2.1", git = "https://github.com/noir-lang/sha256" } \ No newline at end of file diff --git a/circuits/crates/utils/src/convert.nr b/circuits/crates/utils/src/convert.nr index 48bc8e2..17928d6 100644 --- a/circuits/crates/utils/src/convert.nr +++ b/circuits/crates/utils/src/convert.nr @@ -100,7 +100,7 @@ pub fn vec_to_i32( le_bytes_to_i32(result) } -pub fn i32_to_vec( +pub fn i32_to_vec( number: i32, ) -> BoundedVec { let bytes = i32_to_le_bytes(number); @@ -147,7 +147,7 @@ pub fn le_bytes_to_u32(bytes: [u8; 4]) -> u32 { result } -pub fn u32_to_vec( +pub fn u32_to_vec( number: u32, ) -> BoundedVec { let bytes = u32_to_le_bytes(number); diff --git a/circuits/crates/utils/src/encode.nr b/circuits/crates/utils/src/encode.nr index 5825942..0aba0d3 100644 --- a/circuits/crates/utils/src/encode.nr +++ b/circuits/crates/utils/src/encode.nr @@ -22,7 +22,7 @@ pub fn encode_base58(ripemd: [u8; 20]) -> str { for i in 0..LEN { quotient = divided.udiv(divider); remainder = divided - quotient.mul(divider); - res[LEN - i - 1] = base58[remainder.get_limb(0)]; + res[LEN - i - 1] = base58[remainder.get_limb(0) as u32]; divided = quotient; } @@ -73,7 +73,7 @@ pub fn encode_bech32m(value: [u8; 32]) -> str<62> { } for i in 0..58 { - res[i] = bech32m[res[i]]; + res[i] = bech32m[res[i] as u32]; } "bc1p".as_bytes().as_slice().append(res).as_array().as_str_unchecked() @@ -99,7 +99,7 @@ fn bits_5_to_num(value: [u1]) -> u8 { let mut res = 0; for i in 0..5 { - res += (value[i] as u8 << (4 - i)); + res += (value[i] as u8 << (4 - i) as u8); } res diff --git a/circuits/crates/utils/src/lib.nr b/circuits/crates/utils/src/lib.nr index 536d348..2cb98b7 100644 --- a/circuits/crates/utils/src/lib.nr +++ b/circuits/crates/utils/src/lib.nr @@ -1,3 +1,4 @@ pub mod convert; pub mod encode; pub mod decode; +pub mod merkle_root; diff --git a/circuits/crates/utils/src/merkle_root.nr b/circuits/crates/utils/src/merkle_root.nr new file mode 100644 index 0000000..a74e1bf --- /dev/null +++ b/circuits/crates/utils/src/merkle_root.nr @@ -0,0 +1,58 @@ +use std::cmp::max; + +fn hash(leaf1: [u8; 32], leaf2: [u8; 32]) -> [u8; 32] { + sha256::digest(leaf1.as_slice().append(leaf2).as_array::<64>()) +} + +pub fn merkle_root( + mut leafs: [[u8; 32]; N], + finalize_mr: bool, +) -> [u8; 32] { + assert((N as Field).lt(2.pow_32(MAX_MERKLE_TREE_LEVELS as Field))); + let mut mtree = [[0; 32]; MAX_MERKLE_TREE_LEVELS]; + let mut last_level = 0; + + for i in 0..N { + let mut leaf = leafs[i]; + for j in 0..MAX_MERKLE_TREE_LEVELS { + if !leaf.all(|e| e == 0) { + if mtree[j].all(|e| e == 0) { + mtree[j] = leaf; + leaf = [0; 32]; + } else { + leaf = hash(mtree[j], leaf); + mtree[j] = [0; 32]; + } + last_level = max(j, last_level); + } + } + } + + let mut tmp_node = [0; 32]; + for i in 0..(MAX_MERKLE_TREE_LEVELS - 1) { + if ( + (i < last_level & tmp_node.all(|e| e == 0)) + | (i <= last_level & !tmp_node.all(|e| e == 0)) + ) + | finalize_mr { + if !mtree[i].all(|e| e == 0) { + let right = if tmp_node.all(|e| e == 0) { + mtree[i] + } else { + tmp_node + }; + + tmp_node = hash(mtree[i], right); + mtree[i] = [0; 32]; + } else if !tmp_node.all(|e| e == 0) { + tmp_node = hash(tmp_node, tmp_node); + } + } + } + + if tmp_node.all(|e| e == 0) { + mtree[last_level] + } else { + tmp_node + } +} diff --git a/utxo_indexer/Cargo.toml b/utxo_indexer/Cargo.toml index 85511dd..e76ec55 100644 --- a/utxo_indexer/Cargo.toml +++ b/utxo_indexer/Cargo.toml @@ -1,3 +1,3 @@ [workspace] resolver = "3" -members = ["indexer", "utxo_test_data_generator"] +members = ["indexer", "proof_of_reserve", "utxo_test_data_generator"] diff --git a/utxo_indexer/proof_of_reserve/Cargo.toml b/utxo_indexer/proof_of_reserve/Cargo.toml new file mode 100644 index 0000000..9f29f94 --- /dev/null +++ b/utxo_indexer/proof_of_reserve/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "proof_of_reserve" +version = "0.1.0" +edition = "2024" + +[dependencies] +utxo_test_data_generator = { path = "../utxo_test_data_generator" } +indexer = { path = "../indexer" } +anyhow = "1.0.99" +toml = "0.9.8" +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0.145" +hex = "0.4" +sha2 = "0.10.9" +tokio = { version = "1.48.0", features = ["full"] } +futures = "0.3.31" +bitcoin = "0.32.7" +clap = { version = "4.5.51", features = ["derive"] } +k256 = { version = "0.11", features = ["ecdsa"] } \ No newline at end of file diff --git a/utxo_indexer/proof_of_reserve/own_example.json b/utxo_indexer/proof_of_reserve/own_example.json new file mode 100644 index 0000000..c0c0146 --- /dev/null +++ b/utxo_indexer/proof_of_reserve/own_example.json @@ -0,0 +1,7 @@ +[ + { + "script_pub_key": "76a914f0f95be137ece93262b4e24ee1313748300226dd88ac", + "witness": "304402206d43a2ec9ad3b749d7837424c5899e0b479236b4c2154ac4c225aada7edc083102204c61596dfcdb27545673b64245dcc2d5b5e03a8df3a3309341f63bd66e088dc9", + "pub_key": "03f0609c81a45f8cab67fc2d050c21b1acd3d37c7acfd54041be6601ab4cef4f31" + } +] \ No newline at end of file diff --git a/utxo_indexer/proof_of_reserve/src/cli.rs b/utxo_indexer/proof_of_reserve/src/cli.rs new file mode 100644 index 0000000..00b8896 --- /dev/null +++ b/utxo_indexer/proof_of_reserve/src/cli.rs @@ -0,0 +1,39 @@ +use clap::{Parser, Subcommand}; + +#[derive(Parser)] +#[command(version, about = "Builds UTXO index", long_about = None)] +pub struct Cli { + #[command(subcommand)] + pub command: Commands, +} + +#[derive(Subcommand)] +pub enum Commands { + /// Use test UTXOs + Test { + /// Amount of test UTXOs + #[arg(short, long)] + amount: u32, + }, + /// Use UTXOs from file + FromIndexer { + /// Path to the UTXO index file + #[arg(short, long)] + utxo_index_path: String, + /// Message that was signed + #[arg(short, long)] + message: String, + /// Path to json that contains owned utxos (see example in ./proof_of_reserve/own_example.json) + #[arg(short, long)] + own_otxo_path: String, + }, + /// Create DER signature of message using private key + Sign { + /// Private key to sign the message (hex without "0x") + #[arg(short, long)] + private_key: String, + /// Message that will be signed + #[arg(short, long)] + message: String, + }, +} diff --git a/utxo_indexer/proof_of_reserve/src/generate_tomls.rs b/utxo_indexer/proof_of_reserve/src/generate_tomls.rs new file mode 100644 index 0000000..c287594 --- /dev/null +++ b/utxo_indexer/proof_of_reserve/src/generate_tomls.rs @@ -0,0 +1,201 @@ +use std::{ + fs::{self, File}, + io::Write, +}; + +use anyhow::Result; +use serde::{Deserialize, Serialize}; +use utxo_test_data_generator::test_data_gen::Utxo; + +use crate::{MAX_COINS_DATABASE_AMOUNT, MAX_NODES_AMOUNT}; + +#[derive(Serialize, Deserialize, Clone)] +struct CoinsDatabaseElement { + script_pub_key: Vec, + amount: u64, +} + +#[derive(Serialize, Deserialize, Clone)] +struct Spending { + witness: Vec, // 72 bytes + pub_key: Vec, // 65 bytes +} + +#[derive(Serialize, Deserialize)] +struct LeafsToml { + const_message_hash: Vec, + coins_database: Vec, + own_utxos: Vec, + finalize_mr: bool, +} + +#[derive(Serialize, Deserialize)] +struct NodeProof { + proof: Vec, + public_inputs: Vec, +} + +#[derive(Serialize, Deserialize)] +struct NodeToml { + verification_key: Vec, + key_hash: String, + node_proofs: Vec, + finalize_mr: bool, +} + +pub fn leafs_tomls(utxos: &[Utxo], message_hash: &[u8; 32]) -> Result<()> { + let mut coins_database: Vec = utxos + .into_iter() + .map(|e| { + Ok(CoinsDatabaseElement { + script_pub_key: hex::decode(&e.script_pub_key)?, + amount: e.amount, + }) + }) + .collect::>>()?; + + let append_from = coins_database.len(); + let append_to = ((coins_database.len() + MAX_COINS_DATABASE_AMOUNT - 1) + / MAX_COINS_DATABASE_AMOUNT) + * MAX_COINS_DATABASE_AMOUNT; + + for _ in append_from..append_to { + coins_database.push(CoinsDatabaseElement { + script_pub_key: Vec::from([0; 25]), + amount: 0, + }); + } + + let mut own_utxos: Vec = utxos + .into_iter() + .map(|e| { + let mut witness = hex::decode(&e.witness)?; + if witness.len() < 72 { + witness.resize(72, 0); + } + + let mut pub_key = Vec::from(hex::decode(&e.pub_key)?); + if pub_key.len() < 65 { + pub_key.resize(65, 0); + } + + Ok(Spending { + witness, + pub_key: pub_key, + }) + }) + .collect::>>()?; + + let append_from = own_utxos.len(); + + for _ in append_from..append_to { + own_utxos.push(Spending { + witness: Vec::from([0; 72]), + pub_key: Vec::from([0; 65]), + }); + } + + let chunks = append_to / MAX_COINS_DATABASE_AMOUNT; + + for i in 0..chunks { + let toml_struct = LeafsToml { + const_message_hash: Vec::from(message_hash), + coins_database: coins_database + [(i * MAX_COINS_DATABASE_AMOUNT)..((i + 1) * MAX_COINS_DATABASE_AMOUNT)] + .to_vec(), + own_utxos: own_utxos + [(i * MAX_COINS_DATABASE_AMOUNT)..((i + 1) * MAX_COINS_DATABASE_AMOUNT)] + .to_vec(), + finalize_mr: i != 0, + }; + + let mut file = File::create(format!( + "../circuits/app/proof_of_reserve/coins/provers/Prover{}.toml", + i + 1 + ))?; + file.write(toml::to_string(&toml_struct)?.as_bytes())?; + } + + Ok(()) +} + +pub fn tree_tomls( + nodes: usize, + vk_path: String, + proof_path: String, + proof_level: usize, + prover_level: usize, +) -> Result<()> { + let chunks = (nodes + MAX_NODES_AMOUNT - 1) / MAX_NODES_AMOUNT; + + let vk = fs::read(vk_path.clone() + "/vk")?; + let vk_hash = fs::read(vk_path + "/vk_hash")?; + + let mut vk_strings: Vec = Vec::with_capacity(115); + for byte in vk.chunks(32) { + vk_strings.push("0x".to_owned() + &hex::encode(byte)); + } + + let key_hash = "0x".to_owned() + &hex::encode(&vk_hash); + let zero_string = format!("0x{}", "0".repeat(64)); + let zero_proof = vec![zero_string.clone(); 508]; + let zero_pi = vec![zero_string; 65]; + + for i in 0..chunks { + let mut node_proofs = Vec::new(); + for j in 0..MAX_NODES_AMOUNT { + if i * MAX_NODES_AMOUNT + j + 1 > nodes { + node_proofs.push(NodeProof { + proof: zero_proof.clone(), + public_inputs: zero_pi.clone(), + }); + continue; + } + + let proof = fs::read(format!( + "{}/proof_{}_{}/proof", + proof_path, + proof_level, + i * MAX_NODES_AMOUNT + j + 1 + ))?; + let pi = fs::read(format!( + "{}/proof_{}_{}/public_inputs", + proof_path, + proof_level, + i * MAX_NODES_AMOUNT + j + 1 + ))?; + + let mut proof_strings: Vec = Vec::with_capacity(508); + let mut pi_strings: Vec = Vec::with_capacity(65); + + for byte in proof.chunks(32) { + proof_strings.push("0x".to_owned() + &hex::encode(byte)); + } + + for byte in pi.chunks(32) { + pi_strings.push("0x".to_owned() + &hex::encode(byte)); + } + + node_proofs.push(NodeProof { + proof: proof_strings, + public_inputs: pi_strings, + }); + } + + let node_toml = NodeToml { + verification_key: vk_strings.clone(), + key_hash: key_hash.clone(), + node_proofs, + finalize_mr: i != 0, + }; + + let mut file = File::create(format!( + "../circuits/app/proof_of_reserve/utxos_tree/provers/Prover_{}_{}.toml", + prover_level, + i + 1 + ))?; + file.write(toml::to_string(&node_toml)?.as_bytes())?; + } + + Ok(()) +} diff --git a/utxo_indexer/proof_of_reserve/src/main.rs b/utxo_indexer/proof_of_reserve/src/main.rs new file mode 100644 index 0000000..67f67fd --- /dev/null +++ b/utxo_indexer/proof_of_reserve/src/main.rs @@ -0,0 +1,195 @@ +use std::{ + collections::HashMap, + fs::File, + io::{Read, Write}, +}; + +use anyhow::Result; +use bitcoin::hashes::{Hash, sha256}; +use clap::Parser; +use indexer::load_utxos; +use k256::ecdsa::{Signature, SigningKey, signature::SignerMut}; +use serde::Deserialize; +use sha2::{Digest, Sha256}; +use utxo_test_data_generator::test_data_gen::{Utxo, generate_test_utxos}; + +use crate::{ + generate_tomls::leafs_tomls, + proofs::{prove_leafs, prove_nodes}, +}; + +mod cli; +mod generate_tomls; +mod proofs; + +pub const MAX_COINS_DATABASE_AMOUNT: usize = 8; +pub const MAX_NODES_AMOUNT: usize = 8; +pub const MAX_ASYNC_TASKS: usize = 2; + +pub const P2PKH_UTXO_SIZE: usize = 8 + 25; // 8 bytes for amount, 25 bytes for P2PKH scriptPubKey + +const TEST_MESSAGE: &str = "Test message"; + +#[derive(Debug, Deserialize)] +struct OwnItem { + script_pub_key: String, + witness: String, + pub_key: String, +} + +#[tokio::main] +async fn main() { + let cli = cli::Cli::parse(); + + let (utxos, message) = match &cli.command { + cli::Commands::Test { amount } => (test_utxos(*amount).unwrap(), TEST_MESSAGE), + cli::Commands::FromIndexer { + utxo_index_path, + message, + own_otxo_path, + } => ( + from_indexer(utxo_index_path.as_str(), own_otxo_path.as_str()).unwrap(), + message.as_str(), + ), + cli::Commands::Sign { + private_key, + message, + } => { + let sign = sign_message( + hex::decode(private_key).unwrap().as_ref(), + message.as_bytes(), + ) + .unwrap(); + + println!("Signature: {}", hex::encode(sign)); + return; + } + }; + + let message_hash = Sha256::digest(message); + + let rounded_leafs = (utxos.len() + MAX_COINS_DATABASE_AMOUNT - 1) / MAX_COINS_DATABASE_AMOUNT; + + write_consts().unwrap(); + + //run first proof + leafs_tomls(utxos.as_ref(), message_hash.as_ref()).unwrap(); + prove_leafs(rounded_leafs).await.unwrap(); + + // run second proof + let (mr, amount) = prove_nodes(rounded_leafs).await.unwrap(); + + println!("Merkle root: {}, Amount: {}", mr, amount); + get_merkle_root(utxos.as_ref()); +} + +fn sign_message(priv_key: &[u8], message: &[u8]) -> Result> { + let mut sign_key = SigningKey::from_bytes(priv_key)?; + let signature: Signature = sign_key.sign(message); + let normalized = signature.normalize_s().unwrap_or(signature).to_der(); + Ok(Vec::from(normalized.as_bytes())) +} + +fn from_indexer(utxo_index_path: &str, own_otxo_path: &str) -> Result> { + let mut file = File::open(own_otxo_path).unwrap(); + let mut own_string: String = Default::default(); + file.read_to_string(&mut own_string).unwrap(); + let owned: Vec = serde_json::from_str(&own_string).unwrap(); + let owned: HashMap = owned + .into_iter() + .map(|e| (e.script_pub_key, (e.witness, e.pub_key))) + .collect(); + + let utxos_bytes = load_utxos(utxo_index_path).unwrap(); + Ok(bytes_to_utxos(utxos_bytes.as_ref(), owned)?) +} + +fn bytes_to_utxos( + utxos_bytes: &[[u8; P2PKH_UTXO_SIZE]], + owned: HashMap, +) -> Result> { + let mut res = Vec::with_capacity(utxos_bytes.len()); + + for i in 0..utxos_bytes.len() { + let spk = hex::encode(&utxos_bytes[i][8..33]); + + let own = owned.get(&spk); + let (witness, pub_key) = match own { + Some(e) => (e.0.clone(), e.1.clone()), + None => ("".to_string(), "".to_string()), + }; + + res.push(Utxo { + amount: u64::from_le_bytes(utxos_bytes[i][0..8].try_into()?), + script_pub_key: spk, + witness, + pub_key, + }); + } + + Ok(res) +} + +fn test_utxos(amount: u32) -> Result> { + let priv_key = [1; 32]; + Ok(generate_test_utxos( + amount, + TEST_MESSAGE.as_bytes(), + &priv_key, + )?) +} + +fn get_merkle_root(utxos: &[Utxo]) { + let mut hashes = Vec::new(); + + for i in utxos { + let mut data = i.amount.to_le_bytes().to_vec(); + data.append(&mut hex::decode(i.script_pub_key.clone()).unwrap()); + + let hash = Sha256::digest(data); + hashes.push(hash.to_vec()); + } + + let hashes: Vec = hashes + .into_iter() + .map(|h| sha256::Hash::from_slice(&h).unwrap()) + .collect(); + + let merkle_root = bitcoin::merkle_tree::calculate_root(hashes.iter().cloned()).unwrap(); + println!("Expected merkle root: {merkle_root}"); +} + +fn write_consts() -> Result<()> { + let mut file = File::create("../circuits/app/proof_of_reserve/coins/src/constants.nr")?; + + let consts = format!( + "pub global MAX_COINS_DATABASE_AMOUNT: u32 = {}; +pub global MAX_MERKLE_TREE_LEVELS: u32 = {}; + +pub global SHA256_HASH_SIZE: u32 = 32; +pub global RIPEMD160_HASH_SIZE: u32 = 20; +", + MAX_COINS_DATABASE_AMOUNT, + ((MAX_COINS_DATABASE_AMOUNT as f64).log2()).ceil() as u64 + 1 + ); + + file.write(consts.as_bytes())?; + + let mut file = File::create("../circuits/app/proof_of_reserve/utxos_tree/src/constants.nr")?; + + let consts = format!( + "pub global MAX_MERKLE_TREE_LEVELS: u32 = {}; +pub global MAX_NODES_AMOUNT: u32 = {}; + +pub global PUBLIC_INPUTS_SIZE: u32 = 65; + +pub global SHA256_HASH_SIZE: u32 = 32; +", + ((MAX_NODES_AMOUNT as f64).log2()).ceil() as u64 + 1, + MAX_NODES_AMOUNT + ); + + file.write(consts.as_bytes())?; + + Ok(()) +} diff --git a/utxo_indexer/proof_of_reserve/src/proofs.rs b/utxo_indexer/proof_of_reserve/src/proofs.rs new file mode 100644 index 0000000..beb6bbc --- /dev/null +++ b/utxo_indexer/proof_of_reserve/src/proofs.rs @@ -0,0 +1,190 @@ +use std::{fs, process::Command, sync::Arc}; + +use anyhow::{Ok, Result}; +use futures::future::join_all; +use tokio::sync::Semaphore; + +use crate::{MAX_ASYNC_TASKS, MAX_NODES_AMOUNT, generate_tomls::tree_tomls}; + +pub async fn prove_leafs(chunks: usize) -> Result<()> { + let status = Command::new("bash") + .arg("-c") + .arg("nargo compile") + .current_dir("../circuits/app/proof_of_reserve/coins") + .status() + .expect("failed to execute command"); + + assert!(status.success(), "Command return non-zero status"); + + fs::create_dir_all("../circuits/target/vk/leafs")?; + fs::create_dir_all("../circuits/target/vk/tree")?; + + let status = Command::new("bash") + .arg("-c") + .arg("bb write_vk -b ../../../target/coins.json -o ../../../target/vk/leafs") + .current_dir("../circuits/app/proof_of_reserve/coins") + .status() + .expect("failed to execute command"); + + assert!(status.success(), "Command return non-zero status"); + + fs::create_dir_all("../circuits/target/coins")?; + + // Async + let semaphore = Arc::new(Semaphore::new(MAX_ASYNC_TASKS)); + let mut tasks = Vec::new(); + + for i in 0..chunks { + let permit = semaphore.clone().acquire_owned().await?; + + let task = tokio::spawn(async move { + let status = Command::new("bash") + .arg("-c") + .arg(format!( + "nargo execute -p ./provers/Prover{}.toml ./coins/witness/coins{}.gz", + i + 1, + i + 1, + )) + .current_dir("../circuits/app/proof_of_reserve/coins") + .status() + .expect("failed to execute command"); + + assert!(status.success(), "Command return non-zero status"); + + let status = Command::new("bash") + .arg("-c") + .arg(format!("bb prove -b ../../../target/coins.json -w ../../../target/coins/witness/coins{}.gz -o ../../../target/coins/proofs/proof_0_{} -k ../../../target/vk/leafs/vk", i + 1, i + 1)) + .current_dir("../circuits/app/proof_of_reserve/coins") + .status() + .expect("failed to execute command"); + + assert!(status.success(), "Command return non-zero status"); + + drop(permit); + }); + + tasks.push(task); + } + + join_all(tasks).await; + Ok(()) +} + +pub async fn prove_nodes(mut chunks: usize) -> Result<(String, u64)> { + if chunks == 1 { + // Get output data + let pi = fs::read("../circuits/target/coins/proofs/proof_0_1/public_inputs")?; + + let mut idx = 1055; + + let mut mr = [0; 32]; + for i in 0..32 { + mr[i] = pi[idx]; + idx += 32; + } + + let mut amount = [0; 8]; + for i in 0..8 { + amount[i] = pi[idx - (7 - i)]; + } + + return Ok((hex::encode(mr), u64::from_be_bytes(amount))); + } + + let status = Command::new("bash") + .arg("-c") + .arg("nargo compile") + .current_dir("../circuits/app/proof_of_reserve/utxos_tree") + .status() + .expect("failed to execute command"); + + assert!(status.success(), "Command return non-zero status"); + + let status = Command::new("bash") + .arg("-c") + .arg("bb write_vk -b ../../../target/utxos_tree.json -o ../../../target/vk/tree") + .current_dir("../circuits/app/proof_of_reserve/utxos_tree") + .status() + .expect("failed to execute command"); + + assert!(status.success(), "Command return non-zero status"); + + tree_tomls( + chunks, + "../circuits/target/vk/leafs".to_string(), + "../circuits/target/coins/proofs".to_string(), + 0, + 0, + )?; + + // Async + let semaphore = Arc::new(Semaphore::new(MAX_ASYNC_TASKS)); + + let mut i = 0; + loop { + let mut tasks = Vec::new(); + chunks = (chunks + MAX_NODES_AMOUNT - 1) / MAX_NODES_AMOUNT; + for j in 0..chunks { + let permit = semaphore.clone().acquire_owned().await?; + + let task = tokio::spawn(async move { + let status = Command::new("bash") + .arg("-c") + .arg(format!("nargo execute -p ./provers/Prover_{}_{}.toml ./tree/witness/utxos_tree_{}_{}.gz", i, j + 1, i, j + 1)) + .current_dir("../circuits/app/proof_of_reserve/utxos_tree") + .status() + .expect("failed to execute command"); + + assert!(status.success(), "Command return non-zero status"); + + let status = Command::new("bash") + .arg("-c") + .arg(format!("bb prove -b ../../../target/utxos_tree.json -w ../../../target/tree/witness/utxos_tree_{}_{}.gz -o ../../../target/tree/proofs/proof_{}_{} -k ../../../target/vk/tree/vk", i, j + 1, i, j + 1)) + .current_dir("../circuits/app/proof_of_reserve/utxos_tree") + .status() + .expect("failed to execute command"); + + assert!(status.success(), "Command return non-zero status"); + drop(permit); + }); + + tasks.push(task); + } + + join_all(tasks).await; + + if chunks <= 1 { + break; + } + + tree_tomls( + chunks, + "../circuits/target/vk/tree".to_string(), + "../circuits/target/tree/proofs".to_string(), + i, + i + 1, + )?; + i += 1; + } + + // Get output data + let pi = fs::read(format!( + "../circuits/target/tree/proofs/proof_{}_1/public_inputs", + i + ))?; + + let mut idx = 1055; + + let mut mr = [0; 32]; + for i in 0..32 { + mr[i] = pi[idx]; + idx += 32; + } + + let mut amount = [0; 8]; + for i in 0..8 { + amount[i] = pi[idx - (7 - i)]; + } + + Ok((hex::encode(mr), u64::from_be_bytes(amount))) +} diff --git a/utxo_indexer/utxo_test_data_generator/src/lib.rs b/utxo_indexer/utxo_test_data_generator/src/lib.rs index 844a22b..275d176 100644 --- a/utxo_indexer/utxo_test_data_generator/src/lib.rs +++ b/utxo_indexer/utxo_test_data_generator/src/lib.rs @@ -1 +1 @@ -mod test_data_gen; +pub mod test_data_gen; diff --git a/utxo_indexer/utxo_test_data_generator/src/test_data_gen.rs b/utxo_indexer/utxo_test_data_generator/src/test_data_gen.rs index ee7f210..afeca43 100644 --- a/utxo_indexer/utxo_test_data_generator/src/test_data_gen.rs +++ b/utxo_indexer/utxo_test_data_generator/src/test_data_gen.rs @@ -13,11 +13,12 @@ use serde::{Deserialize, Serialize}; use sha2::{Digest, Sha256}; #[allow(dead_code)] -#[derive(Serialize, Deserialize)] -pub struct TestUtxo { +#[derive(Serialize, Deserialize, Clone)] +pub struct Utxo { pub amount: u64, pub script_pub_key: String, pub witness: String, + pub pub_key: String, } #[allow(dead_code)] @@ -25,9 +26,9 @@ pub fn generate_test_utxos( utxos_amount: u32, message: &[u8], priv_key: &[u8; 32], -) -> Result> { +) -> Result> { let mut rng = rand::rng(); - let mut res: Vec = Vec::with_capacity(utxos_amount as usize); + let mut res: Vec = Vec::with_capacity(utxos_amount as usize); for _ in 0..utxos_amount { let amount: u64 = rng.random_range(1000..=10000000); @@ -47,10 +48,11 @@ pub fn generate_test_utxos( .push_opcode(OP_EQUALVERIFY) .push_opcode(OP_CHECKSIG); - res.push(TestUtxo { + res.push(Utxo { amount, script_pub_key: hex::encode(script_pub_key.into_bytes()), witness: hex::encode(Vec::from(der_bytes)), + pub_key: hex::encode(pub_key_bytes), }); }