diff --git a/yarn-project/circuits.js/src/structs/constants.ts b/yarn-project/circuits.js/src/structs/constants.ts index d70a4677ce36..04ae597869c0 100644 --- a/yarn-project/circuits.js/src/structs/constants.ts +++ b/yarn-project/circuits.js/src/structs/constants.ts @@ -41,5 +41,7 @@ export const ROLLUP_VK_TREE_HEIGHT = 8; export const FUNCTION_SELECTOR_NUM_BYTES = 4; +export const MAPPING_SLOT_PEDERSEN_SEPARATOR = 4; + // sha256 hash is stored in two fields to accommodate all 256-bits of the hash export const NUM_FIELDS_PER_SHA256 = 2; diff --git a/yarn-project/end-to-end/src/utils.ts b/yarn-project/end-to-end/src/utils.ts index b2f8d9961623..419bc4c19e1c 100644 --- a/yarn-project/end-to-end/src/utils.ts +++ b/yarn-project/end-to-end/src/utils.ts @@ -1,6 +1,7 @@ import { AztecNodeConfig, AztecNodeService, getConfigEnvVars } from '@aztec/aztec-node'; import { DebugLogger, Logger, createDebugLogger } from '@aztec/foundation/log'; import { Fr } from '@aztec/foundation/fields'; +import { MAPPING_SLOT_PEDERSEN_SEPARATOR } from '@aztec/circuits.js'; import { AztecAddress, @@ -244,15 +245,15 @@ export function delay(ms: number): Promise { */ export async function calculateStorageSlot(slot: bigint, key: Fr): Promise { const wasm = await CircuitsWasm.get(); - const balancesStorageSlot = new Fr(slot); // this value is manually set in the Noir contract - const mappingStorageSlot = new Fr(4n); // The pedersen domain separator for storage slot calculations. + const mappingStorageSlot = new Fr(slot); // this value is manually set in the Noir contract + const mappingStorageSlotSeparator = new Fr(BigInt(MAPPING_SLOT_PEDERSEN_SEPARATOR)); // The pedersen domain separator for storage slot calculations. // Based on `at` function in // aztec3-packages/yarn-project/noir-contracts/src/contracts/noir-aztec/src/state_vars/map.nr const storageSlot = Fr.fromBuffer( pedersenPlookupCommitInputs( wasm, - [mappingStorageSlot, balancesStorageSlot, key].map(f => f.toBuffer()), + [mappingStorageSlotSeparator, mappingStorageSlot, key].map(f => f.toBuffer()), ), ); diff --git a/yarn-project/noir-contracts/README.md b/yarn-project/noir-contracts/README.md index 66a0d5f07b43..a6fe89c12eb5 100644 --- a/yarn-project/noir-contracts/README.md +++ b/yarn-project/noir-contracts/README.md @@ -96,7 +96,7 @@ This package contains the source code and the Aztec ABIs for the example contrac compiler_version = "0.7.1" [dependencies] - aztec = { path = "../noir-aztec" } + aztec = { path = "../../libs/noir-aztec" } ``` 4. Replace the content of the generated `example_contract/src/main.nr` file with your contract code. diff --git a/yarn-project/noir-contracts/src/contracts/child_contract/Nargo.toml b/yarn-project/noir-contracts/src/contracts/child_contract/Nargo.toml index 18da6f0da6ad..691c443b4625 100644 --- a/yarn-project/noir-contracts/src/contracts/child_contract/Nargo.toml +++ b/yarn-project/noir-contracts/src/contracts/child_contract/Nargo.toml @@ -3,4 +3,4 @@ authors = [""] compiler_version = "0.1" [dependencies] -aztec = { path = "../noir-aztec" } +aztec = { path = "../../libs/noir-aztec" } diff --git a/yarn-project/noir-contracts/src/contracts/ecdsa_account_contract/Nargo.toml b/yarn-project/noir-contracts/src/contracts/ecdsa_account_contract/Nargo.toml index 18da6f0da6ad..691c443b4625 100644 --- a/yarn-project/noir-contracts/src/contracts/ecdsa_account_contract/Nargo.toml +++ b/yarn-project/noir-contracts/src/contracts/ecdsa_account_contract/Nargo.toml @@ -3,4 +3,4 @@ authors = [""] compiler_version = "0.1" [dependencies] -aztec = { path = "../noir-aztec" } +aztec = { path = "../../libs/noir-aztec" } diff --git a/yarn-project/noir-contracts/src/contracts/gullible_account_contract/Nargo.toml b/yarn-project/noir-contracts/src/contracts/gullible_account_contract/Nargo.toml index 18da6f0da6ad..691c443b4625 100644 --- a/yarn-project/noir-contracts/src/contracts/gullible_account_contract/Nargo.toml +++ b/yarn-project/noir-contracts/src/contracts/gullible_account_contract/Nargo.toml @@ -3,4 +3,4 @@ authors = [""] compiler_version = "0.1" [dependencies] -aztec = { path = "../noir-aztec" } +aztec = { path = "../../libs/noir-aztec" } diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/messaging/l1_to_l2_message.nr b/yarn-project/noir-contracts/src/contracts/noir-aztec/src/messaging/l1_to_l2_message.nr deleted file mode 100644 index defff80504a4..000000000000 --- a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/messaging/l1_to_l2_message.nr +++ /dev/null @@ -1,416 +0,0 @@ -use crate::generators; -use crate::types::point::Point; -use crate::messaging::l1_to_l2_message_getter_data::L1ToL2MessageGetterData; -use crate::messaging::l1_to_l2_message_getter_data::make_l1_to_l2_message_getter_data; - - -global L1_TO_L2_MESSAGE_LEN = 8; - -global L1_TO_L2_MESSAGE_ORACLE_CALL_LENGTH = 18; // 8 fields + 8 deep hash path + 1 root + 1 index - -struct L1ToL2Message { - sender: Field, - chainId: Field, - recipient: Field, - version: Field, - content: Field, - secret: Field, - secret_hash: Field, - deadline: u32, - fee: u64, - tree_index: Field -} - -impl L1ToL2Message { - fn dummy() -> L1ToL2Message { - L1ToL2Message { - sender: 0, - chainId: 0, - recipient: 0, - version: 0, - content: 0, - secret: 0, - secret_hash: 0, - deadline: 0 as u32, - fee: 0 as u64, - tree_index: 0 - } - } - - fn deserialize( - fields: [Field; L1_TO_L2_MESSAGE_LEN], - secret: Field, - tree_index: Field - ) -> L1ToL2Message { - - L1ToL2Message { - sender: fields[0], - chainId: fields[1], - recipient: fields[2], - version: fields[3], - content: fields[4], - secret: secret, - secret_hash: fields[5], - deadline: fields[6] as u32, - fee: fields[7] as u64, - tree_index: tree_index - } - } - - fn validate_message_secret(self: Self) { - let recomputed_hash = dep::std::hash::pedersen([generators::MessageSecret, self.secret])[0]; - assert(self.secret_hash == recomputed_hash); - } - - fn message_hash(self: Self) -> Field { - let mut hash_bytes: [u8; 256] = [0; 256]; - let sender_bytes = self.sender.to_be_bytes(32); - let chainId_bytes = self.chainId.to_be_bytes(32); - let recipient_bytes = self.recipient.to_be_bytes(32); - let version_bytes = self.version.to_be_bytes(32); - let content_bytes = self.content.to_be_bytes(32); - let secret_hash_bytes = self.secret_hash.to_be_bytes(32); - let deadline_bytes = (self.deadline as Field).to_be_bytes(32); - let fee_bytes = (self.fee as Field).to_be_bytes(32); - - // Once loops are performant this will be moved into l1 message - // Unroll loops because otherwise takes forever to compile - // for i in range(32): - // print('hash_bytes[{0}] = amount_bytes[{1}];'.format(i, i)) - // for i in range(32): - // print('hash_bytes[{0} + 32] = recipient_bytes[{1}];'.format(i, i)) - hash_bytes[0] = sender_bytes[0]; - hash_bytes[1] = sender_bytes[1]; - hash_bytes[2] = sender_bytes[2]; - hash_bytes[3] = sender_bytes[3]; - hash_bytes[4] = sender_bytes[4]; - hash_bytes[5] = sender_bytes[5]; - hash_bytes[6] = sender_bytes[6]; - hash_bytes[7] = sender_bytes[7]; - hash_bytes[8] = sender_bytes[8]; - hash_bytes[9] = sender_bytes[9]; - hash_bytes[10] = sender_bytes[10]; - hash_bytes[11] = sender_bytes[11]; - hash_bytes[12] = sender_bytes[12]; - hash_bytes[13] = sender_bytes[13]; - hash_bytes[14] = sender_bytes[14]; - hash_bytes[15] = sender_bytes[15]; - hash_bytes[16] = sender_bytes[16]; - hash_bytes[17] = sender_bytes[17]; - hash_bytes[18] = sender_bytes[18]; - hash_bytes[19] = sender_bytes[19]; - hash_bytes[20] = sender_bytes[20]; - hash_bytes[21] = sender_bytes[21]; - hash_bytes[22] = sender_bytes[22]; - hash_bytes[23] = sender_bytes[23]; - hash_bytes[24] = sender_bytes[24]; - hash_bytes[25] = sender_bytes[25]; - hash_bytes[26] = sender_bytes[26]; - hash_bytes[27] = sender_bytes[27]; - hash_bytes[28] = sender_bytes[28]; - hash_bytes[29] = sender_bytes[29]; - hash_bytes[30] = sender_bytes[30]; - hash_bytes[31] = sender_bytes[31]; - - hash_bytes[0 + 32] = chainId_bytes[0]; - hash_bytes[1 + 32] = chainId_bytes[1]; - hash_bytes[2 + 32] = chainId_bytes[2]; - hash_bytes[3 + 32] = chainId_bytes[3]; - hash_bytes[4 + 32] = chainId_bytes[4]; - hash_bytes[5 + 32] = chainId_bytes[5]; - hash_bytes[6 + 32] = chainId_bytes[6]; - hash_bytes[7 + 32] = chainId_bytes[7]; - hash_bytes[8 + 32] = chainId_bytes[8]; - hash_bytes[9 + 32] = chainId_bytes[9]; - hash_bytes[10 + 32] = chainId_bytes[10]; - hash_bytes[11 + 32] = chainId_bytes[11]; - hash_bytes[12 + 32] = chainId_bytes[12]; - hash_bytes[13 + 32] = chainId_bytes[13]; - hash_bytes[14 + 32] = chainId_bytes[14]; - hash_bytes[15 + 32] = chainId_bytes[15]; - hash_bytes[16 + 32] = chainId_bytes[16]; - hash_bytes[17 + 32] = chainId_bytes[17]; - hash_bytes[18 + 32] = chainId_bytes[18]; - hash_bytes[19 + 32] = chainId_bytes[19]; - hash_bytes[20 + 32] = chainId_bytes[20]; - hash_bytes[21 + 32] = chainId_bytes[21]; - hash_bytes[22 + 32] = chainId_bytes[22]; - hash_bytes[23 + 32] = chainId_bytes[23]; - hash_bytes[24 + 32] = chainId_bytes[24]; - hash_bytes[25 + 32] = chainId_bytes[25]; - hash_bytes[26 + 32] = chainId_bytes[26]; - hash_bytes[27 + 32] = chainId_bytes[27]; - hash_bytes[28 + 32] = chainId_bytes[28]; - hash_bytes[29 + 32] = chainId_bytes[29]; - hash_bytes[30 + 32] = chainId_bytes[30]; - hash_bytes[31 + 32] = chainId_bytes[31]; - - hash_bytes[0 + 64] = recipient_bytes[0]; - hash_bytes[1 + 64] = recipient_bytes[1]; - hash_bytes[2 + 64] = recipient_bytes[2]; - hash_bytes[3 + 64] = recipient_bytes[3]; - hash_bytes[4 + 64] = recipient_bytes[4]; - hash_bytes[5 + 64] = recipient_bytes[5]; - hash_bytes[6 + 64] = recipient_bytes[6]; - hash_bytes[7 + 64] = recipient_bytes[7]; - hash_bytes[8 + 64] = recipient_bytes[8]; - hash_bytes[9 + 64] = recipient_bytes[9]; - hash_bytes[10 + 64] = recipient_bytes[10]; - hash_bytes[11 + 64] = recipient_bytes[11]; - hash_bytes[12 + 64] = recipient_bytes[12]; - hash_bytes[13 + 64] = recipient_bytes[13]; - hash_bytes[14 + 64] = recipient_bytes[14]; - hash_bytes[15 + 64] = recipient_bytes[15]; - hash_bytes[16 + 64] = recipient_bytes[16]; - hash_bytes[17 + 64] = recipient_bytes[17]; - hash_bytes[18 + 64] = recipient_bytes[18]; - hash_bytes[19 + 64] = recipient_bytes[19]; - hash_bytes[20 + 64] = recipient_bytes[20]; - hash_bytes[21 + 64] = recipient_bytes[21]; - hash_bytes[22 + 64] = recipient_bytes[22]; - hash_bytes[23 + 64] = recipient_bytes[23]; - hash_bytes[24 + 64] = recipient_bytes[24]; - hash_bytes[25 + 64] = recipient_bytes[25]; - hash_bytes[26 + 64] = recipient_bytes[26]; - hash_bytes[27 + 64] = recipient_bytes[27]; - hash_bytes[28 + 64] = recipient_bytes[28]; - hash_bytes[29 + 64] = recipient_bytes[29]; - hash_bytes[30 + 64] = recipient_bytes[30]; - hash_bytes[31 + 64] = recipient_bytes[31]; - - hash_bytes[0 + 96] = version_bytes[0]; - hash_bytes[1 + 96] = version_bytes[1]; - hash_bytes[2 + 96] = version_bytes[2]; - hash_bytes[3 + 96] = version_bytes[3]; - hash_bytes[4 + 96] = version_bytes[4]; - hash_bytes[5 + 96] = version_bytes[5]; - hash_bytes[6 + 96] = version_bytes[6]; - hash_bytes[7 + 96] = version_bytes[7]; - hash_bytes[8 + 96] = version_bytes[8]; - hash_bytes[9 + 96] = version_bytes[9]; - hash_bytes[10 + 96] = version_bytes[10]; - hash_bytes[11 + 96] = version_bytes[11]; - hash_bytes[12 + 96] = version_bytes[12]; - hash_bytes[13 + 96] = version_bytes[13]; - hash_bytes[14 + 96] = version_bytes[14]; - hash_bytes[15 + 96] = version_bytes[15]; - hash_bytes[16 + 96] = version_bytes[16]; - hash_bytes[17 + 96] = version_bytes[17]; - hash_bytes[18 + 96] = version_bytes[18]; - hash_bytes[19 + 96] = version_bytes[19]; - hash_bytes[20 + 96] = version_bytes[20]; - hash_bytes[21 + 96] = version_bytes[21]; - hash_bytes[22 + 96] = version_bytes[22]; - hash_bytes[23 + 96] = version_bytes[23]; - hash_bytes[24 + 96] = version_bytes[24]; - hash_bytes[25 + 96] = version_bytes[25]; - hash_bytes[26 + 96] = version_bytes[26]; - hash_bytes[27 + 96] = version_bytes[27]; - hash_bytes[28 + 96] = version_bytes[28]; - hash_bytes[29 + 96] = version_bytes[29]; - hash_bytes[30 + 96] = version_bytes[30]; - hash_bytes[31 + 96] = version_bytes[31]; - - hash_bytes[0 + 128] = content_bytes[0]; - hash_bytes[1 + 128] = content_bytes[1]; - hash_bytes[2 + 128] = content_bytes[2]; - hash_bytes[3 + 128] = content_bytes[3]; - hash_bytes[4 + 128] = content_bytes[4]; - hash_bytes[5 + 128] = content_bytes[5]; - hash_bytes[6 + 128] = content_bytes[6]; - hash_bytes[7 + 128] = content_bytes[7]; - hash_bytes[8 + 128] = content_bytes[8]; - hash_bytes[9 + 128] = content_bytes[9]; - hash_bytes[10 + 128] = content_bytes[10]; - hash_bytes[11 + 128] = content_bytes[11]; - hash_bytes[12 + 128] = content_bytes[12]; - hash_bytes[13 + 128] = content_bytes[13]; - hash_bytes[14 + 128] = content_bytes[14]; - hash_bytes[15 + 128] = content_bytes[15]; - hash_bytes[16 + 128] = content_bytes[16]; - hash_bytes[17 + 128] = content_bytes[17]; - hash_bytes[18 + 128] = content_bytes[18]; - hash_bytes[19 + 128] = content_bytes[19]; - hash_bytes[20 + 128] = content_bytes[20]; - hash_bytes[21 + 128] = content_bytes[21]; - hash_bytes[22 + 128] = content_bytes[22]; - hash_bytes[23 + 128] = content_bytes[23]; - hash_bytes[24 + 128] = content_bytes[24]; - hash_bytes[25 + 128] = content_bytes[25]; - hash_bytes[26 + 128] = content_bytes[26]; - hash_bytes[27 + 128] = content_bytes[27]; - hash_bytes[28 + 128] = content_bytes[28]; - hash_bytes[29 + 128] = content_bytes[29]; - hash_bytes[30 + 128] = content_bytes[30]; - hash_bytes[31 + 128] = content_bytes[31]; - - hash_bytes[0 + 160] = secret_hash_bytes[0]; - hash_bytes[1 + 160] = secret_hash_bytes[1]; - hash_bytes[2 + 160] = secret_hash_bytes[2]; - hash_bytes[3 + 160] = secret_hash_bytes[3]; - hash_bytes[4 + 160] = secret_hash_bytes[4]; - hash_bytes[5 + 160] = secret_hash_bytes[5]; - hash_bytes[6 + 160] = secret_hash_bytes[6]; - hash_bytes[7 + 160] = secret_hash_bytes[7]; - hash_bytes[8 + 160] = secret_hash_bytes[8]; - hash_bytes[9 + 160] = secret_hash_bytes[9]; - hash_bytes[10 + 160] = secret_hash_bytes[10]; - hash_bytes[11 + 160] = secret_hash_bytes[11]; - hash_bytes[12 + 160] = secret_hash_bytes[12]; - hash_bytes[13 + 160] = secret_hash_bytes[13]; - hash_bytes[14 + 160] = secret_hash_bytes[14]; - hash_bytes[15 + 160] = secret_hash_bytes[15]; - hash_bytes[16 + 160] = secret_hash_bytes[16]; - hash_bytes[17 + 160] = secret_hash_bytes[17]; - hash_bytes[18 + 160] = secret_hash_bytes[18]; - hash_bytes[19 + 160] = secret_hash_bytes[19]; - hash_bytes[20 + 160] = secret_hash_bytes[20]; - hash_bytes[21 + 160] = secret_hash_bytes[21]; - hash_bytes[22 + 160] = secret_hash_bytes[22]; - hash_bytes[23 + 160] = secret_hash_bytes[23]; - hash_bytes[24 + 160] = secret_hash_bytes[24]; - hash_bytes[25 + 160] = secret_hash_bytes[25]; - hash_bytes[26 + 160] = secret_hash_bytes[26]; - hash_bytes[27 + 160] = secret_hash_bytes[27]; - hash_bytes[28 + 160] = secret_hash_bytes[28]; - hash_bytes[29 + 160] = secret_hash_bytes[29]; - hash_bytes[30 + 160] = secret_hash_bytes[30]; - hash_bytes[31 + 160] = secret_hash_bytes[31]; - - hash_bytes[0 + 192] = deadline_bytes[0]; - hash_bytes[1 + 192] = deadline_bytes[1]; - hash_bytes[2 + 192] = deadline_bytes[2]; - hash_bytes[3 + 192] = deadline_bytes[3]; - hash_bytes[4 + 192] = deadline_bytes[4]; - hash_bytes[5 + 192] = deadline_bytes[5]; - hash_bytes[6 + 192] = deadline_bytes[6]; - hash_bytes[7 + 192] = deadline_bytes[7]; - hash_bytes[8 + 192] = deadline_bytes[8]; - hash_bytes[9 + 192] = deadline_bytes[9]; - hash_bytes[10 + 192] = deadline_bytes[10]; - hash_bytes[11 + 192] = deadline_bytes[11]; - hash_bytes[12 + 192] = deadline_bytes[12]; - hash_bytes[13 + 192] = deadline_bytes[13]; - hash_bytes[14 + 192] = deadline_bytes[14]; - hash_bytes[15 + 192] = deadline_bytes[15]; - hash_bytes[16 + 192] = deadline_bytes[16]; - hash_bytes[17 + 192] = deadline_bytes[17]; - hash_bytes[18 + 192] = deadline_bytes[18]; - hash_bytes[19 + 192] = deadline_bytes[19]; - hash_bytes[20 + 192] = deadline_bytes[20]; - hash_bytes[21 + 192] = deadline_bytes[21]; - hash_bytes[22 + 192] = deadline_bytes[22]; - hash_bytes[23 + 192] = deadline_bytes[23]; - hash_bytes[24 + 192] = deadline_bytes[24]; - hash_bytes[25 + 192] = deadline_bytes[25]; - hash_bytes[26 + 192] = deadline_bytes[26]; - hash_bytes[27 + 192] = deadline_bytes[27]; - hash_bytes[28 + 192] = deadline_bytes[28]; - hash_bytes[29 + 192] = deadline_bytes[29]; - hash_bytes[30 + 192] = deadline_bytes[30]; - hash_bytes[31 + 192] = deadline_bytes[31]; - - hash_bytes[0 + 224] = fee_bytes[0]; - hash_bytes[1 + 224] = fee_bytes[1]; - hash_bytes[2 + 224] = fee_bytes[2]; - hash_bytes[3 + 224] = fee_bytes[3]; - hash_bytes[4 + 224] = fee_bytes[4]; - hash_bytes[5 + 224] = fee_bytes[5]; - hash_bytes[6 + 224] = fee_bytes[6]; - hash_bytes[7 + 224] = fee_bytes[7]; - hash_bytes[8 + 224] = fee_bytes[8]; - hash_bytes[9 + 224] = fee_bytes[9]; - hash_bytes[10 + 224] = fee_bytes[10]; - hash_bytes[11 + 224] = fee_bytes[11]; - hash_bytes[12 + 224] = fee_bytes[12]; - hash_bytes[13 + 224] = fee_bytes[13]; - hash_bytes[14 + 224] = fee_bytes[14]; - hash_bytes[15 + 224] = fee_bytes[15]; - hash_bytes[16 + 224] = fee_bytes[16]; - hash_bytes[17 + 224] = fee_bytes[17]; - hash_bytes[18 + 224] = fee_bytes[18]; - hash_bytes[19 + 224] = fee_bytes[19]; - hash_bytes[20 + 224] = fee_bytes[20]; - hash_bytes[21 + 224] = fee_bytes[21]; - hash_bytes[22 + 224] = fee_bytes[22]; - hash_bytes[23 + 224] = fee_bytes[23]; - hash_bytes[24 + 224] = fee_bytes[24]; - hash_bytes[25 + 224] = fee_bytes[25]; - hash_bytes[26 + 224] = fee_bytes[26]; - hash_bytes[27 + 224] = fee_bytes[27]; - hash_bytes[28 + 224] = fee_bytes[28]; - hash_bytes[29 + 224] = fee_bytes[29]; - hash_bytes[30 + 224] = fee_bytes[30]; - hash_bytes[31 + 224] = fee_bytes[31]; - - let message_sha256 = dep::std::hash::sha256(hash_bytes); - - // // Convert the message_sha256 to a field element - let mut v = 1; - let mut high = 0 as Field; - let mut low = 0 as Field; - - // Unroll loops because otherwise takes forever to compile - // for i in [15 - i for i in range(16)]: - // print('high = high + (message_sha256[{0}] as Field) * v;'.format(i)) - // print('low = low + (message_sha256[16 + {0}] as Field) * v;'.format(i)) - // print('v = v * 256;'); - high = high + (message_sha256[15] as Field) * v; - low = low + (message_sha256[16 + 15] as Field) * v; - v = v * 256; - high = high + (message_sha256[14] as Field) * v; - low = low + (message_sha256[16 + 14] as Field) * v; - v = v * 256; - high = high + (message_sha256[13] as Field) * v; - low = low + (message_sha256[16 + 13] as Field) * v; - v = v * 256; - high = high + (message_sha256[12] as Field) * v; - low = low + (message_sha256[16 + 12] as Field) * v; - v = v * 256; - high = high + (message_sha256[11] as Field) * v; - low = low + (message_sha256[16 + 11] as Field) * v; - v = v * 256; - high = high + (message_sha256[10] as Field) * v; - low = low + (message_sha256[16 + 10] as Field) * v; - v = v * 256; - high = high + (message_sha256[9] as Field) * v; - low = low + (message_sha256[16 + 9] as Field) * v; - v = v * 256; - high = high + (message_sha256[8] as Field) * v; - low = low + (message_sha256[16 + 8] as Field) * v; - v = v * 256; - high = high + (message_sha256[7] as Field) * v; - low = low + (message_sha256[16 + 7] as Field) * v; - v = v * 256; - high = high + (message_sha256[6] as Field) * v; - low = low + (message_sha256[16 + 6] as Field) * v; - v = v * 256; - high = high + (message_sha256[5] as Field) * v; - low = low + (message_sha256[16 + 5] as Field) * v; - v = v * 256; - high = high + (message_sha256[4] as Field) * v; - low = low + (message_sha256[16 + 4] as Field) * v; - v = v * 256; - high = high + (message_sha256[3] as Field) * v; - low = low + (message_sha256[16 + 3] as Field) * v; - v = v * 256; - high = high + (message_sha256[2] as Field) * v; - low = low + (message_sha256[16 + 2] as Field) * v; - v = v * 256; - high = high + (message_sha256[1] as Field) * v; - low = low + (message_sha256[16 + 1] as Field) * v; - v = v * 256; - high = high + (message_sha256[0] as Field) * v; - low = low + (message_sha256[16 + 0] as Field) * v; - v = v * 256; - - let message_hash = low + high * v; - message_hash - } - - // The nullifier of a l1 to l2 message is the hash of the message salted with the secret and tree index - fn compute_nullifier(self: Self) -> Field { - let message_hash = self.message_hash(); - dep::std::hash::pedersen([generators::Nullifier, message_hash, self.secret, self.tree_index])[0] - } -} diff --git a/yarn-project/noir-contracts/src/contracts/non_native_token_contract/Nargo.toml b/yarn-project/noir-contracts/src/contracts/non_native_token_contract/Nargo.toml index 1ea905e23824..400be405bd28 100644 --- a/yarn-project/noir-contracts/src/contracts/non_native_token_contract/Nargo.toml +++ b/yarn-project/noir-contracts/src/contracts/non_native_token_contract/Nargo.toml @@ -3,4 +3,6 @@ authors = [""] compiler_version = "0.1" [dependencies] -aztec = { path = "../noir-aztec" } \ No newline at end of file +aztec = { path = "../../libs/noir-aztec" } +custom_notes = { path = "../../libs/custom-notes" } +token_utils = { path = "../../libs/token-utils" } \ No newline at end of file diff --git a/yarn-project/noir-contracts/src/contracts/non_native_token_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/non_native_token_contract/src/main.nr index 6403ae3cf85b..0c441096cf45 100644 --- a/yarn-project/noir-contracts/src/contracts/non_native_token_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/non_native_token_contract/src/main.nr @@ -1,6 +1,3 @@ -mod balance_utils; -mod generators; -mod value_note; mod storage; // Represents an ERC20 token bridged from L1 to L2 via `l1-contracts/test/portals/TokenPortal.sol`. The bridged user @@ -8,36 +5,43 @@ mod storage; // is represented as a set of notes in the private data tree. If the balance is stored in the public domain then it is // represented as a single value in the public data tree. contract NonNativeToken { - use dep::aztec::abi; - use dep::aztec::abi::PublicContextInputs; - use dep::aztec::abi::PrivateContextInputs; + // Libs + use dep::token_utils::{ + balance_utils, + value_note::{ + value_note::ValueNote, + filter::get_2_notes, + } + }; + use dep::custom_notes::transparent_note::TransparentNote; + + use crate::storage::Storage; use dep::aztec::context::Context; use dep::aztec::types::point::Point; - - // Private state - use dep::aztec::state_vars::map::Map; - use dep::aztec::state_vars::set::Set; - - // Public state + use dep::aztec::{ + abi, + abi::{ + PublicContextInputs, + PrivateContextInputs, + } + }; // oracles - use dep::aztec::oracle::create_l2_to_l1_message::create_l2_to_l1_message; + use dep::aztec::oracle::{ + create_l2_to_l1_message::create_l2_to_l1_message, + create_commitment::create_commitment, + create_nullifier::create_nullifier, + get_commitment::get_commitment, + }; // public messaging use dep::aztec::messaging::consume_l1_to_l2_message_public; + use dep::aztec::public_call_stack_item::PublicCallStackItem; use dep::aztec::log::emit_encrypted_log; - use dep::aztec::note::note_getter::NoteGetterOptions; - // Storage variable declarations - use crate::storage::Storage; - - use crate::value_note::value_note::ValueNote; - use crate::value_note::filter::get_2_notes; - use crate::balance_utils; - fn constructor( //*********************************/ // Should eventually be hidden: @@ -281,6 +285,128 @@ contract NonNativeToken { context.finish() } + // Shield creates a way for a user to move tokens from the public context into the private context. + open fn shield( + inputs: PublicContextInputs, + amount: Field, + secretHash: Field, + ) { + let storage = Storage::init(); + let public_balances = storage.public_balances; + + // Decrease user's balance. + let sender = inputs.call_context.msg_sender; + let sender_balance = public_balances.at(sender); + let current_sender_balance: Field = sender_balance.read(); + + if (current_sender_balance as u120) > (amount as u120) { + // User has sufficient balance so we decrement it by `amount` + let _void1 = sender_balance.write(current_sender_balance - amount); + } + + // Create a commitment to the amount + let note = TransparentNote::new(amount, secretHash); + + // Public oracle call to emit new commitment. + create_commitment(note.get_commitment()); + } + + // The shield function takes a public balance, and creates a commitment containing the amount of tokens + // in the private context. + fn redeemShield( + inputs: PrivateContextInputs, + amount: Field, + secret: Field, + owner: Point, + ) -> distinct pub abi::PrivateCircuitPublicInputs { + let storage = Storage::init(); + let balances = storage.balances; + + let mut context = Context::new(inputs, abi::hash_args([ + amount, secret, owner.x, owner.y, + ])); + + // Assert that the note exists within the tree + let public_note = TransparentNote::new_from_secret(amount, secret); + context = public_note.consume_in_secret(context, inputs.roots.private_data_tree_root, secret); + + // Mint the tokens + let owner_balance = balances.at(owner.x); + let note = ValueNote::new(amount, owner); + + // Insert note and emit encrypted preimage + context = owner_balance.insert(context, note); + context = emit_encrypted_log(context, inputs.call_context.storage_contract_address, owner_balance.storage_slot, note.owner, note.serialise()); + + context.finish() + } + + fn unshieldTokens( + inputs: PrivateContextInputs, + amount: Field, + owner: Point, + recipient: Field, + ) -> distinct pub abi::PrivateCircuitPublicInputs { + let storage = Storage::init(); + let balances = storage.balances; + + let mut initialContext = Context::new(inputs, abi::hash_args([ + amount, owner.x, owner.y + ])); + + let sender_balance = balances.at(owner.x); + let options = NoteGetterOptions::with_filter(get_2_notes, 0); + let (mut context, notes) = sender_balance.get_notes(initialContext, options); + let note1 = notes[0]; + let note2 = notes[1]; + + // TODO: Removing this return breaks the circuit (???) + context.return_values = context.return_values.push(note1.is_real as Field); + context.return_values = context.return_values.push(note2.is_real as Field); + + note1.validate(owner); + note2.validate(owner); + + let sum = note1.value + note2.value; + assert(sum as u120 >= amount as u120); + let change_value = sum - amount; + + context = sender_balance.remove(context, note1); + context = sender_balance.remove(context, note2); + + let change_note = ValueNote::new(change_value, owner); + + // enqueue a public function to perform the public state update. + context = sender_balance.insert(context, change_note); + context = emit_encrypted_log(context, inputs.call_context.storage_contract_address, sender_balance.storage_slot, change_note.owner, change_note.serialise()); + + let thisAddress = inputs.call_context.storage_contract_address; + let mut args = [0; abi::MAX_ARGS]; + + // addUnshieldedBalance selector (in decimal) + // recompute by: `cast keccak addUnshieldedBalance(field,field)` -> convert to decimal + let pubEntryPointSelector = 753269941; + args[0] = amount; + args[1] = recipient; + + let (_callStackItem1, mut context1) = PublicCallStackItem::call(thisAddress, pubEntryPointSelector, args, context); + + context1.finish() + } + + open fn addUnshieldedBalance( + _inputs: PublicContextInputs, + amount: Field, + recipient: Field, + ) { + let storage = Storage::init(); + let public_balances = storage.public_balances; + + let recipient_balance = public_balances.at(recipient); + let current_balance = recipient_balance.read(); + recipient_balance.write(current_balance + amount); + } + /// ABI getBalance type "unconstrained" fn getBalance( owner: Point, @@ -298,119 +424,17 @@ contract NonNativeToken { let recipient_bytes = owner_address.to_be_bytes(32); let canceller_bytes = canceller.to_be_bytes(32); - // Once loops are performant this will be moved into l1 message - // Unroll loops because otherwise takes forever to compile - // for i in range(32): - // print('hash_bytes[{0}] = amount_bytes[{1}];'.format(i, i)) - // for i in range(32): - // print('hash_bytes[{0} + 32] = recipient_bytes[{1}];'.format(i, i)) - // for i in range(32): - // print('hash_bytes[{0} + 64] = canceller_bytes[{1}];'.format(i, i)) + for i in 0..32 { + hash_bytes[i + 4] = amount_bytes[i]; + hash_bytes[i + 36] = recipient_bytes[i]; + hash_bytes[i + 68] = canceller_bytes[i]; + } // Function selector: 0xeeb73071 keccak256('mint(uint256,bytes32,address)') hash_bytes[0] = 0xee; hash_bytes[1] = 0xb7; hash_bytes[2] = 0x30; hash_bytes[3] = 0x71; - - hash_bytes[0 + 4] = amount_bytes[0]; - hash_bytes[1 + 4] = amount_bytes[1]; - hash_bytes[2 + 4] = amount_bytes[2]; - hash_bytes[3 + 4] = amount_bytes[3]; - hash_bytes[4 + 4] = amount_bytes[4]; - hash_bytes[5 + 4] = amount_bytes[5]; - hash_bytes[6 + 4] = amount_bytes[6]; - hash_bytes[7 + 4] = amount_bytes[7]; - hash_bytes[8 + 4] = amount_bytes[8]; - hash_bytes[9 + 4] = amount_bytes[9]; - hash_bytes[10 + 4] = amount_bytes[10]; - hash_bytes[11 + 4] = amount_bytes[11]; - hash_bytes[12 + 4] = amount_bytes[12]; - hash_bytes[13 + 4] = amount_bytes[13]; - hash_bytes[14 + 4] = amount_bytes[14]; - hash_bytes[15 + 4] = amount_bytes[15]; - hash_bytes[16 + 4] = amount_bytes[16]; - hash_bytes[17 + 4] = amount_bytes[17]; - hash_bytes[18 + 4] = amount_bytes[18]; - hash_bytes[19 + 4] = amount_bytes[19]; - hash_bytes[20 + 4] = amount_bytes[20]; - hash_bytes[21 + 4] = amount_bytes[21]; - hash_bytes[22 + 4] = amount_bytes[22]; - hash_bytes[23 + 4] = amount_bytes[23]; - hash_bytes[24 + 4] = amount_bytes[24]; - hash_bytes[25 + 4] = amount_bytes[25]; - hash_bytes[26 + 4] = amount_bytes[26]; - hash_bytes[27 + 4] = amount_bytes[27]; - hash_bytes[28 + 4] = amount_bytes[28]; - hash_bytes[29 + 4] = amount_bytes[29]; - hash_bytes[30 + 4] = amount_bytes[30]; - hash_bytes[31 + 4] = amount_bytes[31]; - - hash_bytes[0 + 36] = recipient_bytes[0]; - hash_bytes[1 + 36] = recipient_bytes[1]; - hash_bytes[2 + 36] = recipient_bytes[2]; - hash_bytes[3 + 36] = recipient_bytes[3]; - hash_bytes[4 + 36] = recipient_bytes[4]; - hash_bytes[5 + 36] = recipient_bytes[5]; - hash_bytes[6 + 36] = recipient_bytes[6]; - hash_bytes[7 + 36] = recipient_bytes[7]; - hash_bytes[8 + 36] = recipient_bytes[8]; - hash_bytes[9 + 36] = recipient_bytes[9]; - hash_bytes[10 + 36] = recipient_bytes[10]; - hash_bytes[11 + 36] = recipient_bytes[11]; - hash_bytes[12 + 36] = recipient_bytes[12]; - hash_bytes[13 + 36] = recipient_bytes[13]; - hash_bytes[14 + 36] = recipient_bytes[14]; - hash_bytes[15 + 36] = recipient_bytes[15]; - hash_bytes[16 + 36] = recipient_bytes[16]; - hash_bytes[17 + 36] = recipient_bytes[17]; - hash_bytes[18 + 36] = recipient_bytes[18]; - hash_bytes[19 + 36] = recipient_bytes[19]; - hash_bytes[20 + 36] = recipient_bytes[20]; - hash_bytes[21 + 36] = recipient_bytes[21]; - hash_bytes[22 + 36] = recipient_bytes[22]; - hash_bytes[23 + 36] = recipient_bytes[23]; - hash_bytes[24 + 36] = recipient_bytes[24]; - hash_bytes[25 + 36] = recipient_bytes[25]; - hash_bytes[26 + 36] = recipient_bytes[26]; - hash_bytes[27 + 36] = recipient_bytes[27]; - hash_bytes[28 + 36] = recipient_bytes[28]; - hash_bytes[29 + 36] = recipient_bytes[29]; - hash_bytes[30 + 36] = recipient_bytes[30]; - hash_bytes[31 + 36] = recipient_bytes[31]; - - hash_bytes[0 + 68] = canceller_bytes[0]; - hash_bytes[1 + 68] = canceller_bytes[1]; - hash_bytes[2 + 68] = canceller_bytes[2]; - hash_bytes[3 + 68] = canceller_bytes[3]; - hash_bytes[4 + 68] = canceller_bytes[4]; - hash_bytes[5 + 68] = canceller_bytes[5]; - hash_bytes[6 + 68] = canceller_bytes[6]; - hash_bytes[7 + 68] = canceller_bytes[7]; - hash_bytes[8 + 68] = canceller_bytes[8]; - hash_bytes[9 + 68] = canceller_bytes[9]; - hash_bytes[10 + 68] = canceller_bytes[10]; - hash_bytes[11 + 68] = canceller_bytes[11]; - hash_bytes[12 + 68] = canceller_bytes[12]; - hash_bytes[13 + 68] = canceller_bytes[13]; - hash_bytes[14 + 68] = canceller_bytes[14]; - hash_bytes[15 + 68] = canceller_bytes[15]; - hash_bytes[16 + 68] = canceller_bytes[16]; - hash_bytes[17 + 68] = canceller_bytes[17]; - hash_bytes[18 + 68] = canceller_bytes[18]; - hash_bytes[19 + 68] = canceller_bytes[19]; - hash_bytes[20 + 68] = canceller_bytes[20]; - hash_bytes[21 + 68] = canceller_bytes[21]; - hash_bytes[22 + 68] = canceller_bytes[22]; - hash_bytes[23 + 68] = canceller_bytes[23]; - hash_bytes[24 + 68] = canceller_bytes[24]; - hash_bytes[25 + 68] = canceller_bytes[25]; - hash_bytes[26 + 68] = canceller_bytes[26]; - hash_bytes[27 + 68] = canceller_bytes[27]; - hash_bytes[28 + 68] = canceller_bytes[28]; - hash_bytes[29 + 68] = canceller_bytes[29]; - hash_bytes[30 + 68] = canceller_bytes[30]; - hash_bytes[31 + 68] = canceller_bytes[31]; let content_sha256 = dep::std::hash::sha256(hash_bytes); @@ -419,59 +443,11 @@ contract NonNativeToken { let mut high = 0 as Field; let mut low = 0 as Field; - // Unroll loops because otherwise takes forever to compile - // for i in [15 - i for i in range(16)]: - // print('high = high + (content_sha256[{0}] as Field) * v;'.format(i)) - // print('low = low + (content_sha256[16 + {0}] as Field) * v;'.format(i)) - // print('v = v * 256;'); - high = high + (content_sha256[15] as Field) * v; - low = low + (content_sha256[16 + 15] as Field) * v; - v = v * 256; - high = high + (content_sha256[14] as Field) * v; - low = low + (content_sha256[16 + 14] as Field) * v; - v = v * 256; - high = high + (content_sha256[13] as Field) * v; - low = low + (content_sha256[16 + 13] as Field) * v; - v = v * 256; - high = high + (content_sha256[12] as Field) * v; - low = low + (content_sha256[16 + 12] as Field) * v; - v = v * 256; - high = high + (content_sha256[11] as Field) * v; - low = low + (content_sha256[16 + 11] as Field) * v; - v = v * 256; - high = high + (content_sha256[10] as Field) * v; - low = low + (content_sha256[16 + 10] as Field) * v; - v = v * 256; - high = high + (content_sha256[9] as Field) * v; - low = low + (content_sha256[16 + 9] as Field) * v; - v = v * 256; - high = high + (content_sha256[8] as Field) * v; - low = low + (content_sha256[16 + 8] as Field) * v; - v = v * 256; - high = high + (content_sha256[7] as Field) * v; - low = low + (content_sha256[16 + 7] as Field) * v; - v = v * 256; - high = high + (content_sha256[6] as Field) * v; - low = low + (content_sha256[16 + 6] as Field) * v; - v = v * 256; - high = high + (content_sha256[5] as Field) * v; - low = low + (content_sha256[16 + 5] as Field) * v; - v = v * 256; - high = high + (content_sha256[4] as Field) * v; - low = low + (content_sha256[16 + 4] as Field) * v; - v = v * 256; - high = high + (content_sha256[3] as Field) * v; - low = low + (content_sha256[16 + 3] as Field) * v; - v = v * 256; - high = high + (content_sha256[2] as Field) * v; - low = low + (content_sha256[16 + 2] as Field) * v; - v = v * 256; - high = high + (content_sha256[1] as Field) * v; - low = low + (content_sha256[16 + 1] as Field) * v; - v = v * 256; - high = high + (content_sha256[0] as Field) * v; - low = low + (content_sha256[16 + 0] as Field) * v; - v = v * 256; + for i in 0..16 { + high = high + (content_sha256[15 - i] as Field) * v; + low = low + (content_sha256[16 + 15 - i] as Field) * v; + v = v * 256; + } // Abuse that a % p + b % p = (a + b) % p and that low < p let content_hash = low + high * v; @@ -488,117 +464,18 @@ contract NonNativeToken { let amount_bytes = amount.to_be_bytes(32); let recipient_bytes = recipient.to_be_bytes(32); let callerOnL1_bytes = callerOnL1.to_be_bytes(32); - + // 0xb460af94, selector for "withdraw(uint256,address,address)" hash_bytes[0] = 0xb4; hash_bytes[1] = 0x60; hash_bytes[2] = 0xaf; hash_bytes[3] = 0x94; - // Unroll loops because otherwise takes forever to compile - // for i in range(32): - // print('hash_bytes[{0}] = amount_bytes[{1}];'.format(i+4, i)) - // for i in range(32): - // print('hash_bytes[{0} + 32] = recipient_bytes[{1}];'.format(i+4, i)) - hash_bytes[4] = amount_bytes[0]; - hash_bytes[5] = amount_bytes[1]; - hash_bytes[6] = amount_bytes[2]; - hash_bytes[7] = amount_bytes[3]; - hash_bytes[8] = amount_bytes[4]; - hash_bytes[9] = amount_bytes[5]; - hash_bytes[10] = amount_bytes[6]; - hash_bytes[11] = amount_bytes[7]; - hash_bytes[12] = amount_bytes[8]; - hash_bytes[13] = amount_bytes[9]; - hash_bytes[14] = amount_bytes[10]; - hash_bytes[15] = amount_bytes[11]; - hash_bytes[16] = amount_bytes[12]; - hash_bytes[17] = amount_bytes[13]; - hash_bytes[18] = amount_bytes[14]; - hash_bytes[19] = amount_bytes[15]; - hash_bytes[20] = amount_bytes[16]; - hash_bytes[21] = amount_bytes[17]; - hash_bytes[22] = amount_bytes[18]; - hash_bytes[23] = amount_bytes[19]; - hash_bytes[24] = amount_bytes[20]; - hash_bytes[25] = amount_bytes[21]; - hash_bytes[26] = amount_bytes[22]; - hash_bytes[27] = amount_bytes[23]; - hash_bytes[28] = amount_bytes[24]; - hash_bytes[29] = amount_bytes[25]; - hash_bytes[30] = amount_bytes[26]; - hash_bytes[31] = amount_bytes[27]; - hash_bytes[32] = amount_bytes[28]; - hash_bytes[33] = amount_bytes[29]; - hash_bytes[34] = amount_bytes[30]; - hash_bytes[35] = amount_bytes[31]; - - hash_bytes[4 + 32] = recipient_bytes[0]; - hash_bytes[5 + 32] = recipient_bytes[1]; - hash_bytes[6 + 32] = recipient_bytes[2]; - hash_bytes[7 + 32] = recipient_bytes[3]; - hash_bytes[8 + 32] = recipient_bytes[4]; - hash_bytes[9 + 32] = recipient_bytes[5]; - hash_bytes[10 + 32] = recipient_bytes[6]; - hash_bytes[11 + 32] = recipient_bytes[7]; - hash_bytes[12 + 32] = recipient_bytes[8]; - hash_bytes[13 + 32] = recipient_bytes[9]; - hash_bytes[14 + 32] = recipient_bytes[10]; - hash_bytes[15 + 32] = recipient_bytes[11]; - hash_bytes[16 + 32] = recipient_bytes[12]; - hash_bytes[17 + 32] = recipient_bytes[13]; - hash_bytes[18 + 32] = recipient_bytes[14]; - hash_bytes[19 + 32] = recipient_bytes[15]; - hash_bytes[20 + 32] = recipient_bytes[16]; - hash_bytes[21 + 32] = recipient_bytes[17]; - hash_bytes[22 + 32] = recipient_bytes[18]; - hash_bytes[23 + 32] = recipient_bytes[19]; - hash_bytes[24 + 32] = recipient_bytes[20]; - hash_bytes[25 + 32] = recipient_bytes[21]; - hash_bytes[26 + 32] = recipient_bytes[22]; - hash_bytes[27 + 32] = recipient_bytes[23]; - hash_bytes[28 + 32] = recipient_bytes[24]; - hash_bytes[29 + 32] = recipient_bytes[25]; - hash_bytes[30 + 32] = recipient_bytes[26]; - hash_bytes[31 + 32] = recipient_bytes[27]; - hash_bytes[32 + 32] = recipient_bytes[28]; - hash_bytes[33 + 32] = recipient_bytes[29]; - hash_bytes[34 + 32] = recipient_bytes[30]; - hash_bytes[35 + 32] = recipient_bytes[31]; - - hash_bytes[4 + 64] = callerOnL1_bytes[0]; - hash_bytes[5 + 64] = callerOnL1_bytes[1]; - hash_bytes[6 + 64] = callerOnL1_bytes[2]; - hash_bytes[7 + 64] = callerOnL1_bytes[3]; - hash_bytes[8 + 64] = callerOnL1_bytes[4]; - hash_bytes[9 + 64] = callerOnL1_bytes[5]; - hash_bytes[10 + 64] = callerOnL1_bytes[6]; - hash_bytes[11 + 64] = callerOnL1_bytes[7]; - hash_bytes[12 + 64] = callerOnL1_bytes[8]; - hash_bytes[13 + 64] = callerOnL1_bytes[9]; - hash_bytes[14 + 64] = callerOnL1_bytes[10]; - hash_bytes[15 + 64] = callerOnL1_bytes[11]; - hash_bytes[16 + 64] = callerOnL1_bytes[12]; - hash_bytes[17 + 64] = callerOnL1_bytes[13]; - hash_bytes[18 + 64] = callerOnL1_bytes[14]; - hash_bytes[19 + 64] = callerOnL1_bytes[15]; - hash_bytes[20 + 64] = callerOnL1_bytes[16]; - hash_bytes[21 + 64] = callerOnL1_bytes[17]; - hash_bytes[22 + 64] = callerOnL1_bytes[18]; - hash_bytes[23 + 64] = callerOnL1_bytes[19]; - hash_bytes[24 + 64] = callerOnL1_bytes[20]; - hash_bytes[25 + 64] = callerOnL1_bytes[21]; - hash_bytes[26 + 64] = callerOnL1_bytes[22]; - hash_bytes[27 + 64] = callerOnL1_bytes[23]; - hash_bytes[28 + 64] = callerOnL1_bytes[24]; - hash_bytes[29 + 64] = callerOnL1_bytes[25]; - hash_bytes[30 + 64] = callerOnL1_bytes[26]; - hash_bytes[31 + 64] = callerOnL1_bytes[27]; - hash_bytes[32 + 64] = callerOnL1_bytes[28]; - hash_bytes[33 + 64] = callerOnL1_bytes[29]; - hash_bytes[34 + 64] = callerOnL1_bytes[30]; - hash_bytes[35 + 64] = callerOnL1_bytes[31]; - + for i in 0..32 { + hash_bytes[i + 4] = amount_bytes[i]; + hash_bytes[i + 36] = recipient_bytes[i]; + hash_bytes[i + 68] = callerOnL1_bytes[i]; + } let content_sha256 = dep::std::hash::sha256(hash_bytes); // Convert the content_sha256 to a field element @@ -606,59 +483,11 @@ contract NonNativeToken { let mut high = 0 as Field; let mut low = 0 as Field; - // Unroll loops because otherwise takes forever to compile - // for i in [15 - i for i in range(16)]: - // print('high = high + (content_sha256[{0}] as Field) * v;'.format(i)) - // print('low = low + (content_sha256[16 + {0}] as Field) * v;'.format(i)) - // print('v = v * 256;'); - high = high + (content_sha256[15] as Field) * v; - low = low + (content_sha256[16 + 15] as Field) * v; - v = v * 256; - high = high + (content_sha256[14] as Field) * v; - low = low + (content_sha256[16 + 14] as Field) * v; - v = v * 256; - high = high + (content_sha256[13] as Field) * v; - low = low + (content_sha256[16 + 13] as Field) * v; - v = v * 256; - high = high + (content_sha256[12] as Field) * v; - low = low + (content_sha256[16 + 12] as Field) * v; - v = v * 256; - high = high + (content_sha256[11] as Field) * v; - low = low + (content_sha256[16 + 11] as Field) * v; - v = v * 256; - high = high + (content_sha256[10] as Field) * v; - low = low + (content_sha256[16 + 10] as Field) * v; - v = v * 256; - high = high + (content_sha256[9] as Field) * v; - low = low + (content_sha256[16 + 9] as Field) * v; - v = v * 256; - high = high + (content_sha256[8] as Field) * v; - low = low + (content_sha256[16 + 8] as Field) * v; - v = v * 256; - high = high + (content_sha256[7] as Field) * v; - low = low + (content_sha256[16 + 7] as Field) * v; - v = v * 256; - high = high + (content_sha256[6] as Field) * v; - low = low + (content_sha256[16 + 6] as Field) * v; - v = v * 256; - high = high + (content_sha256[5] as Field) * v; - low = low + (content_sha256[16 + 5] as Field) * v; - v = v * 256; - high = high + (content_sha256[4] as Field) * v; - low = low + (content_sha256[16 + 4] as Field) * v; - v = v * 256; - high = high + (content_sha256[3] as Field) * v; - low = low + (content_sha256[16 + 3] as Field) * v; - v = v * 256; - high = high + (content_sha256[2] as Field) * v; - low = low + (content_sha256[16 + 2] as Field) * v; - v = v * 256; - high = high + (content_sha256[1] as Field) * v; - low = low + (content_sha256[16 + 1] as Field) * v; - v = v * 256; - high = high + (content_sha256[0] as Field) * v; - low = low + (content_sha256[16 + 0] as Field) * v; - v = v * 256; + for i in 0..16 { + high = high + (content_sha256[15 - i] as Field) * v; + low = low + (content_sha256[16 + 15 - i] as Field) * v; + v = v * 256; + } // Abuse that a % p + b % p = (a + b) % p and that low < p let content = low + high * v; diff --git a/yarn-project/noir-contracts/src/contracts/non_native_token_contract/src/storage.nr b/yarn-project/noir-contracts/src/contracts/non_native_token_contract/src/storage.nr index 221cf9e5b0f9..c4d5404f59c6 100644 --- a/yarn-project/noir-contracts/src/contracts/non_native_token_contract/src/storage.nr +++ b/yarn-project/noir-contracts/src/contracts/non_native_token_contract/src/storage.nr @@ -1,12 +1,18 @@ -use dep::aztec::state_vars::map::Map; -use dep::aztec::state_vars::set::Set; -use dep::aztec::state_vars::public_state::PublicState; -use dep::aztec::state_vars::public_state_value::field_value::FIELD_VALUE_LEN; -use dep::aztec::state_vars::public_state_value::field_value::FieldValueInterface; +use dep::aztec::state_vars::{ + map::Map, + set::Set, + public_state::PublicState, + public_state_value::field_value::{ + FIELD_VALUE_LEN, + FieldValueInterface, + }, +}; -use crate::value_note::value_note::ValueNote; -use crate::value_note::value_note::ValueNoteInterface; -use crate::value_note::value_note::VALUE_NOTE_LEN; +use dep::token_utils::value_note::{ + value_note::ValueNote, + value_note::ValueNoteInterface, + value_note::VALUE_NOTE_LEN, +}; struct Storage { balances: Map>, diff --git a/yarn-project/noir-contracts/src/contracts/parent_contract/Nargo.toml b/yarn-project/noir-contracts/src/contracts/parent_contract/Nargo.toml index 18da6f0da6ad..691c443b4625 100644 --- a/yarn-project/noir-contracts/src/contracts/parent_contract/Nargo.toml +++ b/yarn-project/noir-contracts/src/contracts/parent_contract/Nargo.toml @@ -3,4 +3,4 @@ authors = [""] compiler_version = "0.1" [dependencies] -aztec = { path = "../noir-aztec" } +aztec = { path = "../../libs/noir-aztec" } diff --git a/yarn-project/noir-contracts/src/contracts/public_private_contract/Nargo.toml b/yarn-project/noir-contracts/src/contracts/public_private_contract/Nargo.toml index 18da6f0da6ad..eb2d7c5c68f8 100644 --- a/yarn-project/noir-contracts/src/contracts/public_private_contract/Nargo.toml +++ b/yarn-project/noir-contracts/src/contracts/public_private_contract/Nargo.toml @@ -1,6 +1,8 @@ [package] authors = [""] -compiler_version = "0.1" +compiler_version = "0.7.1" [dependencies] -aztec = { path = "../noir-aztec" } +aztec = { path = "../../libs/noir-aztec" } +custom_notes = { path = "../../libs/custom-notes" } +token_utils = { path = "../../libs/token-utils" } diff --git a/yarn-project/noir-contracts/src/contracts/public_private_contract/src/balance_utils.nr b/yarn-project/noir-contracts/src/contracts/public_private_contract/src/balance_utils.nr deleted file mode 100644 index e8dbf6c04b5b..000000000000 --- a/yarn-project/noir-contracts/src/contracts/public_private_contract/src/balance_utils.nr +++ /dev/null @@ -1,26 +0,0 @@ -use dep::aztec::note::note_getter::view_notes; -use crate::notes::value_note::ValueNoteInterface; -use crate::notes::value_note::VALUE_NOTE_LEN; - -fn get_balance(storage_slot: Field) -> Field { - get_balance_internal(storage_slot, 10, 0) -} - -// TODO(1.5) We don't support yet more than one page of notes -// noir is having issues with loop handling in unconstrained functions -// rewrite to unconstrained and integrate into noir-aztec when fixed -fn get_balance_internal(storage_slot: Field, limit: u32, offset: u32) -> Field { - let mut balance = 0; - - let notes = view_notes(storage_slot, ValueNoteInterface, limit, offset); - let len = notes.len(); - for i in 0..len { - balance += notes[i].value; - } - // TODO - // if (notes[len - 1].is_dummy()) { - // balance += get_balance(storage_slot, limit, offset + limit); - // } - - balance -} \ No newline at end of file diff --git a/yarn-project/noir-contracts/src/contracts/public_private_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/public_private_contract/src/main.nr index be6493b30100..d0b888c579e6 100644 --- a/yarn-project/noir-contracts/src/contracts/public_private_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/public_private_contract/src/main.nr @@ -1,6 +1,5 @@ -mod balance_utils; -mod notes; mod storage; +use dep::std::hash::pedersen; // A contract used to test insertion of a note from public domain into the private data tree. How this works is that // a user provides a secret hash as an argument on the input of the public function, and the contract then inserts @@ -12,26 +11,41 @@ mod storage; // 2. The sequencer performs the public call to the DEX and the note gets inserted into the private data tree. // 3. At this point a recipient can spend the note in a private function assuming he/she knows the secret. contract PublicPrivate { - use dep::std::hash::pedersen; - use dep::aztec::abi; + // Custom deps + use dep::token_utils::balance_utils; + use dep::token_utils::value_note::value_note::ValueNote; + use dep::custom_notes::transparent_note::TransparentNote; + + use crate::storage::Storage; + use dep::aztec::context::Context; - use dep::aztec::abi::PrivateContextInputs; - use dep::aztec::abi::PublicContextInputs; - use dep::aztec::log::emit_encrypted_log; + + use dep::aztec::{ + abi, + abi::{ + PrivateContextInputs, + PublicContextInputs, + } + }; // Private state - use dep::aztec::types::point::Point; + use dep::aztec::{ + types::point::Point, + state_vars::{ + map::Map, set::Set + }, + }; // oracles - use dep::aztec::oracle::create_commitment::create_commitment; - use dep::aztec::oracle::create_l2_to_l1_message::create_l2_to_l1_message; - use dep::aztec::oracle::create_nullifier::create_nullifier; - use dep::aztec::oracle::get_commitment::get_commitment; - - use crate::balance_utils; - use crate::notes::transparent_note::TransparentNote; - use crate::notes::value_note::ValueNote; - use crate::storage::Storage; + use dep::aztec::oracle::{ + create_commitment::create_commitment, + create_l2_to_l1_message::create_l2_to_l1_message, + create_nullifier::create_nullifier, + get_commitment::get_commitment + }; + + // Logs + use dep::aztec::log::emit_encrypted_log; fn constructor( inputs: PrivateContextInputs, diff --git a/yarn-project/noir-contracts/src/contracts/public_private_contract/src/notes.nr b/yarn-project/noir-contracts/src/contracts/public_private_contract/src/notes.nr deleted file mode 100644 index 6ffd5ee57a00..000000000000 --- a/yarn-project/noir-contracts/src/contracts/public_private_contract/src/notes.nr +++ /dev/null @@ -1,3 +0,0 @@ -mod generators; -mod transparent_note; -mod value_note; \ No newline at end of file diff --git a/yarn-project/noir-contracts/src/contracts/public_private_contract/src/notes/generators.nr b/yarn-project/noir-contracts/src/contracts/public_private_contract/src/notes/generators.nr deleted file mode 100644 index c67babd6235c..000000000000 --- a/yarn-project/noir-contracts/src/contracts/public_private_contract/src/notes/generators.nr +++ /dev/null @@ -1 +0,0 @@ -global VALUE_NOTE = 2; \ No newline at end of file diff --git a/yarn-project/noir-contracts/src/contracts/public_private_contract/src/notes/value_note.nr b/yarn-project/noir-contracts/src/contracts/public_private_contract/src/notes/value_note.nr deleted file mode 100644 index f6b8f37ded5d..000000000000 --- a/yarn-project/noir-contracts/src/contracts/public_private_contract/src/notes/value_note.nr +++ /dev/null @@ -1,110 +0,0 @@ -use dep::aztec::note::note_interface::NoteInterface; -use dep::aztec::oracle::rand::rand; -use dep::aztec::oracle::get_secret_key::get_secret_key; -use dep::aztec::types::point::Point; -use crate::notes::generators; - -global VALUE_NOTE_LEN: Field = 6; - -struct ValueNote { - value: Field, - owner: Point, - randomness: Field, - nonce: Field, - is_real: bool -} - -impl ValueNote { - fn new(value: Field, owner: Point) -> Self { - let randomness = rand(); - let nonce = 3; // Guaranteed to be random - ValueNote { - value, - owner, - randomness, - nonce, - is_real: true, - } - } - - fn serialise(self) -> [Field; VALUE_NOTE_LEN] { - [self.value, self.owner.x, self.owner.y, self.randomness, self.nonce, self.is_real as Field] - } - - fn dummy() -> Self { - ValueNote { - value: 0, - owner: Point { x: 0, y: 0 }, - randomness: 0, - nonce: 0, - is_real: false, - } - } - - fn is_dummy(self) -> bool { - !self.is_real - } - - fn validate(self, sender: Point) { - let sender_equals = (sender.x == self.owner.x) & (sender.y == self.owner.y); - assert((!self.is_real) | sender_equals); - } -} - -fn deserialise(preimage: [Field; VALUE_NOTE_LEN]) -> ValueNote { - ValueNote { - value: preimage[0], - owner: Point { - x: preimage[1], - y: preimage[2] - }, - randomness: preimage[3], - nonce: preimage[4], - is_real: preimage[5] as bool, - } -} - -fn serialise(note: ValueNote) -> [Field; VALUE_NOTE_LEN] { - note.serialise() -} - -fn compute_note_hash(note: ValueNote) -> Field { - dep::std::hash::pedersen([ - generators::VALUE_NOTE, - note.value, - note.owner.x, - note.owner.y, - note.randomness, - note.nonce, - note.is_real as Field, - ])[0] -} - -fn compute_nullifier(note: ValueNote, final_note_hash: Field) -> Field { - if (!note.is_real) { - 0 - } else { - let secret = get_secret_key(note.owner); - dep::std::hash::pedersen([ - final_note_hash, - secret, - ])[0] - } -} - -fn dummy() -> ValueNote { - ValueNote::dummy() -} - -fn is_dummy(note: ValueNote) -> bool { - note.is_dummy() -} - -global ValueNoteInterface = NoteInterface { - deserialise, - serialise, - compute_note_hash, - compute_nullifier, - dummy, - is_dummy, -}; diff --git a/yarn-project/noir-contracts/src/contracts/public_private_contract/src/storage.nr b/yarn-project/noir-contracts/src/contracts/public_private_contract/src/storage.nr index 10293d937ab5..55cb3eb8d5b9 100644 --- a/yarn-project/noir-contracts/src/contracts/public_private_contract/src/storage.nr +++ b/yarn-project/noir-contracts/src/contracts/public_private_contract/src/storage.nr @@ -1,8 +1,13 @@ -use dep::aztec::state_vars::map::Map; -use dep::aztec::state_vars::set::Set; -use crate::notes::value_note::ValueNote; -use crate::notes::value_note::ValueNoteInterface; -use crate::notes::value_note::VALUE_NOTE_LEN; +use dep::aztec::state_vars::{ + map::Map, + set::Set +}; + +use dep::token_utils::value_note::value_note::{ + ValueNote, + ValueNoteInterface, + VALUE_NOTE_LEN, +}; struct Storage { balances: Map>, diff --git a/yarn-project/noir-contracts/src/contracts/public_token_contract/Nargo.toml b/yarn-project/noir-contracts/src/contracts/public_token_contract/Nargo.toml index 18da6f0da6ad..75723b0b3704 100644 --- a/yarn-project/noir-contracts/src/contracts/public_token_contract/Nargo.toml +++ b/yarn-project/noir-contracts/src/contracts/public_token_contract/Nargo.toml @@ -3,4 +3,4 @@ authors = [""] compiler_version = "0.1" [dependencies] -aztec = { path = "../noir-aztec" } +aztec = { path = "../../libs/noir-aztec" } \ No newline at end of file diff --git a/yarn-project/noir-contracts/src/contracts/schnorr_account_contract/Nargo.toml b/yarn-project/noir-contracts/src/contracts/schnorr_account_contract/Nargo.toml index 18da6f0da6ad..691c443b4625 100644 --- a/yarn-project/noir-contracts/src/contracts/schnorr_account_contract/Nargo.toml +++ b/yarn-project/noir-contracts/src/contracts/schnorr_account_contract/Nargo.toml @@ -3,4 +3,4 @@ authors = [""] compiler_version = "0.1" [dependencies] -aztec = { path = "../noir-aztec" } +aztec = { path = "../../libs/noir-aztec" } diff --git a/yarn-project/noir-contracts/src/contracts/test_contract/Nargo.toml b/yarn-project/noir-contracts/src/contracts/test_contract/Nargo.toml index 18da6f0da6ad..691c443b4625 100644 --- a/yarn-project/noir-contracts/src/contracts/test_contract/Nargo.toml +++ b/yarn-project/noir-contracts/src/contracts/test_contract/Nargo.toml @@ -3,4 +3,4 @@ authors = [""] compiler_version = "0.1" [dependencies] -aztec = { path = "../noir-aztec" } +aztec = { path = "../../libs/noir-aztec" } diff --git a/yarn-project/noir-contracts/src/contracts/test_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/test_contract/src/main.nr index 38860703d859..9e0da8187d54 100644 --- a/yarn-project/noir-contracts/src/contracts/test_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/test_contract/src/main.nr @@ -1,13 +1,70 @@ // A contract used to test whether constructing a contract works. contract Test { - use dep::aztec::abi; - use dep::aztec::abi::PrivateContextInputs; + use dep::aztec::{ + abi, + abi::{ + PublicContextInputs, + PrivateContextInputs + } + }; use dep::aztec::context::Context; + use dep::aztec::oracle::{ + create_l2_to_l1_message::create_l2_to_l1_message, + create_nullifier::create_nullifier + }; + + fn constructor( inputs: PrivateContextInputs, ) -> distinct pub abi::PrivateCircuitPublicInputs { // Return private circuit public inputs. All private functions need to return this as it is part of the input of the private kernel. Context::new(inputs, 0).finish() } + + // Purely exists for testing + open fn createL2ToL1MessagePublic( + _inputs: PublicContextInputs, + amount: Field, + secretHash: Field, + ) { + // Create a commitment to the amount + let note = DummyNote::new(amount, secretHash); + + // Public oracle call to emit new commitment. + create_l2_to_l1_message(note.get_commitment()); + } + + // Purely exists for testing + open fn createNullifierPublic( + _inputs: PublicContextInputs, + amount: Field, + secretHash: Field, + ) -> Field { + + // Create a commitment to the amount + let note = DummyNote::new(amount, secretHash); + + // Public oracle call to emit new commitment. + create_nullifier(note.get_commitment()); + 0 + } + + struct DummyNote { + amount: Field, + secretHash: Field + } + + impl DummyNote { + fn new(amount: Field, secretHash: Field) -> pub Self { + Self { + amount: amount, + secretHash: secretHash + } + } + + fn get_commitment(self) -> pub Field { + dep::std::hash::pedersen([self.amount, self.secretHash])[0] + } + } } diff --git a/yarn-project/noir-contracts/src/contracts/uniswap_contract/Nargo.toml b/yarn-project/noir-contracts/src/contracts/uniswap_contract/Nargo.toml index 18da6f0da6ad..691c443b4625 100644 --- a/yarn-project/noir-contracts/src/contracts/uniswap_contract/Nargo.toml +++ b/yarn-project/noir-contracts/src/contracts/uniswap_contract/Nargo.toml @@ -3,4 +3,4 @@ authors = [""] compiler_version = "0.1" [dependencies] -aztec = { path = "../noir-aztec" } +aztec = { path = "../../libs/noir-aztec" } diff --git a/yarn-project/noir-contracts/src/contracts/uniswap_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/uniswap_contract/src/main.nr index 81b5336504da..22e9c379910d 100644 --- a/yarn-project/noir-contracts/src/contracts/uniswap_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/uniswap_contract/src/main.nr @@ -126,326 +126,19 @@ contract Uniswap { hash_bytes[1] = 0x07; hash_bytes[2] = 0x3c; hash_bytes[3] = 0x81; - hash_bytes[4] = inputTokenPortal_bytes[0]; - hash_bytes[5] = inputTokenPortal_bytes[1]; - hash_bytes[6] = inputTokenPortal_bytes[2]; - hash_bytes[7] = inputTokenPortal_bytes[3]; - hash_bytes[8] = inputTokenPortal_bytes[4]; - hash_bytes[9] = inputTokenPortal_bytes[5]; - hash_bytes[10] = inputTokenPortal_bytes[6]; - hash_bytes[11] = inputTokenPortal_bytes[7]; - hash_bytes[12] = inputTokenPortal_bytes[8]; - hash_bytes[13] = inputTokenPortal_bytes[9]; - hash_bytes[14] = inputTokenPortal_bytes[10]; - hash_bytes[15] = inputTokenPortal_bytes[11]; - hash_bytes[16] = inputTokenPortal_bytes[12]; - hash_bytes[17] = inputTokenPortal_bytes[13]; - hash_bytes[18] = inputTokenPortal_bytes[14]; - hash_bytes[19] = inputTokenPortal_bytes[15]; - hash_bytes[20] = inputTokenPortal_bytes[16]; - hash_bytes[21] = inputTokenPortal_bytes[17]; - hash_bytes[22] = inputTokenPortal_bytes[18]; - hash_bytes[23] = inputTokenPortal_bytes[19]; - hash_bytes[24] = inputTokenPortal_bytes[20]; - hash_bytes[25] = inputTokenPortal_bytes[21]; - hash_bytes[26] = inputTokenPortal_bytes[22]; - hash_bytes[27] = inputTokenPortal_bytes[23]; - hash_bytes[28] = inputTokenPortal_bytes[24]; - hash_bytes[29] = inputTokenPortal_bytes[25]; - hash_bytes[30] = inputTokenPortal_bytes[26]; - hash_bytes[31] = inputTokenPortal_bytes[27]; - hash_bytes[32] = inputTokenPortal_bytes[28]; - hash_bytes[33] = inputTokenPortal_bytes[29]; - hash_bytes[34] = inputTokenPortal_bytes[30]; - hash_bytes[35] = inputTokenPortal_bytes[31]; - hash_bytes[36] = inAmount_bytes[0]; - hash_bytes[37] = inAmount_bytes[1]; - hash_bytes[38] = inAmount_bytes[2]; - hash_bytes[39] = inAmount_bytes[3]; - hash_bytes[40] = inAmount_bytes[4]; - hash_bytes[41] = inAmount_bytes[5]; - hash_bytes[42] = inAmount_bytes[6]; - hash_bytes[43] = inAmount_bytes[7]; - hash_bytes[44] = inAmount_bytes[8]; - hash_bytes[45] = inAmount_bytes[9]; - hash_bytes[46] = inAmount_bytes[10]; - hash_bytes[47] = inAmount_bytes[11]; - hash_bytes[48] = inAmount_bytes[12]; - hash_bytes[49] = inAmount_bytes[13]; - hash_bytes[50] = inAmount_bytes[14]; - hash_bytes[51] = inAmount_bytes[15]; - hash_bytes[52] = inAmount_bytes[16]; - hash_bytes[53] = inAmount_bytes[17]; - hash_bytes[54] = inAmount_bytes[18]; - hash_bytes[55] = inAmount_bytes[19]; - hash_bytes[56] = inAmount_bytes[20]; - hash_bytes[57] = inAmount_bytes[21]; - hash_bytes[58] = inAmount_bytes[22]; - hash_bytes[59] = inAmount_bytes[23]; - hash_bytes[60] = inAmount_bytes[24]; - hash_bytes[61] = inAmount_bytes[25]; - hash_bytes[62] = inAmount_bytes[26]; - hash_bytes[63] = inAmount_bytes[27]; - hash_bytes[64] = inAmount_bytes[28]; - hash_bytes[65] = inAmount_bytes[29]; - hash_bytes[66] = inAmount_bytes[30]; - hash_bytes[67] = inAmount_bytes[31]; - hash_bytes[68] = uniswapFeeTier_bytes[0]; - hash_bytes[69] = uniswapFeeTier_bytes[1]; - hash_bytes[70] = uniswapFeeTier_bytes[2]; - hash_bytes[71] = uniswapFeeTier_bytes[3]; - hash_bytes[72] = uniswapFeeTier_bytes[4]; - hash_bytes[73] = uniswapFeeTier_bytes[5]; - hash_bytes[74] = uniswapFeeTier_bytes[6]; - hash_bytes[75] = uniswapFeeTier_bytes[7]; - hash_bytes[76] = uniswapFeeTier_bytes[8]; - hash_bytes[77] = uniswapFeeTier_bytes[9]; - hash_bytes[78] = uniswapFeeTier_bytes[10]; - hash_bytes[79] = uniswapFeeTier_bytes[11]; - hash_bytes[80] = uniswapFeeTier_bytes[12]; - hash_bytes[81] = uniswapFeeTier_bytes[13]; - hash_bytes[82] = uniswapFeeTier_bytes[14]; - hash_bytes[83] = uniswapFeeTier_bytes[15]; - hash_bytes[84] = uniswapFeeTier_bytes[16]; - hash_bytes[85] = uniswapFeeTier_bytes[17]; - hash_bytes[86] = uniswapFeeTier_bytes[18]; - hash_bytes[87] = uniswapFeeTier_bytes[19]; - hash_bytes[88] = uniswapFeeTier_bytes[20]; - hash_bytes[89] = uniswapFeeTier_bytes[21]; - hash_bytes[90] = uniswapFeeTier_bytes[22]; - hash_bytes[91] = uniswapFeeTier_bytes[23]; - hash_bytes[92] = uniswapFeeTier_bytes[24]; - hash_bytes[93] = uniswapFeeTier_bytes[25]; - hash_bytes[94] = uniswapFeeTier_bytes[26]; - hash_bytes[95] = uniswapFeeTier_bytes[27]; - hash_bytes[96] = uniswapFeeTier_bytes[28]; - hash_bytes[97] = uniswapFeeTier_bytes[29]; - hash_bytes[98] = uniswapFeeTier_bytes[30]; - hash_bytes[99] = uniswapFeeTier_bytes[31]; - hash_bytes[100] = outputTokenPortal_bytes[0]; - hash_bytes[101] = outputTokenPortal_bytes[1]; - hash_bytes[102] = outputTokenPortal_bytes[2]; - hash_bytes[103] = outputTokenPortal_bytes[3]; - hash_bytes[104] = outputTokenPortal_bytes[4]; - hash_bytes[105] = outputTokenPortal_bytes[5]; - hash_bytes[106] = outputTokenPortal_bytes[6]; - hash_bytes[107] = outputTokenPortal_bytes[7]; - hash_bytes[108] = outputTokenPortal_bytes[8]; - hash_bytes[109] = outputTokenPortal_bytes[9]; - hash_bytes[110] = outputTokenPortal_bytes[10]; - hash_bytes[111] = outputTokenPortal_bytes[11]; - hash_bytes[112] = outputTokenPortal_bytes[12]; - hash_bytes[113] = outputTokenPortal_bytes[13]; - hash_bytes[114] = outputTokenPortal_bytes[14]; - hash_bytes[115] = outputTokenPortal_bytes[15]; - hash_bytes[116] = outputTokenPortal_bytes[16]; - hash_bytes[117] = outputTokenPortal_bytes[17]; - hash_bytes[118] = outputTokenPortal_bytes[18]; - hash_bytes[119] = outputTokenPortal_bytes[19]; - hash_bytes[120] = outputTokenPortal_bytes[20]; - hash_bytes[121] = outputTokenPortal_bytes[21]; - hash_bytes[122] = outputTokenPortal_bytes[22]; - hash_bytes[123] = outputTokenPortal_bytes[23]; - hash_bytes[124] = outputTokenPortal_bytes[24]; - hash_bytes[125] = outputTokenPortal_bytes[25]; - hash_bytes[126] = outputTokenPortal_bytes[26]; - hash_bytes[127] = outputTokenPortal_bytes[27]; - hash_bytes[128] = outputTokenPortal_bytes[28]; - hash_bytes[129] = outputTokenPortal_bytes[29]; - hash_bytes[130] = outputTokenPortal_bytes[30]; - hash_bytes[131] = outputTokenPortal_bytes[31]; - hash_bytes[132] = amountOutMin_bytes[0]; - hash_bytes[133] = amountOutMin_bytes[1]; - hash_bytes[134] = amountOutMin_bytes[2]; - hash_bytes[135] = amountOutMin_bytes[3]; - hash_bytes[136] = amountOutMin_bytes[4]; - hash_bytes[137] = amountOutMin_bytes[5]; - hash_bytes[138] = amountOutMin_bytes[6]; - hash_bytes[139] = amountOutMin_bytes[7]; - hash_bytes[140] = amountOutMin_bytes[8]; - hash_bytes[141] = amountOutMin_bytes[9]; - hash_bytes[142] = amountOutMin_bytes[10]; - hash_bytes[143] = amountOutMin_bytes[11]; - hash_bytes[144] = amountOutMin_bytes[12]; - hash_bytes[145] = amountOutMin_bytes[13]; - hash_bytes[146] = amountOutMin_bytes[14]; - hash_bytes[147] = amountOutMin_bytes[15]; - hash_bytes[148] = amountOutMin_bytes[16]; - hash_bytes[149] = amountOutMin_bytes[17]; - hash_bytes[150] = amountOutMin_bytes[18]; - hash_bytes[151] = amountOutMin_bytes[19]; - hash_bytes[152] = amountOutMin_bytes[20]; - hash_bytes[153] = amountOutMin_bytes[21]; - hash_bytes[154] = amountOutMin_bytes[22]; - hash_bytes[155] = amountOutMin_bytes[23]; - hash_bytes[156] = amountOutMin_bytes[24]; - hash_bytes[157] = amountOutMin_bytes[25]; - hash_bytes[158] = amountOutMin_bytes[26]; - hash_bytes[159] = amountOutMin_bytes[27]; - hash_bytes[160] = amountOutMin_bytes[28]; - hash_bytes[161] = amountOutMin_bytes[29]; - hash_bytes[162] = amountOutMin_bytes[30]; - hash_bytes[163] = amountOutMin_bytes[31]; - hash_bytes[164] = aztecRecipientAddress_bytes[0]; - hash_bytes[165] = aztecRecipientAddress_bytes[1]; - hash_bytes[166] = aztecRecipientAddress_bytes[2]; - hash_bytes[167] = aztecRecipientAddress_bytes[3]; - hash_bytes[168] = aztecRecipientAddress_bytes[4]; - hash_bytes[169] = aztecRecipientAddress_bytes[5]; - hash_bytes[170] = aztecRecipientAddress_bytes[6]; - hash_bytes[171] = aztecRecipientAddress_bytes[7]; - hash_bytes[172] = aztecRecipientAddress_bytes[8]; - hash_bytes[173] = aztecRecipientAddress_bytes[9]; - hash_bytes[174] = aztecRecipientAddress_bytes[10]; - hash_bytes[175] = aztecRecipientAddress_bytes[11]; - hash_bytes[176] = aztecRecipientAddress_bytes[12]; - hash_bytes[177] = aztecRecipientAddress_bytes[13]; - hash_bytes[178] = aztecRecipientAddress_bytes[14]; - hash_bytes[179] = aztecRecipientAddress_bytes[15]; - hash_bytes[180] = aztecRecipientAddress_bytes[16]; - hash_bytes[181] = aztecRecipientAddress_bytes[17]; - hash_bytes[182] = aztecRecipientAddress_bytes[18]; - hash_bytes[183] = aztecRecipientAddress_bytes[19]; - hash_bytes[184] = aztecRecipientAddress_bytes[20]; - hash_bytes[185] = aztecRecipientAddress_bytes[21]; - hash_bytes[186] = aztecRecipientAddress_bytes[22]; - hash_bytes[187] = aztecRecipientAddress_bytes[23]; - hash_bytes[188] = aztecRecipientAddress_bytes[24]; - hash_bytes[189] = aztecRecipientAddress_bytes[25]; - hash_bytes[190] = aztecRecipientAddress_bytes[26]; - hash_bytes[191] = aztecRecipientAddress_bytes[27]; - hash_bytes[192] = aztecRecipientAddress_bytes[28]; - hash_bytes[193] = aztecRecipientAddress_bytes[29]; - hash_bytes[194] = aztecRecipientAddress_bytes[30]; - hash_bytes[195] = aztecRecipientAddress_bytes[31]; - hash_bytes[196] = secretHash_bytes[0]; - hash_bytes[197] = secretHash_bytes[1]; - hash_bytes[198] = secretHash_bytes[2]; - hash_bytes[199] = secretHash_bytes[3]; - hash_bytes[200] = secretHash_bytes[4]; - hash_bytes[201] = secretHash_bytes[5]; - hash_bytes[202] = secretHash_bytes[6]; - hash_bytes[203] = secretHash_bytes[7]; - hash_bytes[204] = secretHash_bytes[8]; - hash_bytes[205] = secretHash_bytes[9]; - hash_bytes[206] = secretHash_bytes[10]; - hash_bytes[207] = secretHash_bytes[11]; - hash_bytes[208] = secretHash_bytes[12]; - hash_bytes[209] = secretHash_bytes[13]; - hash_bytes[210] = secretHash_bytes[14]; - hash_bytes[211] = secretHash_bytes[15]; - hash_bytes[212] = secretHash_bytes[16]; - hash_bytes[213] = secretHash_bytes[17]; - hash_bytes[214] = secretHash_bytes[18]; - hash_bytes[215] = secretHash_bytes[19]; - hash_bytes[216] = secretHash_bytes[20]; - hash_bytes[217] = secretHash_bytes[21]; - hash_bytes[218] = secretHash_bytes[22]; - hash_bytes[219] = secretHash_bytes[23]; - hash_bytes[220] = secretHash_bytes[24]; - hash_bytes[221] = secretHash_bytes[25]; - hash_bytes[222] = secretHash_bytes[26]; - hash_bytes[223] = secretHash_bytes[27]; - hash_bytes[224] = secretHash_bytes[28]; - hash_bytes[225] = secretHash_bytes[29]; - hash_bytes[226] = secretHash_bytes[30]; - hash_bytes[227] = secretHash_bytes[31]; - hash_bytes[228] = deadlineForL1ToL2Message_bytes[0]; - hash_bytes[229] = deadlineForL1ToL2Message_bytes[1]; - hash_bytes[230] = deadlineForL1ToL2Message_bytes[2]; - hash_bytes[231] = deadlineForL1ToL2Message_bytes[3]; - hash_bytes[232] = deadlineForL1ToL2Message_bytes[4]; - hash_bytes[233] = deadlineForL1ToL2Message_bytes[5]; - hash_bytes[234] = deadlineForL1ToL2Message_bytes[6]; - hash_bytes[235] = deadlineForL1ToL2Message_bytes[7]; - hash_bytes[236] = deadlineForL1ToL2Message_bytes[8]; - hash_bytes[237] = deadlineForL1ToL2Message_bytes[9]; - hash_bytes[238] = deadlineForL1ToL2Message_bytes[10]; - hash_bytes[239] = deadlineForL1ToL2Message_bytes[11]; - hash_bytes[240] = deadlineForL1ToL2Message_bytes[12]; - hash_bytes[241] = deadlineForL1ToL2Message_bytes[13]; - hash_bytes[242] = deadlineForL1ToL2Message_bytes[14]; - hash_bytes[243] = deadlineForL1ToL2Message_bytes[15]; - hash_bytes[244] = deadlineForL1ToL2Message_bytes[16]; - hash_bytes[245] = deadlineForL1ToL2Message_bytes[17]; - hash_bytes[246] = deadlineForL1ToL2Message_bytes[18]; - hash_bytes[247] = deadlineForL1ToL2Message_bytes[19]; - hash_bytes[248] = deadlineForL1ToL2Message_bytes[20]; - hash_bytes[249] = deadlineForL1ToL2Message_bytes[21]; - hash_bytes[250] = deadlineForL1ToL2Message_bytes[22]; - hash_bytes[251] = deadlineForL1ToL2Message_bytes[23]; - hash_bytes[252] = deadlineForL1ToL2Message_bytes[24]; - hash_bytes[253] = deadlineForL1ToL2Message_bytes[25]; - hash_bytes[254] = deadlineForL1ToL2Message_bytes[26]; - hash_bytes[255] = deadlineForL1ToL2Message_bytes[27]; - hash_bytes[256] = deadlineForL1ToL2Message_bytes[28]; - hash_bytes[257] = deadlineForL1ToL2Message_bytes[29]; - hash_bytes[258] = deadlineForL1ToL2Message_bytes[30]; - hash_bytes[259] = deadlineForL1ToL2Message_bytes[31]; - hash_bytes[260] = canceller_bytes[0]; - hash_bytes[261] = canceller_bytes[1]; - hash_bytes[262] = canceller_bytes[2]; - hash_bytes[263] = canceller_bytes[3]; - hash_bytes[264] = canceller_bytes[4]; - hash_bytes[265] = canceller_bytes[5]; - hash_bytes[266] = canceller_bytes[6]; - hash_bytes[267] = canceller_bytes[7]; - hash_bytes[268] = canceller_bytes[8]; - hash_bytes[269] = canceller_bytes[9]; - hash_bytes[270] = canceller_bytes[10]; - hash_bytes[271] = canceller_bytes[11]; - hash_bytes[272] = canceller_bytes[12]; - hash_bytes[273] = canceller_bytes[13]; - hash_bytes[274] = canceller_bytes[14]; - hash_bytes[275] = canceller_bytes[15]; - hash_bytes[276] = canceller_bytes[16]; - hash_bytes[277] = canceller_bytes[17]; - hash_bytes[278] = canceller_bytes[18]; - hash_bytes[279] = canceller_bytes[19]; - hash_bytes[280] = canceller_bytes[20]; - hash_bytes[281] = canceller_bytes[21]; - hash_bytes[282] = canceller_bytes[22]; - hash_bytes[283] = canceller_bytes[23]; - hash_bytes[284] = canceller_bytes[24]; - hash_bytes[285] = canceller_bytes[25]; - hash_bytes[286] = canceller_bytes[26]; - hash_bytes[287] = canceller_bytes[27]; - hash_bytes[288] = canceller_bytes[28]; - hash_bytes[289] = canceller_bytes[29]; - hash_bytes[290] = canceller_bytes[30]; - hash_bytes[291] = canceller_bytes[31]; - hash_bytes[292] = callerOnL1_bytes[0]; - hash_bytes[293] = callerOnL1_bytes[1]; - hash_bytes[294] = callerOnL1_bytes[2]; - hash_bytes[295] = callerOnL1_bytes[3]; - hash_bytes[296] = callerOnL1_bytes[4]; - hash_bytes[297] = callerOnL1_bytes[5]; - hash_bytes[298] = callerOnL1_bytes[6]; - hash_bytes[299] = callerOnL1_bytes[7]; - hash_bytes[300] = callerOnL1_bytes[8]; - hash_bytes[301] = callerOnL1_bytes[9]; - hash_bytes[302] = callerOnL1_bytes[10]; - hash_bytes[303] = callerOnL1_bytes[11]; - hash_bytes[304] = callerOnL1_bytes[12]; - hash_bytes[305] = callerOnL1_bytes[13]; - hash_bytes[306] = callerOnL1_bytes[14]; - hash_bytes[307] = callerOnL1_bytes[15]; - hash_bytes[308] = callerOnL1_bytes[16]; - hash_bytes[309] = callerOnL1_bytes[17]; - hash_bytes[310] = callerOnL1_bytes[18]; - hash_bytes[311] = callerOnL1_bytes[19]; - hash_bytes[312] = callerOnL1_bytes[20]; - hash_bytes[313] = callerOnL1_bytes[21]; - hash_bytes[314] = callerOnL1_bytes[22]; - hash_bytes[315] = callerOnL1_bytes[23]; - hash_bytes[316] = callerOnL1_bytes[24]; - hash_bytes[317] = callerOnL1_bytes[25]; - hash_bytes[318] = callerOnL1_bytes[26]; - hash_bytes[319] = callerOnL1_bytes[27]; - hash_bytes[320] = callerOnL1_bytes[28]; - hash_bytes[321] = callerOnL1_bytes[29]; - hash_bytes[322] = callerOnL1_bytes[30]; - hash_bytes[323] = callerOnL1_bytes[31]; + + for i in 0..32 { + hash_bytes[i + 4] = inputTokenPortal_bytes[i]; + hash_bytes[i + 36] = inAmount_bytes[i]; + hash_bytes[i + 68] = uniswapFeeTier_bytes[i]; + hash_bytes[i + 100] = outputTokenPortal_bytes[i]; + hash_bytes[i + 132] = amountOutMin_bytes[i]; + hash_bytes[i + 164] = aztecRecipientAddress_bytes[i]; + hash_bytes[i + 196] = secretHash_bytes[i]; + hash_bytes[i + 228] = deadlineForL1ToL2Message_bytes[i]; + hash_bytes[i + 260] = canceller_bytes[i]; + hash_bytes[i + 292] = callerOnL1_bytes[i]; + } let content_sha256 = dep::std::hash::sha256(hash_bytes); @@ -454,59 +147,11 @@ contract Uniswap { let mut high = 0 as Field; let mut low = 0 as Field; - // Unroll loops because otherwise takes forever to compile - // for i in [15 - i for i in range(16)]: - // print('high = high + (content_sha256[{0}] as Field) * v;'.format(i)) - // print('low = low + (content_sha256[16 + {0}] as Field) * v;'.format(i)) - // print('v = v * 256;'); - high = high + (content_sha256[15] as Field) * v; - low = low + (content_sha256[16 + 15] as Field) * v; - v = v * 256; - high = high + (content_sha256[14] as Field) * v; - low = low + (content_sha256[16 + 14] as Field) * v; - v = v * 256; - high = high + (content_sha256[13] as Field) * v; - low = low + (content_sha256[16 + 13] as Field) * v; - v = v * 256; - high = high + (content_sha256[12] as Field) * v; - low = low + (content_sha256[16 + 12] as Field) * v; - v = v * 256; - high = high + (content_sha256[11] as Field) * v; - low = low + (content_sha256[16 + 11] as Field) * v; - v = v * 256; - high = high + (content_sha256[10] as Field) * v; - low = low + (content_sha256[16 + 10] as Field) * v; - v = v * 256; - high = high + (content_sha256[9] as Field) * v; - low = low + (content_sha256[16 + 9] as Field) * v; - v = v * 256; - high = high + (content_sha256[8] as Field) * v; - low = low + (content_sha256[16 + 8] as Field) * v; - v = v * 256; - high = high + (content_sha256[7] as Field) * v; - low = low + (content_sha256[16 + 7] as Field) * v; - v = v * 256; - high = high + (content_sha256[6] as Field) * v; - low = low + (content_sha256[16 + 6] as Field) * v; - v = v * 256; - high = high + (content_sha256[5] as Field) * v; - low = low + (content_sha256[16 + 5] as Field) * v; - v = v * 256; - high = high + (content_sha256[4] as Field) * v; - low = low + (content_sha256[16 + 4] as Field) * v; - v = v * 256; - high = high + (content_sha256[3] as Field) * v; - low = low + (content_sha256[16 + 3] as Field) * v; - v = v * 256; - high = high + (content_sha256[2] as Field) * v; - low = low + (content_sha256[16 + 2] as Field) * v; - v = v * 256; - high = high + (content_sha256[1] as Field) * v; - low = low + (content_sha256[16 + 1] as Field) * v; - v = v * 256; - high = high + (content_sha256[0] as Field) * v; - low = low + (content_sha256[16 + 0] as Field) * v; - v = v * 256; + for i in 0..16 { + high = high + (content_sha256[15 - i] as Field) * v; + low = low + (content_sha256[16 + 15 - i] as Field) * v; + v = v * 256; + } // Abuse that a % p + b % p = (a + b) % p and that low < p let content_hash = low + high * v; diff --git a/yarn-project/noir-contracts/src/contracts/zk_token_contract/Nargo.toml b/yarn-project/noir-contracts/src/contracts/zk_token_contract/Nargo.toml index 18da6f0da6ad..d55250f05faa 100644 --- a/yarn-project/noir-contracts/src/contracts/zk_token_contract/Nargo.toml +++ b/yarn-project/noir-contracts/src/contracts/zk_token_contract/Nargo.toml @@ -3,4 +3,5 @@ authors = [""] compiler_version = "0.1" [dependencies] -aztec = { path = "../noir-aztec" } +aztec = { path = "../../libs/noir-aztec" } +token_utils = { path = "../../libs/token-utils"} \ No newline at end of file diff --git a/yarn-project/noir-contracts/src/contracts/zk_token_contract/src/balance_utils.nr b/yarn-project/noir-contracts/src/contracts/zk_token_contract/src/balance_utils.nr deleted file mode 100644 index 49a3f8b59eaf..000000000000 --- a/yarn-project/noir-contracts/src/contracts/zk_token_contract/src/balance_utils.nr +++ /dev/null @@ -1,26 +0,0 @@ -use dep::aztec::note::note_getter::view_notes; -use crate::value_note::value_note::ValueNoteInterface; -use crate::value_note::value_note::VALUE_NOTE_LEN; - -fn get_balance(storage_slot: Field) -> Field { - get_balance_internal(storage_slot, 10, 0) -} - -// TODO(1.5) We don't support yet more than one page of notes -// noir is having issues with loop handling in unconstrained functions -// rewrite to unconstrained and integrate into noir-aztec when fixed -fn get_balance_internal(storage_slot: Field, limit: u32, offset: u32) -> Field { - let mut balance = 0; - - let notes = view_notes(storage_slot, ValueNoteInterface, limit, offset); - let len = notes.len(); - for i in 0..len { - balance += notes[i].value; - } - // TODO - // if (notes[len - 1].is_dummy()) { - // balance += get_balance(storage_slot, limit, offset + limit); - // } - - balance -} \ No newline at end of file diff --git a/yarn-project/noir-contracts/src/contracts/zk_token_contract/src/generators.nr b/yarn-project/noir-contracts/src/contracts/zk_token_contract/src/generators.nr deleted file mode 100644 index c67babd6235c..000000000000 --- a/yarn-project/noir-contracts/src/contracts/zk_token_contract/src/generators.nr +++ /dev/null @@ -1 +0,0 @@ -global VALUE_NOTE = 2; \ No newline at end of file diff --git a/yarn-project/noir-contracts/src/contracts/zk_token_contract/src/main.nr b/yarn-project/noir-contracts/src/contracts/zk_token_contract/src/main.nr index ece46d8d5f56..1b51fbb06ba3 100644 --- a/yarn-project/noir-contracts/src/contracts/zk_token_contract/src/main.nr +++ b/yarn-project/noir-contracts/src/contracts/zk_token_contract/src/main.nr @@ -1,9 +1,17 @@ -mod balance_utils; -mod generators; mod storage; -mod value_note; contract ZkToken { + // Libs + use dep::token_utils::{ + balance_utils, + value_note::{ + value_note::ValueNote, + filter::get_2_notes, + } + }; + + use crate::storage::Storage; + use dep::aztec::abi; use dep::aztec::abi::PrivateContextInputs; use dep::aztec::context::Context; @@ -13,10 +21,7 @@ contract ZkToken { use dep::aztec::state_vars::set::Set; use dep::aztec::log::emit_encrypted_log; use dep::aztec::log::emit_unencrypted_log; - use crate::storage::Storage; - use crate::value_note::value_note::ValueNote; - use crate::value_note::filter::get_2_notes; - use crate::balance_utils; + // Constructs the contract and sets `initial_supply` which is fully owned by `owner`. fn constructor( diff --git a/yarn-project/noir-contracts/src/contracts/zk_token_contract/src/storage.nr b/yarn-project/noir-contracts/src/contracts/zk_token_contract/src/storage.nr index 23d4eb2796c0..97b2e00c0d13 100644 --- a/yarn-project/noir-contracts/src/contracts/zk_token_contract/src/storage.nr +++ b/yarn-project/noir-contracts/src/contracts/zk_token_contract/src/storage.nr @@ -1,8 +1,12 @@ -use dep::aztec::state_vars::map::Map; -use dep::aztec::state_vars::set::Set; -use crate::value_note::value_note::ValueNote; -use crate::value_note::value_note::ValueNoteInterface; -use crate::value_note::value_note::VALUE_NOTE_LEN; +use dep::aztec::state_vars::{ + map::Map, + set::Set +}; +use dep::token_utils::value_note::{ + value_note::ValueNote, + value_note::ValueNoteInterface, + value_note::VALUE_NOTE_LEN, +}; struct Storage { balances: Map>, diff --git a/yarn-project/noir-contracts/src/contracts/zk_token_contract/src/value_note.nr b/yarn-project/noir-contracts/src/contracts/zk_token_contract/src/value_note.nr deleted file mode 100644 index c0263d30ef19..000000000000 --- a/yarn-project/noir-contracts/src/contracts/zk_token_contract/src/value_note.nr +++ /dev/null @@ -1,2 +0,0 @@ -mod filter; -mod value_note; \ No newline at end of file diff --git a/yarn-project/noir-contracts/src/contracts/zk_token_contract/src/value_note/filter.nr b/yarn-project/noir-contracts/src/contracts/zk_token_contract/src/value_note/filter.nr deleted file mode 100644 index 09d0bca5fcd9..000000000000 --- a/yarn-project/noir-contracts/src/contracts/zk_token_contract/src/value_note/filter.nr +++ /dev/null @@ -1,10 +0,0 @@ -use dep::aztec::abi::MAX_READ_REQUESTS; -use crate::value_note::value_note::ValueNote; - -fn get_2_notes

(notes: [ValueNote; MAX_READ_REQUESTS], x: P) -> [ValueNote; 2] { - [notes[0], notes[1]] -} - -fn get_all_notes

(notes: [ValueNote; MAX_READ_REQUESTS], x: P) -> [ValueNote; MAX_READ_REQUESTS] { - notes -} \ No newline at end of file diff --git a/yarn-project/noir-contracts/src/contracts/zk_token_contract/src/value_note/value_note.nr b/yarn-project/noir-contracts/src/contracts/zk_token_contract/src/value_note/value_note.nr deleted file mode 100644 index 85f8ef3ce5c0..000000000000 --- a/yarn-project/noir-contracts/src/contracts/zk_token_contract/src/value_note/value_note.nr +++ /dev/null @@ -1,110 +0,0 @@ -use dep::aztec::note::note_interface::NoteInterface; -use dep::aztec::oracle::rand::rand; -use dep::aztec::oracle::get_secret_key::get_secret_key; -use dep::aztec::types::point::Point; -use crate::generators; - -global VALUE_NOTE_LEN: Field = 6; - -struct ValueNote { - value: Field, - owner: Point, - randomness: Field, - nonce: Field, - is_real: bool -} - -impl ValueNote { - fn new(value: Field, owner: Point) -> Self { - let randomness = rand(); - let nonce = 3; // Guaranteed to be random - ValueNote { - value, - owner, - randomness, - nonce, - is_real: true, - } - } - - fn serialise(self) -> [Field; VALUE_NOTE_LEN] { - [self.value, self.owner.x, self.owner.y, self.randomness, self.nonce, self.is_real as Field] - } - - fn dummy() -> Self { - ValueNote { - value: 0, - owner: Point { x: 0, y: 0 }, - randomness: 0, - nonce: 0, - is_real: false, - } - } - - fn is_dummy(self) -> bool { - !self.is_real - } - - fn validate(self, sender: Point) { - let sender_equals = (sender.x == self.owner.x) & (sender.y == self.owner.y); - assert((!self.is_real) | sender_equals); - } -} - -fn deserialise(preimage: [Field; VALUE_NOTE_LEN]) -> ValueNote { - ValueNote { - value: preimage[0], - owner: Point { - x: preimage[1], - y: preimage[2] - }, - randomness: preimage[3], - nonce: preimage[4], - is_real: preimage[5] as bool, - } -} - -fn serialise(note: ValueNote) -> [Field; VALUE_NOTE_LEN] { - note.serialise() -} - -fn compute_note_hash(note: ValueNote) -> Field { - dep::std::hash::pedersen([ - generators::VALUE_NOTE, - note.value, - note.owner.x, - note.owner.y, - note.randomness, - note.nonce, - note.is_real as Field, - ])[0] -} - -fn compute_nullifier(note: ValueNote, final_note_hash: Field) -> Field { - if (!note.is_real) { - 0 - } else { - let secret = get_secret_key(note.owner); - dep::std::hash::pedersen([ - final_note_hash, - secret, - ])[0] - } -} - -fn dummy() -> ValueNote { - ValueNote::dummy() -} - -fn is_dummy(note: ValueNote) -> bool { - note.is_dummy() -} - -global ValueNoteInterface = NoteInterface { - deserialise, - serialise, - compute_note_hash, - compute_nullifier, - dummy, - is_dummy, -}; diff --git a/yarn-project/noir-contracts/src/examples/ecdsa_account_contract.json b/yarn-project/noir-contracts/src/examples/ecdsa_account_contract.json index 8e8b94163a1d..6603ea8d4249 100644 --- a/yarn-project/noir-contracts/src/examples/ecdsa_account_contract.json +++ b/yarn-project/noir-contracts/src/examples/ecdsa_account_contract.json @@ -91,7 +91,7 @@ } ], "returnTypes": [], - "bytecode": "ed5d077455d5b6cd39c9a57710ecf4de121248e8bd57010145a5068840c010aa0a049062850016544405040444411444ba7d6f7b43b18b8854a5f7bfcee6fdff9f79be85cacc7b73dc11c7d8cbe19b8fc55af3acbdeebe7bcf7bf61c9b6ddccea8f7d2563519d2a7dfe026c3c6b41899dcaf699f2143d216756edca165f359e9519e028634309b065e9e4301afd0c02b35f02a0dbc5a03afd1c06b35b0b80696d0c0921a584a034b6b60190d2cab81e534b0bc0656d0c08a1a5849032b6b60150dacaa81d534b0ba06466b608c06d6d0c0580d8cd3c09a1a584b03e3353041036b6b601d0dacab81f534b0be0636d0c0861ad848031b6b60130d6caa81cd34b0b906b6d0c0961ad84a035b6b601b0d6cab81ed34b0bd0676d0c08e1ad84903afd3c0ce1ad84503bb6ae0f51ad84d03bbff11b8a45362ffc4941189c9b3774694482f68cea51792515846111997c9282aa3988ccb655c21e34a1957c9b85ac63532ae95515c46091925659492515a46191965659493515e46051915655492515946151955655493515d46b4395725fda69b2f1a638cfc7f6bc888951127a3a68c5a32e26524c8a82da38e8cba32eac9a82fa3818c86321ac9682ca3898ca6329ac9682ea3858c96325ac9682da38d8cb632dac9682fa3838c8e323a0531ded22b6d59e394a4d44143135393facd9e392b7d47a3d8e85a717189f13512636263fa44d7a8dd37a166745ccdbeb5126212626a26d4ec5f2321363631212e21be76dfdaf1d1b563e262136306d4ac1d3b20fac23fbd77348abec47ff041f5610caa2f6350fd1883eacf18542263500318831ac818d420c6a0921883ba9531a8c18c410d610c6a286350c98c410d630c6a386350b7310695c218d408c6a05201415deccbcd75f225a3b38c2e32bacab85e463719dd65f49071838c1b65f494d15b461f197d65f493d15f46a28c013206ca18242349c6ad3206cb182263a88c6419c3640c97719b8c14192364a4065f6e468ec213379af1698e610c6a2c6350e31883ba9d31a83b1883ba9331a8f18c414d600cca4ca48c2a8d32aa4994514dcef4854381f49be403fc161923658c963146c65819e364dc2ee30e1977ca182f63820c3331306981991498c9c187bf9962ee523690cd546d7bd94c53d1e92a3a4345ef56d17b54f45e15bd4f45ef57d1075474a68ace52d174159dada2735474ae8a3ea8a20fa9e8c32afa888ace53d14755f431157d5c45e7abe8132aba40459f54d1a754f469155da8a28b72fcbe7fcdbed0bf622fa17fc59885e2a4c6804b6a82316611a093da48f86266f6ff8715f3b7737bea7f9df4bf04829e8610343e13090ac28afe5bb92df86727d17f93a02721044dc8648282b012fe726ef33338a93de06f10f40484a089ff018224acb8017f29b7c7fec849fc5f24e871084169ff19825c5835ff746ef3fe9d93b8bf40d0a3108226fd07090ac28afe53b93dac3989fe93043d022168f27f98a020ac7e17cdedc18b3989ff13043d042168ca7f81a020ac1a6a6e73fe8c93f88b10341742d05dff258282b0e2ff6d6ee97fd649bc42d06c084153ff8b04056125fc616e33ff8a93847f43d02c0841d3fecb04056145ff4b6ef7ff4527b506fc01410f40089a4e40501056f4ef72bbf7ef38a99181a0fb2004cd20212808abc6ffe576f7df7512f74f04dd0321e86e22826213070c18e0729b7e494efe41d00c0841f764064197e830469e1bc40ba686eee5a4683ac40ba68aeee3a4682ac4cb340845f773523405e2e52e08450f70523409e2653284a2999c144d8478498350348b93a2f1102f132014a5b3ad8a645d1463a64118ba13c2d06cce224a8778c17cbd9fc349d14c8817cc17fcb99c14dd0ff182f98aff202745f742bc60bee43fc449d183102f98cdea8739299a03f182d9ae7e8491a21e086d17e65bde3cce127a18e205736686a06869b3a494c47ea949a312d396761dd62eb1739ffe4963665f50f95d72355d7a7c3b234a98a9669a996e6698bbcd3de65e739fb9df3c60669a5926ddcc3673cc5cf3a079c83c6c1e31f3cca3e631f3b8996f9e300bcc93e629f3b4596816592f4293072d56c543cfa8e812155daaa2cb54f459155daea22b5474a58a3ea7a2ab54f479157d414557abe81a157d5145d7aae84b2afab28aae53d1f52afa8a8a6e50d1575574a38a6e52d1cd2aba4545b7aae83615ddaea2af6586806f3b42c0f71aa48dafa314f06d4508f8b641085a4f29e0db8c10f06d8110f40aa5806f2342c0b70942d0064a01df068480ef550841af520af8d623047caf4008da4829e07b1921e05b07216813a5806f2d42c0f71284a0cd9402be350801df8b1082b6500af85e4008f8564308da4a29e05b8510f03d0f21681ba5806f2542c0f71c84a0ed9402bee50801df0a0841af510af89621047ccf42087a9d52c0b70421e05b0a21e80dce7debd7215ede8050f4262745db215e307b426f7152b415e205b32bf43627459b215e30fb42ef7052b411e205b333643829da00f182d91bb29c14ad8778c1ec0ebd4b29e07b06c210667be83dce227a17e2e53d0845ef735264205e2c84a20f38297a1be2e51d08451f7252f426c4cb5b108a3ee2a4e84388978f20147dcc49d1fb102f1f4028fa8491a21b1002bec510963fe52ca18f215e3e8194d0a7e402be1b3002bec5e619b3c42c35cbccb366b95961569ae7cc2af3bc79c1ac366bcc8b66ad79c9bc6cd699f5e615b3c1bc6a369a4d66b3d962b69a6d66bb79ed2202bed755f1d01b2afaa68abea5a26fabe83b2a6a54d4aae8bb2afa9e8abeafa21fa8e8872afa918a7eaca29fa8e8a72afa998a7eaea23b54f40b15fd524577aae8572afab58a7ea3a2dfaae8772afabd8afea0a23faae8aecc10f0fd8810f0ed82b4f1a39402beef1102be1f20041da314f07d8b10f07d0721e838a580ef6b8480ef1b08412728057c3b1102beaf20049da414f07d8110f07d0921e814a580ef7384806f0784a0d39402be4f1102becf20049da114f07d8c10f061bece9ea514f07d8810f06176d5ce510af8de4708f8307b6ae729057cef22047c9033a2a8084a019f4108f8202744511ea580ef6d84800f723e14e5530af8de4408f820a743519194fbd6513ec44b2484a2284e8a22205e3c084521ced38f73102fe7211465e3a4e80cc4cb590845d939293a05f1721a42510e4e8a4e40bc9c8450949393a263102fc72114e5a214f0bd0161e82884a1dc9c9ff9b9205e724328cac349510e88979c108af27252940de2253b84a27c9c144541bc842014e5e7a4281fc44b7e0845053829ca03f19217425141468a6e4408f8203ff68b2ac4594205205e0a424aa810b980ef468c80ef75f38679d3bc65de36ef1863ac79d7bc67de371f980fcd47e663f389f9d47c663e373bcc17e64bb3d37c65be36df986fcd77e67bf383f9d1ecba8880ef27553cb45b457f56d13d2afa8b8aee55d17d2aba5f450fa8e841153da4a2bfaae86f2a7a58458fa8e851153da6a2c755f4848a9e54d1532a7a5a45cfa8e859153da7a2e73554668a0e7b3aeceb70a40e47e9702813647cf29702747c121ba49dc7300af9e4a902947cf2f02114d56094f2c9b40168f9647641288aa514f39d4388f9301bff719462be3308311f66dbbf26a598ef1442cc87d9f4af4529e63b8110f361b6fce329c57cc710623ecc867f02a598ef0842cc87d9efaf4d29e6fb0d21e63b0c21a80ea598ef1042ccf72b84a0ba9462be030831df410841f528c57cfb1062befd1082ea538af97e4188f9f642086a4029e6fb1921e6db0321a821e71e7603889786108a1a7152540fe2a53e84a2c69c14d58178a90ba1a809274509102fb5211435e5a4a816c44b3c84a2669c14c541bcd48450d49c93a21a102fb1108a5a508af97643188a8130d492b3885a40bcb48450d48a93a266102fcd2114b5e6a4a809c44b5308456d38296a04f1d21842515b4e8ada40bcb48550d48e93a256102fad2114b567a4082132333f4158eec05942ed205eda434aa803b998af2046ccf793d96d7e367bcc2f66afd967f69b03e6a039647e35bf99c3e688396a8e99e3e68439694e99d3e68c396bce99f3d68bb09e673ddf7a91d68bb25e4897f4592f9b2e25caaec3397438a70ee7d2e1dc3a9c4787f3ea703e1dceafc30574b8a00e17d2e1c23a5c44872fd3e1a23a5c4c872fd7e12b74f84a1dbe4a87afd6e16b74f85a1d2eaec32574b8a40e97d2e1d23a5c4687cb668ad8af0c44ec5716d2ee87728afd4a41c47ea5211425738afd4a40c47e2521140d6314fb495f02a8fda47d41281ace28f793c60fd0fbc9e70384a2db18057ff2c90a50fcc9073084a21446c99f2c5d009a3f59e140281ac128fa93b52140f5274b480845a98cb23f597c03747fb2468750349251f827df6e00ca3ff91204a16814a3f44fbe3e02b47ff22d1342d16846f19f7c3f07a8ffe46b3c84a2318cf23fd90001e8ff649f0442d1584601a0ec30011480b21105a1681ca30450b6f0001a40d9e98350743be7def7388897db2114ddc149d1188897b1108aeee4a46814c4cb680845e339294a85781909a16802274529102f2320144de4a46838c4cb6d108ad238294a86781906a16812a308504e3e21140d85503499b38a2641bc4c8650348593a289102f69108aeee2a4683cc4cb040845533929ba03e2e54e0845d338299a0af1320d42d1744e8aa640bcdc05a1680623458510a979985794decd5943d3215e66406ae86e72196021880c500a4a16a3b24f279b6cb2a129bb91b2f32bdbb6b2452efbdb729620070172e8222726723a25474b728c27677072de29879572302ca7ba72822ec7dfd6bbd67ac5ad270e4b5aaf94f54a5baf8cf5ca5e4c20584e971f95d7e10a3a5c51872be970651daea2c35575b89a0e57d7e1681d8ed1e11a3a1cabc3713a5c53876be970bc0e27e8706d1daea3c37575b89e0ed7d7e1063adc50871be970631d6ea2c34d75b8990e37cf14816033884010f3f3a6a59c02c126108120e6e74dcb3805828d200241cccf9b9ee5140836800804316fa058ce2910ac07110862de40b182532058072210c4bc816225a74030012210c4bc81e2394e81602d884010f3068a559c02c138884010f3068ae739058235200241cc1b285ee0140846430482985750ace6140856830804ab43285ac32910ac021108568550f422a740b0124420581942d15a4e8160058840b02284a2973877c5d742bcbc04a1e8654e8ad640bcbc08a1681d27452f40bcac8650b49e93a255102fcf43287a8593a295102fcf4128dac049d172889715108a5ee5a46819c4cbb3108a36720a04cb43285a0aa1681367156d8478d904a1683327451b205e5e8550b48593a2f5102faf4028daca49d1cb102feb20146de3a4682bc4cb360845db3929da0cf1b20542d16b8c14417e94ee9583d0fc3a670d6d8778790d5243af930b040b830482e564312afb74b2c9261b9ab21b293bbfb26d2b5be4b2bf2d6709721020872e726222a75372b424c778720627e79d72582907c372aa2b27e872fc6dbd06d66b68bd46d66b6cbd26d66b6abd66d66b7e3181600b5d7ed452875be9706b1d6ea3c36d75b89d0eb7d7e10e3adc51873be9f0753adc5987bbe870571dbe5e87bbe970771deea1c337e8f08d3adc53876fd2e19b75f8161deea5c3bd75b88f0ef7d5e17e3adc5f8713334520d81f22104c847c10ece21408f6850804fb4128fa895320d81b2210ec03a16837a740f0168840b01784a29f39058237410482374328dac32910bc112210ec09a1e8174e81600f8840f00608457b390582dd2002c1ee108af6710a04bb420482d74328dacf2910ec0c110876815074805320d8092210bc0e42d1414e8160078840b02384a2439c02c176108120e6528f5f3905826d200241cced42bf710a045b41048298db850e73ee8aff06f1721842d1114e8a0e41bcfc0aa1e828274507205e0e42283ac649d13e8897fd108a8e7352f40bc4cb5e0845273829fa19e2650f84a2939c14612ebbdb0da1e814a740b02584a25d108a4e7356d1298897d3108ace70527402e2e52484a2b39c141d8378390ea1e81c274547205e8e42283acf49d1398897f3088a42119c149d8178390ba1c863a4a8084420d8024173c8a7aca15004c48b07a9219f5c20580424106c218b51d9a7934d36d9d094dd48d9f9956d5bd92297fd6d394b9083003974911313399d92a32539c693333839ef94c34a391896535d394197e36febdd62bd5ed6eb6dbd3ed6eb6bbd7ed6eb6fbdc48b090407e8f2a3813a3c48879374f8561d1eacc3437478a80e27ebf0301d1eaec3b7e9708a0e8fd0e1541d1ea9c3a37478b40e8fd1e1b13a3c4e876fd7e13b74f84e1d1eafc3137478a20ea7e9f0241d9eacc35374f8ae4c11084e81080421af230e95e414084e820804212fd80f95e214084e840804212fd80f95e614088e870804212fd80f95e11408de011108425eb01f2acb29101c071108422e410b95e314088e8108042197a085ca730a0447410482904bd04215380582a9108120e412b450454e81600a442008b9042d54895320381c2210845c8216aacc29104c8608042197a085aa700a0487400482904bd04255390582b742048283211455e314080e82080493201455e7dc15af06f102799b69289a93a22a102f90b79986623829aa04f102799b69a806274515205e206f330dc5725204793f49a83c84a2384e8aca40bc948550549393a252102fa52114d5e214080e8450541242513c6715d5827881dc38114ae0a4280ee20572e344a836274535205e20374e84ea7052140df102b97122549793a23a102f903b9442f538294a807881dca114aacf48d1651081e00008cd0d386ba81ec40be436370845992910bc0c24101c208b51d9a7934d36d9d094dd48d9f9956d5bd92297fd6d394b9083003974911313399d92a32539c693333839ef94c34a391896535d394197e36feb8db7de04eb4db45e9af526596fb2f5a658efae8b0904a7eaf2a3693a3c5d8767e8f0dd3a7c8f0edfabc3f7e9f0fd3afc800ecfd4e1593a9caec3b375788e0ecfd5e10775f8211d7e58871fd1e1793afca80e3fa6c38febf07c1d7e428717e8f0933afc940e3fadc30b757851a60804174204828b201f0437730a049f8208049f8650740ba74070014420f82484a25e9c02c1f91081e013108a7a730a041f8308041f8750d4875320380f22107c1442515f4e81e0c31081e023108afa710a041f8408041f8250d49f5320380722109c0ba128915320980e1108ce865034805320381322109c05a16820a740f07e8840f001084583380582f7420482f741284ae21408de0d1108de03a1e8564e81e0748840700684a2c19cbbe2b742bc6064a64338291a04f18291990ee5a408737034104251322745fd215e20f79684867152d417e205726f4968382745bd215e20f796846ee3a4e8168817c8bd25a1144e81e0340845907b4b422338ab2805e205f353c0544e8a8643bc607e0a389293a2648817cc4f014771523404e205f353c0d19c148d8278c1fcb87d0c2745a9102f981fb78f65a4a8284420381542f338ce1a1a03f18279cdc63872816051904070aa2c46659f4e36d9644353762365e757b66d658b5cf6b7e52c410e02e4d0454e4ce4744a8e96e4184fcee0e4bc530e2be560584e75e5045d8ebfad37df7a4f586f81f59eb4de53d67bda7a0badb7e86202c1c5bafce8191d5ea2c34b7578990e3fabc3cb7578850eafd4e1e77478950e3fafc32fe8f06a1d5ea3c32feaf05a1d7e49875fd6e1753abc5e875fd1e10d3afcaa0e6fd4e14d3abc5987b7e8f0561ddea6c3db75f8b54c11086e8708042177cd871ee114086e850804b741289ac72910dc0c11086e8150f428a74070234420b80942d1639c02c10d1081e0ab108a1ee71408ae8708045f8150349f5320f8324420b80e42d1139c02c1b51081e04b108a16700a04d74004822f42287a925320f8024420b81a42d1539c02c1551081e0f3108a9ee61408ae8408049f8350b4905320b81c22105c01a16811a74070194420f82c84a2c59c02c1251081e0520845cf70ee8a2f8678790642d1124e8a1642bc607e50ba9493a2a7205e303f285dc649d1028817cc0f4a9fe5a4683ec40be607a5cb39297a0ce205f383d2159c14cd8378c1fca07425a740f0190845981f943ec759452b215e30dfd1567152b41ce205f31ded794e8a9641bc60bea3bdc049d1128817cc77b4d59c14bd00f182d9755cc349d12a8817ccaee38b8c141583080431bb056b396b680dc40be6fc632db940b0184820b85816a3b24f279b6cb2a129bb91b2f32bdbb6b2452efbdb729620070172e8222726723a25474b728c27677072de29879572302ca7ba72822ec7dfd6db68bd4dd6db6cbd2dd6db6abd6dd6db6ebdd7fe5820b8b84babc6356ad64adf19f16dbaf54239c444052632307e60bcc044e44837e7659c937156c61919a7659c927152c60919c7651c937154c611198765fc26e3571987641c947140c67e19fb64ec95f18b8c3d327e96b15bc64fc15f5636306502533a30a5025332302502533c30d706e69ac05c1d98ab02736560ae08cce581291698a281b92c30450253383085025330300502933f30f9029337307902933b30b9029333303902933d30d902d33c30cd02d334304d02d338308d02d330300d02533f30f5025337307502533b300981890f4cadc0d40c4c5c6062035323303181890e4cf5c0540b4cd5c054094ce5c0540a4cc5c054084cf9c0940b4c6260fa07a65f60fa06a64f607a07a657606e09cccd81b929303d037363606e084c8fc0740f4cb7c05c1f98ae81e91298ce81b92e309d02d331301d02d33e30ed02d336306d02d33a30ad02d332302d72b8bb70dd7db9ee4e5d77efaebb9bd7dddfebeef875f700bbbb82dd7dc2eece61772fb1bbbbd8dd6fecee4076f724bbbb94dd7dcbee4e66776fb3bbdbd9ddffecee8876f748bbbba6dd7dd4eece6a77afb5bbfbdadd8fedeed076f76cbb57f1b9d7f5b957fab9d7feb95703bad707ba570cbad710ba5715bad719ba571ebad722ba5727bad72bba5730bad734ba5739bad73dba5742bad746ba574bbad74fba5754bad758ba575dbad761ba5766bad76aba576fbad773ba5778bad77c3a25a0530b3a45a1531d3a65a2532f3a85a353413aa5a453533ac5a553653ae5a653773a05a853893a25a9539b3a45aa53ad3a65ab53bf3a85ac53d13aa5ad53e33ac5ae53f53ae5af53073b05b15319bb4ef6baf5deb0de9bd67bcb7a6f5bef1deb19eb59ebbd6bbdf7acf7bef53eb0de87d6fbc87a1f5bef13eb7d6abdcfacf7b9f57658ef0beb7d69bd9dd6fbca7a5f5bef1beb7d6bbdefacf7bdf57eb0de8fd6dbf5076d6c65f37efd47f4e992d86fb834b3c13173258a74e902d20da42b4877902e21dd42ba86740fe922d24da4ab4877912e23dd46668dcc1e9945329b6456c9ec925926b34d669dcc3e9985321b6556caec94592ab355666d7c9068ba4c6499d032b16582cb4497092f135f1a8034026908d218a44148a3908621852f134026824c089918324164a2c884918923134826924c28995832c164a2c9849389d75dfe8a46e9460ad1481d1a2943235568a4088dd4a09112345281460ad048fd19293f23d567a4f88cd49e91d2335279460acf48dd19293b235567a4e88cd49c9192335271460ace48bd19293723d566a4d88cd49a9152335264466acc488919a930230566a4be8c949791ea32525c466acb486919a92c238565a4ae8c949591aa325254466aca484919a928230565a49e8c9493916a32524c466ac9482919a924238564a48ecc62193fcaf8c1b12cf514d4d61b817933306f05e6edc0bc131813181b987703f35e60de0fcc0781f930301f05e6e3c07c12984f03f359603e0fcc8ec07c11982f03b333305f05e6ebc07c13986f03f35d60be0fcc0f81f93130bb7258efa7dfafc0d2116b27ef27c82275f7a53b497ba6494ad290214903e7ce92e54252f2c021899875938bee52574e2ea6a1c387245aefe79973d296b619397478eb011d86a5a64744a62d6a3a2c79446aba37ebd2834d5bd12429b94fcad816498943fa771c3e27e2e96649a3bc88855d52870d9f3d7326e02ff8e71a9a351b42af708279507b00659429f9ed9989fefec4435866cdbbcba0b3ee97ac59f73b7285114c09ed259c7392dd5ec48cfbbfd29e4d57dad8800ab305541031f917354e49e9337667442debedb3de7eeb1db0de41eb1db2deafd6fbcd7a87ad77c47a47ad77cc7ac7ad77c27a27ad77ca7aa7ad77c67a67ad77ce7ae7ad1f617dcffabef523ad1f65fd90f5b3593fbbf573583fa7f573593fb7f5f3583faff5f3593fbff50b58bfa0f50b59bfb0f58b58ff32eb17b57e31eb5f6efd2bac7fa5f5afb2fed5d6bfc6fad75abfb8f54b58bfe4cc79694fb71f362a3dd2bff06fdfbbf06fd90df9479f8a98057846cfb618969298343039f836327b753fb19d529246f5494d0cbea2a4260d4b9e95b6b455629fe18eb8f4a85ab3d356744e1c9834223531a57572ffc4315e86fff633fc77e485a84351ff883e94b630e8b9b3725cf8ef08ef1f2d11f232c9a0f55c6a9dfdf38edb92eb460e4b4d4a4c4e9d8bfa783d70e98f0cf1f151c3faa5ad5f6ab3f6c33dbf94a7c2a5cd59dcb1f6ff3fc203089e7dc00d840147d80d5c7c391da429a7b2d62fa3975319bd9cca664e391d84945319483995652fa7c334e554defae5f4722aa79753f9cc29a7c390722a0729a7f2ece57484a69c2a5abf825e4e15f472aa9839e57404524e1520e55491bd9c8ed2945365eb57d2cba9925e4e9533a79c8e42caa912a49c2a9397935f92a69caa5abf8a5e4e55f472aa9a29e5e49784f05c05524e55c3f746cf7d9087550db9bb853e304144f7ff5bb77ef5acaddb0cf40a27980715cd786012e4170d3f3049c76c3941666f0c65590581616e79f984522d087a78982be63f613ef1f66b401b786c5603cf40af7082795071940d5cf28be33cf1861306694d85219f4dfb21edad26f5cab226b431d5ca6a4c19e8154e300f2a9eb231497ef161bdb24ca02cab78090cb3b2fc2c9c5796b5212bcbcfa85796b5a10dbc4e5603cf40af7082795075291bb8e457977465599771655910f2d9740cd2deea51af2ceb411b53fdacc694815ee104f3a01a503626c9af4158af2c1b52965503090cb3b2dc11ce2bcb469095e50eea95652368036f9cd5c033d02b9c601e5413ca062ef935215d5936a19e7755a0f3ae69d6bccb40af70827950cd28e79de4d72cac174ecd29cbaa99048659387d19ce0ba7169085d397d40dbc05b481b7cc6ae019e8154e300faa15650397fc5a912e9c5a51cfbb72d079d73a6bde65a05738c13ca83694f34ef26b13d60ba7b69465d54602c32c9cbe0ae785533bc8c2e92bea06de0edac0db6735f00cf40a279807d581b2814b7e1d48174e1da8e75d05e8bceb9835ef32d02b9c601e5427ca7927f9750aeb85d3759465d54902c32c9cbe09e7855367c8c2e91bea06de19dac0bb6435f00cf40a279807d595b2814b7e5d49174e5da9e75d25e8bcbb3e6bde65a05738c13ca86e94f34ef2eb16d60ba7ee9465d54d02c32c9cbe0be785530fc8c2e93bea06de03dac06fc86ae019e8154e300fea46ca062ef9dd48ba704210f6af2f4d59d229b17f62ca88c4e4d9b3d3adb7df9c0b5e74e86c19732e42fed5d3fa37a97f6e67448cfcc943c19ff17e75f637f7e7cb395bc1d94aee7f3fe6ec71674f387bd2d953ce9e76f68cb3679d3de7ec79e721c259cf59dfd94867a39c0d399bcdd9eccee67036a7b3b99ccded6c1e67f33a9bcfd9fcce1670b6a0b3859c2dec6c11672f73b6a8b3c59cbddcd92b9cbdd2d9ab9cbddad96b9cbdd6d9e2ce96b8c0e6cdd6bfe5a24f619ffb133d9dbdf9c29feb65fddebcab823ee05e45955cdf704eae5f3827d73f9c934b0ce7e40684737203c339b941e19c5c523827776b382737389c931b12cec90d0de7e492c339b961e19cdcf0704eeeb6704e2e05905c66ed5f1685ee5e8ec8dabdfc1db9c208662b2e9570ef52b24b65bed10950dad8808ab005540877a3d3a3d61f69fd51d61f6dfd31d61f6bfd71d6bfddfa7758ff4eeb8fb7fe84ffc6754aeb12936f1b993832b1d3c8be4392fafdef854a01f4fb4b9572535faa14ccfe4b7dd499fb26f7d1346f724fb3fe44fd4dee13f537b9a765ce9bdc4743789e0879937b1afbc5006368ca69b2f527e9e534492fa7c999534e63203c4f8294d364f672ba83a69ceeb2fe14bd9ca6e8e57457e694d31d109ea740cae92ef672ba93a69ca6597faa5e4e53f5729a9639e5742784e7a990729ac65e4ee369ca6986f5a7ebe5345d2fa71999534ee3213c4f8794d30c46b95e5108cd23215eeea67ea3e4ddd0edae7bb2b6bb32d02b9c601ed4bd94623dc9ef5e4eb5b59f0af1721f6559dd2b8161d4d63f50aaad410fef7e88dafa076ab5f5fdd006fe405603cf40af7082795033291bb8e43793546d3d93f15de545208d6914c4cb2cea95e52c68634acf6a4c19e8154e300f6a36656392fc6687f5ca720e6559cd96c0302bcb5de1bcb29c0b5959eea25e59ce8536f007b31a78067a8513cc837a88b2814b7e0f91ae2c1f625c59168234a609102f0f53af2c1f8636a647b21a53067a8513cc839a47d99824bf7961bdb27c94b2ace649609895e5ee705e593e065959eea65e593e066de08f6735f00cf40a279807359fb2814b7ef3495796f3a9e7dd14e8bc7b226bde65a05738c13ca80594f34ef25b10d60ba72729cb6a8104865938ed09e785d3539085d31eea06fe14b4813f9dd5c033d02b9c601ed442ca062ef92d245d382da49e7753a1f36e51d6bccb40af708279508b29e79de4b738ac174ecf5096d562090cb370da1bce0ba7259085d35eea06be04dac0976635f00cf40a279807b58cb2814b7ecb48174ecba8e7dd74e8bc7b366bde65a05738c13ca8e594f34ef25b1ed60ba7159465b55c02c32c9cf687f3c2692564e1b49fba81af8436f0e7b21a78067a8513cc835a45d9c025bf55a40ba75599ff32777f947b81f84467275d788df8f3d67fe15fd3b9f466b43a3358bef4b0d67086f52267586b39c37a8933ac9739c35ac719d67aceb05ee10c6b036758af7286b59133ac4d9c616de60c6b0b67585b39c3dac619d676ceb05ee30ceb75ceb0dee00ceb4dceb0dee20ceb6dceb0dee10ccb70866539c37a9733acf738c37a9f33ac0f38c3fa9033ac8f38c3fa9833ac4f38c3fa9433accf38c3fa9c33ac1d9c617dc119d6979c61ede40ceb2bceb0be0684a55fe01b2b474363dd39d138676f77768ab3539d9deeec0467573bbbc6d9179d5debec4bcebeecec3a67d73bfb8ab31b9c7dd5d98dce6e7276b3b35b9cddeaec3667b73bfb9ab3af3bfb86b36f3afb96b36f3bfb8eb3c659ebecbbcebee7ecfbce7ee0ec87ce7ee4ecc7ce7ee2eca7ce7ee6ece7ceee70f60b67bf7476a7b35f39fbf585d3b46facffed454fe146ba3ff1bcb3df5cf873df59ff7b5e55c80f8467d505acb717a30939089ee398ecfcbe98ec0e6586e2e5d24bea478856e520c40b2945bbc29922a6f6f613617bf360eded30617bf3acdf1f93dd11ceb9bb1b32eb0e43bc9052f4733853c4d4def610b6b79cb0f6769cb0bde5b4fe6d98ec4e70cedd5f20b3ee38c40b29457bc39922a6f6b68f5248ddcbfa83307b3dfb091b1c32bf03e15c9c07c1c54995dc21c299970bb6b0384d38ef72597f2026bb339c9f9abf423eef4e43bc9052f45b3853c4d4de0e13b6373305d6dfce13f63749cfef07492f5b04e7ec3d029977e7115e58293a1ace143135b863840d2e12d5dfb24512f6b748eb0fc56417c5397721fb15d922215e48293a11ce1431b5b79384ed2d0facbd65276c6f79ac9f88c92e07e7dc3d059975d9215e48293a1dce1431b5b73384ed2d046b6fb909db5bc8fac331d9e5e19cbb6721b32e37c40b2945e7c29922a6f6769eb0bde580b5b7fc84ed2d87f5fb60b22b403977232320b32e3fc40b29455e385344d4de227dc2f6960fd6de0a13b6b77cd61f86c9ae08e7dcc56c0915867821a5282a9c29626a6f21c2f616056b6fc508db5b94f59330d95dce3977b341665d318817528ab28733454ced2d07617bcb0f6b6f5711b6b7fcd6bf1593ddd59c73372764d65d05f1424a51ae70a688a9bde5266c6fb961edad38617bcb6dfd0198ec4a70cedd3c9059571ce28594a2bce14c11537bcb47d8def2c2da5b69c2f696d7fac998ecca70ce5dcc8e77698817528a0a8433454cedad20617bcb066b6fe509db5b36eb0fc164578173ee1682ccbaf2102fa414150e678a98da5b11c2f6e6c3da5b65c2f6e65b3f05935d15ceb97b1964d655867821a5a8683853c4d4de8a11b6b7ecb0f6569db0bd65b7fe604c76d19c73f772c8acab0ef1424ad115614c11e6852fa9d6ff19334b6229f3fbc9fabb31f9c57196f89590e28c857889232df1c8a298128867cc2fb288ac7431f925709638e668371ee22581b58b9fc094405dcafc8e59ff3826bf7a9c257e35a438eb42bcd463ede2d93125d090b28b876c64364c7e8d384bfc1a487136847869c4dac5cf614aa029657e67ac7f16935f33ce12bf16529c4d215e9ab176f1c298126849d9c50bcaa11a26bf569c258ed121b5847869c5dac58f624aa02d657e87ad7f04935f3bce122f0129ceb6102f708a204f2eb2246758a538c32acd195619ceb0ca7286558e33acf29c6155e00cab2267589538c3aacc195615ceb0aa7286558d33acea9c61d11ed21ec02cb93b52e6b7cffafb31f975e2fc4a1103f932d011e2a513e7ccabc119562c67589c27eddf59ff2026bf9a9cb4d7e20c2b9e33ac04ceb06a7386558733acba9c61d5e30cab3e67580d38c36ac81916ebe970e41598457217caa3b36236f2724c7e5d39bf0434862cdfbb40bc74652d710f5302dd29f33b6f232330f9f5e02cf12690e2ec0ef1d283752b07f49b9b9e94f9edb1fe2f98fc6ee22c718c3aa727c4cb4dac25fe1ba6047a51e677c8fabf62f2ebcd59e2cd20c5d90be2a537eb42252fa604fa51aec573dbc83c98fcfa739678734871f68378e9cfdac54f634a6020657e27ad7f0a93df20ce126f0129ce81102f8358bb78014c090ca6ece2f96c647e4c7e43384b1c23231e0cf13284b5c4a33025308cb2c47d1b1989c96f386789b78214e7308897e1ac259e0b530223284b3c878dcc89c92f95b3c45b438a7304c44b2aeb5a7c17a6044653e6f783f57fc4e43786b3c4db408a7334c4cb98cc78cdd62587e5de6372e944b7e54cee2a4872ed3893bb1a925c7bcee4ae8124d78133b96b21c975e44cae3824b94e9cc9958024771d67722521c975e64cae1424b92e9cc9958624d79533b93290e4aee74cae2c24b96e9cc9958324d79d33b9f290e47a7026570192dc0d9cc9558424772367729520c9f5e44cae3224b99b3893ab0249ee66cee4aa4292bb8533b96a90e47a7126571d925c6fcee4a221c9f5e14c2e06925c5fcee46a4092ebc7995c2c24b9fe9cc9c541924be44cae2624b9019cc9d58224379033b97848728338934b802497c4995c6d4872b77226570792dc60cee4ea42921bc2995c3d4872433993ab0f492e9933b90690e4867126d71092dc70cee41a4192bb8d33b9c690e45238936b02496e0467724d21c9a57226d70c92dc48cee49a43921bc5995c0b4872a339936b09498e54b5d70a92dc58cee45a43921bc7995c1b4872b75f7a723b237a7a7e6454285bf61c3973e5ce93375ffe02050b152e7259d162975f71e555575f736df112254b952e53b65cf90a152b55ae52b55af5e8981ab171356bc527d4ae53b75efd060d1b356ed2b459f3162d5bb56ed3b65dfb0e1d3b5dd7b94bd7ebbb75ef71c38d3d774648ae6d6d643b1bd9de4676b0911d6d64271b799d8dec6c23bbd8c8ae36f27a1bd94d4ef7e50c5c4e8ae53c554e1de56c4e4eb0e49c474e43e4cc4076d665ff597669652f5376fc645f4c768f648f457622e4fbba7cab95ef7ef20d49be47c86a5bd6a4b27293f58dac02e4b3523e51a4ef4a7792392c952ef520acfd0f", + "bytecode": "ed5d07945545b6ed7b9b0748ce98c93975826e72ce51404051890db440834d1355a001094668c0808aa880808028888248365799138a5944242a39ff738bf9ff8f3dce4165f7cc5e6fb56bd571397b389cb3efa9f3ea55ed776b8ecd3e6e67b6f7d2563519d2a7dfe026c3c6b41899dcaf699f2143d216756edca165f359e9d93c050c6960760dbc3ca7025ea181576ae0551a78b5065ea381d76a60090d2ca981a534b0b40696d1c0b21a584e03cb6b60050daca8819534b0b20656d1c0aa1a584d03ab6b600d0d8cd2c0680d8cd1c0580d8cd3c09a1a584b03e3353041036b6b601d0dacab81f534b0be0636d0c0861ad848031b6b60130d6caa81cd34b0b906b6d0c0961ad84a035b6b601b0d6cab81ed34b0bd0676d0c08e1ad84903afd3c0ce1ad84503bb6ae0f51ad84d03bbff11b8a45362ffc4941189c9b37746944c2f68cea51792515846111945651493515cc6e532ae9071a58cab645c2de31a19d7ca2821a3a48c52324acb2823a3ac8c7232cacba820a3a28c4a322acba822a3aa8c6a32aacba82123ca9cab9a7ed3cd178d315afebf31326265c4c9a829a3968c781909326acba823a3ae8c7a32eacb6820a3a18c46321acb6822a3a98c66329acb6821a3a58c56325acb6823a3ad8c7632dacbe820a3a38c4e418cb7f44a5bd638252975d0d0c4d4a47eb367ce4adfd12836aa565c5c627c4c62746c749fa898da7d136a46c5d5ec5b2b213a21ba6642cdfe3109b1b189097109f1b5fbd68e8faa1d1d179b183da066edd8015117fee9bda351d425fe830faa0f63507d1983eac718547fc6a01219831ac018d440c6a006310695c418d4ad8c410d660c6a0863504319834a660c6a186350c31983ba8d31a814c6a0463006950a08ea625f6eae932f199d657491d155c6f532bac9e82ea3878c1b64dc28a3a78cde32fac8e82ba39f8cfe3212650c903150c6201949326e953158c61019436524cb182663b88cdb64a4c818212335f8723372149eb8d18c4f730c63506319831ac718d4ed8c41ddc118d49d8c418d670c6a026350662265546994514da28c6a72a62f1c0aa4df241fe0b7c8182963b48c3132c6ca1827e3761977c8b853c678191364988981490bcca4c04c0e3efccd147397b2816ca66adbcb669a8a4e57d1192a7ab78adea3a2f7aae87d2a7abf8a3ea0a2335574968aa6abe86c159da3a27355f441157d48451f56d14754749e8a3eaaa28fa9e8e32a3a5f459f50d1052afaa48a3ea5a24fabe842155d94f3f7fd6bf685fe157b09fd2bda2c142731032ea909469b45804e6a23e18b99d9ff1f56f4dfceeda9ff75d2ff12087a1a42d0f84c2428082bea6fe5b6e09f9d44fd4d829e8410342193090ac24af8cbb9cdcfe0a4f680bf41d013108226fe070892b0e206fca5dc1efb2327f17f91a0c72104a5fd67087261d5fcd3b9cdfb774ee2fe02418f42089af41f2428082bea4fe5f6b0e624ea4f12f40884a0c9ff618282b0fa5d34b7072fe624fe4f10f41084a029ff058282b062d4dce6fc1927f11721682e84a0bbfe4b040561c5ffdbdcd2ffac937885a0d91082a6fe17090ac24af8c3dc66fe152709ff86a0591082a6fd97090ac28afa97dceeff8b4e6a0df803821e8010349d80a020aca8dfe576efdf71129381a0fb2004cd202128082be6ff72bbfbef3a89fb2782ee811074371141b18903060c70b94dbf2427ff20680684a07b3283a04b74182dcf0de2055343f77252341de2055345f771523415e2651a84a2fb39299a02f1721784a20738299a04f1321942d14c4e8a2642bca441289ac549d178889709108ad2d95645b22e8a36d3200cdd096168366711a543bc60bedecfe1a46826c40be60bfe5c4e8aee8778c17cc57f9093a27b215e305ff21fe2a4e8418817cc66f5c39c14cd8178c16c573fc248510f84b60bf32d6f1e67093d0cf18239334350b4b459524a62bfd4a45189694bbb0e6b97d8b94fffa431b32fa8fc2eb99a2e3dbe9d1125cd5433cd4c3733ccdde61e73afb9cfdc6f1e3033cd2c936e669b3966ae79d03c641e368f9879e651f39879dccc374f9805e649f39479da2c348bac17a1c98316abe2a1675474898a2e55d1652afaac8a2e57d1152aba52459f53d1552afabc8abea0a2ab55748d8abea8a26b55f425157d5945d7a9e87a157d454537a8e8ab2aba514537a9e86615dda2a25b55749b8a6e57d1d73243c0b71d21e07b0dd2c6d7510af8b622047cdb2004ada714f06d4608f8b640087a8552c0b71121e0db04216803a5806f0342c0f72a84a05729057ceb1102be5720046da414f0bd8c10f0ad8310b48952c0b71621e07b0942d0664a01df1a8480ef4508415b28057c2f20047cab21046da514f0ad4208f89e8710b48d52c0b71221e07b0e42d0764a01df7284806f0584a0d728057ccb1002be672104bd4e29e05b8210f02d8510f406e7bef5eb102f6f40287a9393a2ed102f983da1b73829da0af182d9157a9b93a2cd102f987da1773829da08f182d919329c146d8078c1ec0d594e8ad643bc607687dea514f03d036108b33df41e6711bd0bf1f21e84a2f7392932102f1642d1079c14bd0df1f20e84a20f39297a13e2e52d08451f7152f421c4cb47108a3ee6a4e87d88970f20147dc248d10d0801df6208cb9f7296d0c7102f9f404ae8537201df0d1801df62f38c5962969a65e659b3dcac302bcd73669579debc60569b35e645b3d6bc645e36ebcc7af38ad9605e351bcd26b3d96c315bcd36b3ddbc761101dfebaa78e80d157d5345df52d1b755f41d15352a6a55f45d157d4f45df57d10f54f44315fd48453f56d14f54f45315fd4c453f57d11d2afa858a7ea9a23b55f42b15fd5a45bf51d16f55f43b15fd5e457f50d11f5574576608f87e4408f87641daf8514a01dff70801df0f10828e510af8be4508f8be8310749c52c0f73542c0f70d84a0139402be9d0801df5710824e520af8be4008f8be8410748a52c0f73942c0b70342d0694a01dfa70801df671082ce500af83e4608f8305f67cf520af83e4408f830bb6ae728057cef23047c983db5f39402be7711023ec81951b6084a019f4108f8202744d93c4a01dfdb08011fe47c289b4f29e07b1321e0839c0e658ba4dcb7cee643bc444228cac6495104c48b07a128c479fa710ee2e53c84a2ec9c149d8178390ba128072745a7205e4e4328cac949d109889793108a2ee3a4e818c4cb710845b928057c6f40183a0a612837e7677e2e8897dc108af270529413e2e5320845793929ca0ef1920342513e4e8ab241bc842014e5e7a4281fc44b7e0845053829ca03f19217425141468a6e4408f8203ff6cb5688b3840a40bc14849450217201df8d1801dfebe60df3a679cbbc6dde31c658f3ae79cfbc6f3e301f9a8fccc7e613f3a9f9cc7c6e76982fcc9766a7f9ca7c6dbe31df9aefccf7e607f3a3d9751101df4faa7868b78afeaca27b54f41715ddaba2fb5474bf8a1e50d1832a7a48457f55d1df54f4b08a1e51d1a32a7a4c458fabe809153da9a2a754f4b48a9e51d1b32a7a4e45cf6ba8cc141df674d8d7e1481dcea6c3a14c90f1c95f0ad0f1496c90761ecd28e493a70a50f2c9c3875014c328e5936903d0f2c9ec8250144b29e63b8710f36136fee328c57c6710623eccb67f4d4a31df2984980fb3e95f8b52cc770221e6c36cf9c7538af98e21c47c980dff044a31df1184980fb3df5f9b52ccf71b42cc771842501d4a31df218498ef5708417529c57c071062be831082ea518af9f621c47cfb2104d5a714f3fd8210f3ed8510d48052ccf73342ccb707425043ce3dec06102f0d211435e2a4a81ec44b7d08458d3929aa03f152174251134e8a12205e6a43286aca49512d8897780845cd38298a8378a909a1a839274531102fb1108a5a508af97643188a8630d492b3885a40bcb48450d48a93a266102fcd2114b5e6a4a809c44b5308456d38296a04f1d21842515b4e8ada40bcb48550d48e93a256102fad2114b567a4082132333f4158eec05942ed205eda434aa803b998af2046ccf793d96d7e367bcc2f66afd967f69b03e6a039647e35bf99c3e688396a8e99e3e68439694e99d3e68c396bce99f3d68bb09e673ddf7a91d6cb66bd902ee9b35e765d4a94438773eaf0653a9c4b8773eb701e1dceabc3f97438bf0e17d0e1823a5c48870beb70111d2eaac3c574b8b80e5faec357e8f0953a7c950e5fadc3d7e8f0b53a5c42874bea70291d2eadc36574b8ac0e97cb14b15f5988d8af1ca4dd0fe514fb958688fdca40284ae614fb958488fd4a41281ac628f693be0450fb49fb8250349c51ee278d1fa0f793cf070845b7310afee49315a0f8930f600845298c923f59ba00347fb2c28150348251f4276b4380ea4f9690108a5219657fb2f806e8fe648d0ea16824a3f04fbedd00947ff2250842d12846e99f7c7d0468ffe45b2684a2d18ce23ff97e0e50ffc9d77808456318e57fb20102d0ffc93e0984a2b18c0240d96102280065230a42d1384609a06ce1013480b2d307a1e876cebdef71102fb74328ba8393a231102f632114ddc949d1288897d1108ac67352940af1321242d1044e8a52205e4640289ac849d1708897db2014a57152940cf1320c42d1244611a09c7c42281a0aa1683267154d8278990ca1680a274513215ed22014ddc549d178889709108aa672527407c4cb9d108aa671523415e2651a84a2e99c144d8178b90b42d10c468a0a2152f330af28bd9bb386a643bccc80d4d0dde432c0421019a014942c46659f4e36d9644353762365e757b66d658b5cf6b7e52c410e02e4d0454e4ce4744a8e96e4184fcee0e4bc530e2be560584e75e5045d8ebfad77adf54a584f1c96b25e69eb95b15e59eb95bb9840b0bc2e3faaa0c31575b8920e57d6e12a3a5c5587abe970751daea1c3513a1cadc3313a1cabc3713a5c53876be970bc0e27e8706d1daea3c37575b89e0ed7d7e1063adc50871be970631d6ea2c34d75b8990e37cf14816033884010f3f3a6a59c02c126108120e6e74dcb3805828d200241cccf9b9ee5140836800804316fa058ce2910ac07110862de40b182532058072210c4bc816225a74030012210c4bc81e2394e81602d884010f3068a559c02c138884010f3068ae739058231108120e60d142f700a04a3200241cc2b2856730a04ab430482352014ade1140856850804ab41287a91532058192210ac02a1682da740b0224420580942d14b9cbbe26b215e5e8250f43227456b205e5e8450b48e93a217205e5643285acf49d12a8897e72114bdc249d14a8897e720146de0a46839c4cb0a0845af7252b40ce2e55908451b3905821520142d8550b489b38a3642bc6c8250b49993a20d102faf4228dac249d17a88975720146de5a4e865889775108ab67152b415e2651b84a2ed9c146d8678d902a1e835468a203f4af7ca43687e9db386b643bcbc06a9a1d7c90582854102c1f2b218957d3ad964930d4dd98d949d5fd9b6952d72d9df96b3043908904317393191d329395a92633c398393f34e39ac94836139d595137439feb65e03eb35b45e23eb35b65e13eb35b55e33eb35bf9840b0852e3f6aa9c3ad74b8b50eb7d1e1b63adc4e87dbeb70071deea8c39d74f83a1deeacc35d74b8ab0e5fafc3dd74b8bb0ef7d0e11b74f8461deea9c337e9f0cd3a7c8b0ef7d2e1de3adc4787fbea703f1deeafc389992210ec0f110826423e0876710a04fb420482fd2014fdc42910ec0d1108f68150b49b5320780b4420d80b42d1cf9c02c19b2002c19b2114ede11408de081108f68450f40ba740b0074420780384a2bd9c02c16e108160770845fb3805825d2102c1eb2114ede7140876860804bb40283ac02910ec0411085e07a1e820a740b0034420d81142d1214e81603b88401073a9c7af9c02c136108120e676a1df380582ad200241cced42873977c57f8378390ca1e808274587205e7e8550749493a203102f0721141de3a4681fc4cb7e0845c73929fa05e2652f84a2139c14fd0cf1b20742d1494e8a3097dded8650748a5320d81242d12e0845a739abe814c4cb6908456738293a01f1721242d1594e8a8e41bc1c8750748e93a223102f4721149de7a4e81cc4cb790445a1084e8ace40bc9c8550e43152540422106c81a039e453d6502802e2c583d4904f2e102c021208b690c5a8ecd3c9269b6c68ca6ea4ecfccab6ad6c91cbfeb69c25c841801cbac889899c4ec9d1921ce3c9199c9c77ca61a51c0ccba9ae9ca0cbf1b7f56eb15e2febf5b65e1febf5b55e3febf5b75ee2c504820374f9d1401d1ea4c3493a7cab0e0fd6e1213a3c5487937578980e0fd7e1db7438458747e870aa0e8fd4e1513a3c5a87c7e8f0581d1ea7c3b7ebf01d3a7ca70e8fd7e1093a3c5187d37478920e4fd6e1293a7c57a60804a740048290d711874a710a04274104829017ec874a730a04274204829017ec87ca700a04c74304829017ec87ca720a04ef800804212fd80f95e314088e8308042197a085ca730a04c7400482904bd04215380582a3200241c82568a18a9c02c15488401072095aa812a74030052210845c8216aacc29101c0e1108422e410b55e1140826430482904bd0425539058243200241c82568a16a9c02c15b2102c1c1108aaa730a040741048249108a6a70ee8a57877881bccd3414c54951558817c8db4c43d19c1455867881bccd3414c34951458817c8db4c43b19c1441de4f12aa00a1288e93a2b2102fe52014d5e4a4a834c44b190845b538058203211495825014cf5945b5205e20374e841238298a837881dc3811aacd49510cc40be4c689501d4e8aa2205e20374e84ea72525407e205728752a81e274509102f903b9442f519292a0a11080e80d0dc80b386ea41bc406e738350949902c1a22081e000598cca3e9d6cb2c986a6ec46caceaf6cdbca16b9ec6fcb59821c04c8a18b9c98c8e9941c2dc9319e9cc1c979a71c56cac1b09ceaca09ba1c7f5b6fbcf526586fa2f5d2ac37c97a93ad37c57a775d4c203855971f4dd3e1e93a3c4387efd6e17b74f85e1dbe4f87efd7e1077478a60ecfd2e1741d9eadc3737478ae0e3fa8c30fe9f0c33afc880ecfd3e14775f8311d7e5c87e7ebf0133abc40879fd4e1a774f8691d5ea8c38b324520b81022105c04f920b8995320f8144420f83484a25b3805820b2002c1272114f5e21408ce8708049f8050d49b5320f8184420f83884a23e9c02c1791081e0a3108afa720a041f8608041f8150d48f5320f8204420f81084a2fe9c02c1391081e05c0845899c02c1748840703684a2019c02c1991081e02c084503390582f74304820f40281ac42910bc172210bc0f425112a740f06e8840f01e0845b7720a04a74304823320140de6dc15bf15e20523331dc249d12088178ccc742827459883a381108a923929ea0ff102b9b724348c93a2be102f907b4b42c33929ea0df102b9b724741b2745b740bc40ee2d09a5700a04a7412882dc5b121ac1594529102f989f02a67252341ce205f353c0919c142543bc607e0a388a93a221102f989f028ee6a46814c40be6c7ed6338294a8578c1fcb87d2c2345c52002c1a9109ac771d6d0188817cc6b36c6910b048b8104825365312afb74b2c9261b9ab21b293bbfb26d2b5be4b2bf2d6709721020872e726222a75372b424c778720627e79d72582907c372aa2b27e872fc6dbdf9d67bc27a0bacf7a4f59eb2ded3d65b68bd451713082ed6e547cfe8f0121d5eaac3cb74f8591d5eaec32b7478a50e3fa7c3ab74f8791d7e418757ebf01a1d7e5187d7eaf04b3afcb20eafd3e1f53afc8a0e6fd0e1577578a30e6fd2e1cd3abc4587b7eaf0361ddeaec3af658a40703b442008b96b3ef408a740702b4420b80d42d13c4e81e0668840700b84a2473905821b2102c14d108a1ee314086e8008045f8550f438a740703d4420f80a84a2f99c02c1972102c175108a9ee01408ae8508045f8250b4805320b80622107c1142d1939c02c1172002c1d5108a9ee21408ae8208049f8750f434a74070254420f81c84a2859c02c1e51081e00a08458b380582cb2002c16721142de614082e8108049742287a8673577c31c4cb33108a967052b410e205f383d2a59c143d05f182f941e9324e8a1640bc607e50fa2c2745f3215e303f285dce49d163102f981f94aee0a4681ec40be607a52b390582cf4028c2fca0f439ce2a5a09f182f98eb68a93a2e5102f98ef68cf7352b40ce205f31ded054e8a9640bc60bea3ade6a4e8058817ccaee31a4e8a5641bc60761d5f64a4a838442088d92d58cb59436b205e30e71f6bc90582c54102c1c5b218957d3ad964930d4dd98d949d5fd9b6952d72d9df96b3043908904317393191d329395a92633c398393f34e39ac94836139d595137439feb6de46eb6db2de66eb6db1de56eb6db3de76ebbdf6c702c1c55d5a358ea9592b7d67c4b7e9d60be514932d309181f103e305262267ba392fe39c8cb332cec8382de3948c93324ec8382ee3988ca3328ec8382ce33719bfca3824e3a08c0332f6cbd82763af8c5f64ec91f1b38cdd327e0afeb27281291b983281291d9852812919981281b93630d704e6eac05c15982b037345602e0f4cf1c0140b4cd1c014094ce1c0140a4cc1c014084cfec0e40b4cdec0e4094ceec0e40acc6581c919981c81c91e98e681691698a681691298c6816914988681691098fa81a91798ba81a91398da8149084c7c606a05a66660e202131b9898c04407262a303502533d30d502533530550253393095025331301502533e308981e91f987e81e91b983e81e91d985e81b925303707e6a6c0f40ccc8d81b921303d02d33d30dd02737d60ba06a64b603a07e6bac0740a4cc7c074084cfbc0b40b4cdbc0b4094cebc0b40a4ccbc0b4c8e9eec275f7e5ba3b75ddbdbbee6e5e777fafbbe3d7dd03ecee0a76f709bb3b87ddbdc4eeee6277bfb1bb03d9dd93ecee5276f72dbb3b99ddbdcdee6e6777ffb3bb23dadd23edee9a76f751bb3babddbdd6eeee6b773fb6bb43dbddb3ed5ec5e75ed7e75ee9e75efbe75e0de85e1fe85e31e85e43e85e55e85e67e85e79e85e8be85e9de85eafe85ec1e85ed3e85ee5e85ef7e85e09e95e1be95e2de95e3fe95e51e95e63e95e75e95e87e95e99e95eabe95ebde95ecfe95ee1e95ef3e994804e2de814854e75e894894ebde8148e4e05e994924e4de914974e95e9949b4edde914a04e25ea94a44e6dea14a94eb5ea94ad4efdea14b24e45eb94b64e8deb14bb4ed5eb94bf4e1dec14c44e65ec3ad9ebd67bc37a6f5aef2debbd6dbd77ac67ac67adf7aef5deb3defbd6fbc07a1f5aef23eb7d6cbd4facf7a9f53eb3dee7d6db61bd2facf7a5f5765aef2beb7d6dbd6facf7adf5beb3def7d6fbc17a3f5a6fd71fb4b195cdfbf51fd1a74b62bfe1d2cc0647cf9528d2a50b483790ae20dd41ba84740be91ad23da48b483791ae22dd45ba8c741b9935327b6416c96c925925b34b6699cc36997532fb6416ca6c945929b35366a9cc5699b5f141a2e932916542cbc496092e135d26bc4c7c6900d208a42148639006218d421a8614be4c00990832216462c8049189221346268e4c20994832a16462c904938926134e265e77f92b1aa51b2944237568a40c8d54a19122345283464ad048051a294023f567a4fc8c549f91e233527b464acf48e519293c237567a4ec8c549d91a2335273464ace48c519293823f566a4dc8c549b916233526b464acd489119a931232566a4c28c149891fa32525e46aacb487119a92d23a565a4b28c149691ba32525646aaca485119a929232565a4a28c1494917a32524e46aac9483119a92523a564a4928c1492913a328b65fc28e307c7b2d453505b6f04e6cdc0bc1598b703f34e604c606c60de0dcc7b81793f301f04e6c3c07c14988f03f349603e0dcc6781f93c303b02f34560be0ccccec07c1598af03f34d60be0dcc7781f93e303f04e6c7c0ecca69bd9f7ebf024b47ac9dbc9f208bd4dd97ee24ed992629494386240d9c3b4b960b49c903872462d64d2eba4b5d39b998860e1f9268bd9f67ce495bda66e4d0e1ad077418969a1e1199b6a8e9b0e411a9e9deac4b0f366d4593a4e43e29635b24250ee9df71f89c88a79b258df2221676491d367cf6cc9980bfe09f6b68d66c08bdc209e641ed019451a6e4b76726fafb130f619935ef8a4267dd2f59b3ee77e40a239812da4b38e724bbbd8819f77fa53d9baeb4b10115660ba82062f22f6a9c92d267ecce885ad6db67bdfdd63b60bd83d63b64bd5fadf79bf50e5bef88f58e5aef98f58e5bef84f54e5aef94f54e5bef8cf5ce5aef9cf5ce5b3fc2fa9ef57deb475a3f9bf543d6cf6efd1cd6cf69fdcbac9fcbfab9ad9fc7fa79ad9fcffaf9ad5fc0fa05ad5fc8fa85ad5fc4fa45ad5fccfac5ad7fb9f5afb0fe95d6bfcafa575bff1aeb5f6bfd12d62f69fd5233e7a53ddd7ed8a8f448ffc2bf7defc2bf6537e41f7d2a6216e0193ddb62584a62d2c0e4e0dbc8ecd5fdc4764a491ad5273531f88a929a342c7956dad256897d863be2d2b3d59a9db6a273e2c0a411a98929ad93fb278ef132fcb79fe1bf232f441dcaf68fe843690b839e3b2be785ff8ef0fed112212f930c5acfa5d6d93fefb82db96ee4b0d4a4c4e4d4b9a88fd70397fec8101f1f31d62f63fdd29bb51feef9a53d152e63cee28eb5ffff111e40f0ec036e200c38c26ee0e2cbe9204d3995b37e59bd9ccaeae5542e73cae920a49cca42caa91c7b391da629a70ad62faf975379bd9c2a644e391d86945379483955602fa72334e554c9fa15f572aaa89753a5cc29a7239072aa0829a74aece57494a69caa58bfb25e4e95f572aa9239e57414524e9521e55485bc9cfc5234e554cdfa55f572aaaa9753b54c2927bf1484e7aa9072aa16be377aee833caceac8dd2df4810922baffdfbaf56b646ddd66a05738c13ca828c6039320bf28f881493a66cb09327ba329cb2a080c73cbcb27946a41d0c3c35c31ff09f389b71f036de0b1590d3c03bdc209e641c5513670c92f8ef3c41b4e18a43515867c36ed87b4b79ad42bcb9ad0c6542bab3165a05738c13ca878cac624f9c587f5ca3281b2ace22530cccaf2b3705e59d686ac2c3fa35e59d68636f03a590d3c03bdc209e641d5a56ce0925f5dd295655dc6956541c867d331487bab47bdb2ac076d4cf5b31a53067a8513cc836a40d99824bf0661bdb26c4859560d2430ccca724738af2c1b4156963ba857968da00dbc715603cf40af708279504d281bb8e4d7847465d9847ade5585cebba659f32e03bdc209e64135a39c77925fb3b05e3835a72cab66121866e1f465382f9c5a40164e5f5237f016d006de32ab8167a05738c13ca856940d5cf26b45ba706a453defca43e75debac7997815ee104f3a0da50ce3bc9af4d582f9cda5296551b090cb370fa2a9c174eed200ba7afa81b783b68036f9fd5c033d02b9c601e5407ca062ef975205d3875a09e7715a1f3ae63d6bccb40af708279509d28e79de4d729ac174ed751965527090cb370fa269c174e9d210ba76fa81b78676803ef92d5c033d02b9c601e5457ca062ef975255d3875a59e7795a1f3eefaac7997815ee104f3a0ba51ce3bc9af5b582f9cba53965537090cb370fa2e9c174e3d200ba7efa81b780f6803bf21ab8167a05738c13ca81b291bb8e47723e9c20941d8bfbe346549a7c4fe892923129367cf4eb7de7e732e78d1a1b365cdb908f9574febdfa4feb99d11d1f2270f057fc6fbd5d9dfdc9f2fef6c45672bbbfffd98b3c79d3de1ec49674f397bdad933ce9e75f69cb3e79d8708673d677d67239dcde66cc8d9eccee67036a7b397399bcbd9dccee67136afb3f99ccdef6c01670b3a5bc8d9c2ce1671b6a8b3c59c2deeece5ce5ee1ec95ce5ee5ecd5ce5ee3ecb5ce9670b6e405366fb6fe2d177d0afbdc9fe8e9eccd17fe5c2febf7e65d15f401f72aaae4fa867372fdc239b9fee19c5c62382737209c931b18cec90d0ae7e492c239b95bc339b9c1e19cdc90704e6e683827971ccec90d0be7e486877372b78573722980e4326bffb21874f77244d6eee5efc81546305b71a9847b97925d2af38d4e80d2c60654842da042b81b9d1eb5fe48eb8fb2fe68eb8fb1fe58eb8fb3feedd6bfc3fa775a7fbcf527fc37ae535a97987cdbc8c491899d46f61d92d4ef7f2f540aa0df5faa949bfa52a560f65feaa3cedc37b98fa679937b9af527ea6f729fa8bfc93d2d73dee43e1ac2f344c89bdcd3d82f061843534e93ad3f492fa7497a394dce9c721a03e17912a49c26b397d31d34e57497f5a7e8e534452fa7bb32a79cee80f03c05524e77b197d39d34e534cdfa53f5729aaa97d3b4cc29a73b213c4f8594d334f6721a4f534e33ac3f5d2fa7e97a39cdc89c721a0fe1793aa49c6630caf58a41681e09f17237f51b25ef866e77dd93b5dd95815ee104f3a0eea514eb497ef772aaadfd548897fb28cbea5e090ca3b6fe81526d0d7a78f743d4d63f50abadef8736f007b21a78067a8513cc839a49d9c025bf99a46aeb998cef2a2f02694ca3205e6651af2c67411b537a5663ca40af70827950b3291b93e4373bac57967328cb6ab604865959ee0ae795e55cc8ca7217f5ca722eb4813f98d5c033d02b9c601ed443940d5cf27b887465f910e3cab210a4314d807879987a65f930b4313d92d59832d02b9c601ed43ccac624f9cd0beb95e5a39465354f02c3ac2c7787f3caf231c8ca7237f5caf23168037f3cab8167a05738c13ca8f9940d5cf29b4fbab29c4f3defa640e7dd1359f32e03bdc209e6412da09c7792df82b05e383d4959560b2430ccc2694f382f9c9e822c9cf65037f0a7a00dfce9ac069e815ee104f3a016523670c96f21e9c26921f5bc9b0a9d778bb2e65d067a8513cc835a4c39ef24bfc561bd707a86b2ac164b609885d3de705e382d812c9cf65237f025d006be34ab8167a05738c13ca865940d5cf25b46ba705a463defa643e7ddb359f32e03bdc209e6412da79c7792dff2b05e38ada02cabe5121866e1b43f9c174e2b210ba7fdd40d7c25b4813f97d5c033d02b9c601ed42aca062ef9ad225d38adcafc97b9fba3dc0bc4273a3be9c26bc49fb7fe0bff9acea537a3d599c1f2a587b58633ac1739c35acb19d64b9c61bdcc19d63aceb0d67386f50a67581b38c37a9533ac8d9c616de20c6b3367585b38c3daca19d636ceb0b67386f51a6758af7386f50667586f7286f51667586f7386f50e675886332ccb19d6bb9c61bdc719d6fb9c617dc019d6879c617dc419d6c79c617dc219d6a79c617dc619d6e79c61ede00ceb0bceb0bee40c6b2767585f7186f535202cfd02df58391a1aebce89c6397bbbb3539c9deaec74672738bbdad935cebee8ec5a675f72f66567d739bbded9579cdde0ecabce6e747693b39b9ddde2ec5667b739bbddd9d79c7dddd9379c7dd3d9b79c7ddbd9779c35ce5a67df75f63d67df77f603673f74f623673f76f613673f75f633673f777687b35f38fba5b33b9dfdcad9af2f9ca67d63fd6f2f7a0a37d2fd89e79dfde6c29ffbcefadff3aa427e203cabce66bdbd184dc841f01cc764e7df8ac9ee5066285e2ebda47e8468550e42bc9052b42b9c29626a6f3f11b6b71cb0f67698b0bde5b07e1226bb239c73773764d61d867821a5e8e770a688a9bded216c6f7960eded38617bcb63fd4198ec4e70cedd5f20b3ee38c40b29457bc39922a6f6b68fb0bd8560eded34617b0b59bf2f26bb339c73773f64d69d867821a5e8403853c4d4de0e12b6373305d6dfce13f63749cfef07492f7b04e7ec3d049977e7115e5829fa359c29626a70bf51fe10ae97f50762ceea18f7df90f985f5dec951c2e2f4511fbed923094bd3b77e1f4c76d9383f588e413e1222215e48293a1ece1431b5b71384eded32587bcb41d8de2eb3fe6d98ec7272cedd9390599703e28594a253e14c11537b3b4dd8de72c3da5b6ec2f696dbfa8998ecf270cedd339059971be28594a2b3e14c11537b3b47d8de3c587bcb4fd8de3ceb0fc764578073ee62f62bf343bc7052141911ce1411b5b7488fb0bde584b5b7c284ed2da7f58762b22bc239777dc8ac2b0cf1424a51643853c4d4deb211b6b7ecb0f6569cb0bd65b77e3226bbcb39e76e0832eb8a43bc9052943d9c29626a6f3908db5b3e587bbb8ab0bde5b37e7f4c765773cedd9c90597715c40b2945978533454ced2d17617bcb0b6b6f2508db5b5eeb0fc364579273ee6276bc4b40bc905294279c29626a6f7909db5b2e587b2b43d8de72597f3026bbb29c73371f64d695817821a5287f3853c4d4de0a80db1b557205097b7724ac775720ecdd91d61f82c9ae2267632a04692915205e48292a1cce1431b5b72284ed2d3facbd55216c6ff9ad9f82c9ae2ae7dc2d0a997555205e48292a16ce1431b5b7e284edad00acbdd5206c6f05ac3f00935d14e7dcbd1c32eb6a40bc90527445185384f9c170aa8d8cc0cc9258cafcce59ff3c26bf38ce12bf12529cb1102f71a425ee1fc794403c657e47ad7f0c935f02678963ceade3215e1258bb78614c09d465cc2fb2a0ec5561f2abc759e257438ab32ec44b3dd62ebe0b53020d29f3fbc1fa3f62f26bc459e2d7408ab321c44b23d6123f802981a694f9edb3fe7e4c7ecd384bfc5a487136857869c6ba50c98e298196940b956c363284c9af1567896344562d215e5ab176f15f3125d09632bf83d63f84c9af1d6789978414675b88173845902717598a33acd29c6195e10cab2c6758e538c32acf195605ceb02a7286558933acca9c6155e10cab2a6758d538c3aace19560dceb0580f69fd2398257747cafc7eb3fe614c7e9d38bf524443be0c748478e9c439f36238c38ae50c8bf3a4fd3b1b5900935f4d4eda6b718615cf1956026758b539c3aac319565dceb0ea7186559f33ac069c6135e40c8bf674f867cc22b90b657e3f597f3726bfae9c5f021a4396ef5d205ebab29e0e47624aa03be5e9b067237d4c7e3d384bbc09a438bb43bcf460ede2a73025d09332bf13d63f89c9ef26ce12c7a8737a42bcdcc4dac5f3634aa0176517cf6b23f361f2ebcd59e2cd20c5d90be2a5376b173f8b29817e94f99db6fe194c7efd394bbc39a438fb41bcf4672d71d08f830752e6b7c7fabf60f21bc459e22d20c53910e26510eb42250fa60406532e5472d9c8dc98fc8670963846463c18e265086b895f8629816194259ec346e6c4e4379cb3c45b418a7318c4cb70d6122f8629811194255ec44616c5e497ca59e2ad21c53902e22595b5c4afc094c068ca122f6e232fc7e43786b3c4db408a7334c4cb98cc78cdd6a5d7c09510a2db7226771524b9769cc95d0d49ae3d6772d74092ebc099dcb590e43a72265702925c27cee44a4292bb8e33b95290e43a7326571a925c17cee4ca4092ebca995c594872d77326570e925c37cee4ca4392ebce995c0548723d3893ab0849ee06cee42a4192bb9133b9ca90e47a7226570592dc4d9cc955852477336772d520c9ddc2995c754872bd3893ab0149ae3767725190e4fa7026170d49ae2f67723190e4fa7126170b49ae3f67727190e4123993ab09496e006772b520c90de44c2e1e92dc20cee41220c9257126571b92dcad9cc9d58124379833b9ba90e4867026570f92dc50cee4ea43924be64cae0124b9619cc9358424379c33b94690e46ee34cae3124b914cee49a40921bc1995c534872a99cc9358324379233b9e690e4467126d70292dc68cee45a42922355edb58224379633b9d690e4c67126d70692dced979edcce889e9e1f992d943d47cecb72e5ce93375ffe02050b152e52b458f1cbafb8f2aaabafb9b644c952a5cb942d57be42c54a95ab54ad56bd4654744c6c5ccd5af109b5ebd4ad57bf41c3468d9b346dd6bc45cb56addbb46dd7be43c74ed775eed2f5fa6edd7bdc7063cf9d11926b5b1bd9ce46b6b7911d6c64471bd9c9465e67233bdbc82e36b2ab8dbcde467693d37d3903979362394f955347399b93132c39e791d3103933909d75d97f965d5ad9cb941d3fd91793dd23d963919d08f9be2edf6ae5bb9f7c4392ef11b2da9635a9acdc647d23ab00f9ac944f14e9bbd29d640e4ba54b3d086bff03", "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" } ] diff --git a/yarn-project/noir-contracts/src/examples/gullible_account_contract.json b/yarn-project/noir-contracts/src/examples/gullible_account_contract.json index a06218c718e0..ef3c82852aeb 100644 --- a/yarn-project/noir-contracts/src/examples/gullible_account_contract.json +++ b/yarn-project/noir-contracts/src/examples/gullible_account_contract.json @@ -71,7 +71,7 @@ } ], "returnTypes": [], - "bytecode": "ed5d6754545717e5618925f692d87b6f2045d0d850512c88d8bb9401471110017b01516387c1de7b6fd1e44b4c35bddd674b312af618638c319a68a289e43bf348b2be316b4d7eb0677d7bbd35ae758ecb45b8d9fbdc7d3667ee1bee2cd33da7e578164d3b141417113536286152704a7c54a788b8b8b4ede11d43bb76c9b215d49c7cb190b32f16d6d2f6744cb2268f1e6749b646656766d9ce76f0f1f2f7f5b5b46a69f1f6f18ef06a191819e0e7e5eb17e91fe01de0ed17e017dd32c0c7c712e01bd02a3032b09557a0b7af8fc53bc62fd027c62bef4f95b31dbcf2f9070faa2a23a86a8ca0aa3382aac108aa2623a85a8ca06a3382aac308aa2e23a87a8ca0ea33826ac008aa2123a8468ca01a33826ac208aa2923a8668ca09a33826ac108ca0b00ea9f2f75768559a22d49132cf1d9391e356d6554aeadac443989f21215242a4a3c23f1ac442589ca125524aa4a5493a82e5143a2a6442d89da127524ea4ad493a82fd140a2a1442389c6124d249a4a3493682ed142c24be536b579b7c417ce8771377d1941f93182f26704d58a11540023a8404650ad1941b56104f51c23a8b68ca0da31826acf08aa0323a88e2e1faf4adbbc65ccf191f095f093f097682511201128d15aa28dc473126d25da49b497e820d1d13e1e05754adb1994648d8bb3c62ecf4adbd1d71a1f1b67c9e39f4fecde15f2cfdf40342e31ced2397359daeeee29e31243624213926d1e05d2b6774a889f906cd3b2f20f346d7f90353e226972b0d51217dd3b7199c7d6ced654cd635bdfe484c4eccc4cc0ffe07fb595950d286d67c40675c9bfc6f1ccba6402dae66f4967d3491a0ba81c1ba03288a6dfde31292962728e877f70d76e21dd7bf4ec15da3bac4f78df7efd070c1c3478c8d061c3478c1c151119156d89891d6d1d33366e5c7c42e2f8a409c929a913274d9e3235734ddad65e09a9b6029e797f7b6a797f6b1e7fb9864716a06e7b8313922cd6d878bb2d671f89921c96644d8d48b6d8bd3ad99a109f95b6bb9b2522d120632be89f9db63fdc126b9d906c490a898fb64cd29ef8b7e713ff2e9087ba50c13fd1174adb6677c0ac2279fff6d0fe3428c4cfaa2e0093dbddd99a6411e2a996b45d7d521292ad96f8e4e5185575cbff76218cbce5f469c79c3cdc9de6ecc9ef74f5d871c4c8066c5b37406da7d9007501b4930be51342229f99339cc9678633f9cc74857c4200b59d0190cf4c6ef9f422918f4a53b39c0948cd72a620f96e1748a817a0be6a960d511c6e1185b28868b64a772aa274a7229aed0a11852244948e10d16c6e11f56611d11c95e15444194e4534c71522ea8d105106424473b84534954544f3d45ca7229aeb5444f35c21a2a90811cd4588681efa48331b71fe01287130600df53cf290087cee8900f7f7c1a79aef3ef9742cae9a0fd9a40584879f426e4126baef6d88e32144cf2e6494d302b510717ea66b6718fd1ab26f8b00408cfae4bbdf5ce6d88b908ebdd8edd88ec5558b219bb484d1b117a92599ae78f84c572d881f9503f8515784a72d659e1f9722dd28d3ed468ec555984dca6274a3a52acbbcf3a38d514e59ca86991fcf9a767ecc86cc8f6799e7c76ca4632f733bb66371d532c8262d6774ec6cb59c737e5cce383f9601f85118c2d35630cf8f2b906eb4d2ed468ec5552b219bb48ad18d56a855e69d1f5733ca69955a8d991fcf9b767e5c03991fcf33cf8f6b908ebdd6edd88ec5556b219bb48ed1b1d7a8759cf3e33ae67e9b8becb7f5ee7e732cae5a0fd9a40d8cfd36576d30ef84b491514e1bd446cc8474c1b413d226c8847481d9b137211d7bb3dbb11d8bab364336690ba3636f525b3827a42dccfd360bd96f5bddfde6585cb515b249db18fb6d96da66de09693ba39cb6a9ed9809e9926927a41d9009e912b363ef403af64eb7633b1657ed846cd22e46c7dea176714e48bb98fb2d1dd96fbbddfde6585cb51bb2497b18fb2d5ded31ef84b497514e7bd45ecc8474c5b413d23ec8847485d9b1f7211d7bbfdbb11d8babf64336e900a363ef53073827a403ccfd9681ecb783ee7e732cae3a08d9a4438cfd96a10e9977427a81514e87d40b9809e99a6927a4c39009e91ab3631f463af611b7633b16571d816cd28b8c8e7d58bdc8392121aae5ec16de6c5b57956b9b263143e57ad8d44bea3fff726bafb7adbbfcd73d247a4ac8f31249e9f69421294ca28f44b8445f897e12fd2506480c94182431586288c450896112c32546488c941825112111291125112d619188918895182d619518233156224e629c44bc448244a2c4788924890912c9122912a912132526494c969862907d59bdf22fc509b6137bc99e5e36bee3a87a95f4c7f26b60cfe061f6ba6999bd615a666f9a96d95ba66576ccb4ccde362db3774ccbec5dd3327bcfb4ccde372db30f4ccbec43d332fbc8b4cc3e362db34f4ccbec53d332530066ae3a12ac883c11d4dd27820eb5553ae488eb38e1816045759cf9837c00b2c6022acf06a82cee837cd6aa13eaa43aa54eabcfd4e7ea0bf5a53aa3be5267ff1f1fd373d4123f3ec59262094b898cb346fdf5413df62f397e584f71e60febb1377c7eb7d795178cab532c378c9f57e79cde307ecee90de3e75d71c3b83a85a8f039c415e3882b235c29a3d32c32baa0729cca28c7a98c2eb84446a71115ce41c8e802b98cbe6491d12575d1a98c2e3a95d12597c8e84b44852f226474895c4667586474455d762aa3cb4e6574c525323a83a8f065848cae90cbe82b16195d53579dcae8aa53195d73898cbe4254f82a4246946f63ab88a8f109c4225f33df7ff835f2cceabafbcccab1b8ea3a6493be617c17dbd7ea1bcaf71dabe388456e30eae91b7503f3c6e3eb8c8e8dd9b86f21ef3cbecefccee36f919e7dd3edd98ec55537219bf41da3677fabbee37ce7f1778c37689747f8d149c422b79847c85b483bfade6d478ec555df4336e936a31ddd52b74d3c42fec0a8a7dbea07cc0879c3bc23e41dc80879837984bc83f4ec1fdd9eed585cf5236493ee327af61d75977384bccb38429645f8d159c422f79847c87b483bfac96d478ec5553f4136e967463bbaa77e36f108799f514f3fabfb9811f2a67947c8079011f226f308f900e9d9bfb83ddbb1b8ea17c826fdcae8d90fd4af9c23e4afccfd7611d96f0fddfde6585cf510b2498f18fbeda27a64e219e937463d3d52bf6166a45be69d917e87cc48b7983dfb77a4673f767bb66371d563c826e5327af6ef2a977346ca65eeb7cbc87efbc3dd6f8ec5557f64412cdb83b1e12e0b2ef34e49baa6114a4a4a2ec03083d26dd30e4abae60969bbdbc4ce2d1c81d6ad6b05dcdefd4479a526988d2a48e8de06bf82940313a6602e9b98ae42dbae90bbed1cab2b25c188a830e3cc24f40a9b79667a8ad2ca0b0b30cccc74c7c433531148dbdda19e998a40cdbba8dbbc9f28afd404b351c5286726e1578c74662ae6f29bc8d549fb45dbe7ec29c77edbb6ae15d7b5a7ffc925ff4e54c21525ce3fac929cb04a71c22acd09ab0c27acb29cb0ca71c22acf09ab0227ac8a9cb09ee184f52c27ac4a9cb02a73c2aac209ab2a27ac6a9cb0aa73c2aac109ab2627ac5a9cb06a73c2aac309ab2e27ac7a9cb0ea73c26ac009ab2127ac469cb01a73c26ac209ab2927ac669cb09a73c26ac109cb8b13963727ac969cb07c3861f972c2f2e384e5cf09ab1527ac00002ce71f41eb63539fd99f127d6e4f5fd8d3457bba6c4f57ede9ac2479ca63e492462e65e4d2462e63e4b2462e67e4f246ae60e48a467ec6c8cf1ab992912b1bb98a91ab1ab99a91ab1bb986916b1ab996916b1bb98e91eb1ab99e91eb1bb981911b1ab991911b1bb989919b1ab999919b1bb98591bd8cec6de49646f631b2af91fd8cec6fe456460ec87b8c16a86badffedd9db09e31b8a1b3930efdbdae8da73b46f04694bf87cba60174c07dd053736849bfa0043ee9e2bdee1927f58ed200fc9ef4256212d517b339788c8da3a105a5b5190b5dd27b4b6a2ea350cb9079c7ddb11d271f721ab909628c8cc2522b2b64e84d6f634c8da1e125adbd3ea4d0cb9479c7ddb19d2710f21ab9096a88b994b44646dc18cbfed7254bd8fe9ffae84e68663d7cdc4ba0c21d46501d08fdcc784aa2ca03ec290cbe5fc79d21df293e0316415d212f530738988acad27a1b515c2589ba746686d85d41b18729e9c7ddb0bd1719e1a6415d212859ab94444d6d69bd0da4a80acad10a1b59550ef61c815e6ecdb3048c71582ac425aa23e662e1191b585135a5b6190b51525b4b6c2ea18865c31cebeed0be9b8a29055484bd4cfcc2522b2b6fe84d65604646d2508adad887a1743ae2467df0e80745c09c82aa4251a68e6121159db20426b2b05b2b63284d6564abd85215796b36f07433aae0c6415d2120d31738988ac6d28a1b53d05b2b60a84d6f6945218721539fb7618a4e32a4056212dd170339788c8da46105a5b6990b55522b4b6d2ea430cb9ca9c7d3b12d2719520ab90966894994b44646d1184d65612646dd508adada4fa1843ae3a67df46423aae1a6415d2124599b94444d6164d686dc541d6568bd0da8aab4f30e46a73f6ad05d271b520ab909628c6cc2522b2b658b0b531711b4d68db4120dbae4768db41ea530cb9fa9c9e6485b8493dc82aa4251a63e6121159db58426bd340d6d688d0da34f536865c63cebe8d83745c23c82aa4251a67e61211595b3ca1b57982acad19a1b579aa7730e49a73f66d02a4e39a4156212d51a2994b44646de309adad18c8dabc09adad987a1d43ae2567df26413ace1bb20a69892698b844903b5b8ecb648b69123f427af24a595edc60f8f9732a3c19a24d3fc82afea40a4fc428209052e1f132e362f8b5e654780a449b8190555a932abc0746016d29151ea26bdd31fcda712a3c15a2cdb69055da912abc3d46011d2915de56d7da61f805712a7c22449b909b93e12542293c14a3802e940aefa96bbd30fc8239153e09a24dc8edb0f012a114de0fa380104a8587eb5a5f0cbfee9c0a9f0cd166086495eea40a1f8351402f4a858fd6352b865f28a7c2a740b489b9b6105e22cc2db85339614de384359d13d60c4e58333961cde28495c6092b9d13d66c4e58199cb0e670c29acb096b1e27ace73961cde784b580f4154537ccc4dd87f21545b0ae75c5f00be77c45b110f25a0073156e3867e32de284b59813d612ca3e6ea36bb1187e4b39cb9ec9092b8b13968d13563627ac659cb09673c25ac1096b2527ac559cb05673c25a43fa1a60386646ee4f393b0cd5b561187e03385f03ac854ceffd21ab0c2055f8408c0206532abcbfae0dc0f01bc2a9f075106d62ae201e42aaf0208c0286532abc83ae75c4f01bc1a9f0f5106d62ae591d41aaf009180544502a7cbcae2561f845722a7c03449b1190552249151e8351808552e1d1ba66c1f08be154f84688363197b7c5902a1cf4dbc0564a8577d2b5ce187e633815be09a24dcc3d57634815de07a38071940aefad6b61187ef19c0adf0cd126e62e9f785285476114309e52e111ba1689e197c4a9f02d106d8e87ac9244aaf0211805a4502a7c90ae0dc6f04be554f856883631bf159e4aaaf05118054ca654f8085d1b89e1378553e1db20dac4fcbed514575ca8957f0d24430abd9d935c0a84dc0e4e72a910723b39c94d8490dbc5496e1284dc6e4e729321e4f670929b0221b79793dc5408b97d9ce4a641c8ede724371d42ee0027b91910720739c9cd84903bc4496e1684dc0b9ce4d220e40e73924b87903bc2496e3684dc8b9ce43220e45ee224370742ee3f9ce4e642c8bdcc496e1e84dc2b9ce49e87903bca496e3e84dcab9ce41640c8bdc6496e2184dceb9ce41641c8bdc1496e3184dc9b9ce49640c8bdc5496e2984dc314e729910726f7392c3fce6da3b9ce46c1072ef7292c33c2b7c8f93dc3208b9f739c92d8790fb8093dc0a08b90f39c9ad8490fb8893dc2a08b98f39c9ad8690fb8493dc1a08b94f39c9ad8590539ce4d641c8e99ce4d643c81de724b70142ee0427b98d10722739c96d82903bc5496e3384dc694e725b20e43ee324b71542ee734e72db20e4bec83fb9cc1c0f81b35dd776e8da4e5ddba56bbb756d8faeedd5b57dbab65fd70ee8da415d3b240fe0e531b53ccc95479ef260501e9fc943267914230f2ce4585f0ebfe588580e52e5b8510ee5e4e84a0e78e418440e0be425b5bcf0949767f22246467d1988656c94e14a4610f9412d3fcec4f4c51ac540a4cd448cb26542ecbf", + "bytecode": "ed5d6774545517cd0b458af4a2f4de5b420a09480b10083584de499984813442127a4908203d99d07bef4dd04fb1626ff7d12c08842e222222282828f13bf3a2ae6f70adf147f6ac6fafb786b5ce61b162ae7b9fbbcfce99fb267796e99ed3723c8ba61d0a8a0d8f1c1794302938253eb253786c6cdaf6b08ebdbb76c9b215d49c7cb190b32f16d6d2f6744cb2268f89b3245b23b333b36c673bf878f9fbfa5a5ab5b478fb78877bb50c8c08f0f3f2f58bf00ff00ef0f60bf08b6a19e0e36309f00d68151811d8ca2bd0dbd7c7e21ded17e813ed95f7a7cad90e5ef9fc830755951154354650d51941d56004559311542d4650b51941d56104559711543d4650f51941356004d59011542346508d1941356104d5941154334650cd1941b56004e50500f5cf973abb422d5196a40996f8ec1c8f9ab6322ad75656a29c4479890a1215259e917856a2924465892a125525aa495497a8215153a296446d893a127525ea49d4976820d150a29144638926124d259a4934976821e1a5729bdabc5be20be7c3b89bbe8ca0fc1841f933826ac5082a8011542023a8d68ca0da30827a8e11545b4650ed1841b56704d581115447978f57a56dde32e6f848f84af849f84bb49208900894682dd146e23989b612ed24da4b7490e8681f8f823aa5ed0c4ab2c6c65a639667a5ede8678d8f89b5e4f1cf2776ef0af9e76f208a4b8cb574ce5c96b6bb7b4a5c624874ef84649b4781b4ed9d12e22724dbb4acfc034ddb1f648d0f4f9a1c6cb5c446f5495ce6b1b5b33555f3d8d62f3921313b3313f03ff85f6d6565034adb19b1415df2af713cb32e9980b6f95bd2d97492c6022ac706a80ca2e9b7774c4a0a9f9ce3e11fdcb55b48f71e3d7bf5ee13da37ac5fff0103070d1e3274d8f01123478d0e8f888cb244c78cb18e1d171b179f90383e6942724aeac44993a74ccd5c93b6b55742aaad8067dedf9e5adedf9ac75faee19105a8dbdee084248b3526de6ecbd947222587265953c3932d76af4eb626c467a5edee66094f34c8d80afa67a7ed0fb3c45827245b9242e2a32c93b427feedf9c4bf0be4a12e54f04ff485d2b6d91d30ab48debf3db43f0d0af1b3aa0bc0e47677b626598478aa256d57df948464ab253e79394655ddf2bf5d08236f397dda31270f77a7397bf23b5d3d761c31b201dbd60d50db6936405d00ede442f98490c867e60c67f299e14c3e335d219f10406d6700e433935b3ebd48e4a3d2d42c670252b39c2948bedb0512ea05a8af9a654314875b44bd5944345ba53b1551ba5311cd7685887a2344948e10d16c6e11f56111d11c95e15444194e4534c71522ea83105106424473b84534954544f3d45ca7229aeb5444f35c21a2a90811cd4588681efa48331b71fe01287130600df53cf290087cee8900f7f7c1a79aef3ef9742cae9a0fd9a40584879f426e4126baef6d88e32144cf2e6494d302b510717ea66b6718fd1ab26f8b00408cfae4bbdf5ce6d88b908ebdd8edd88ec5558b219bb484d1b117a92599ae78f84c572d881f9503f8515784a72d659e1f9722dd28d3ed468ec555984dca6274a3a52acbbcf3a38d514e59ca86991fcf9a767ecc86cc8f6799e7c76ca4632f733bb66371d532c8262d6774ec6cb59c737e5cce383f9601f85128c2d35630cf8f2b906eb4d2ed468ec5552b219bb48ad18d56a855e69d1f5733ca69955a8d991fcf9b767e5c03991fcf33cf8f6b908ebdd6edd88ec5556b219bb48ed1b1d7a8759cf3e33ae67e9b8becb7f5ee7e732cae5a0fd9a40d8cfd36576d30ef84b491514e1bd446cc8474c1b413d226c8847481d9b137211d7bb3dbb11d8bab364336690ba3636f525b3827a42dccfd360bd96f5bddfde6585cb515b249db18fb6d96da66de09693ba39cb6a9ed9809e9926927a41d9009e912b363ef403af64eb7633b1657ed846cd22e46c7dea176714e48bb98fb2d1dd96fbbddfde6585cb51bb2497b18fb2d5ded31ef84b497514e7bd45ecc8474c5b413d23ec8847485d9b1f7211d7bbfdbb11d8babf64336e900a363ef53073827a403ccfd9681ecb783ee7e732cae3a08d9a4438cfd96a10e9977427a81514e87d40b9809e99a6927a4c39009e91ab3631f463af611b7633b16571d816cd28b8c8e7d58bdc8392121aae5ec16de6c5b57956b9b263143e57ad8d44bea3fff726bafb7adbbfcd73d247a4ac8f31249e9f694212954a2af4498443f89fe120324064a0c92182c314462a8c43089e1122324464a8c92182d112e11211129112561918896889118236195182b314e2256224e225e2241225162bc4492c4048964891489548989129324264b4c31c8beac5ef997e204db89bd644f2f1bdf7154bd4afa63f935b067f0307bddb4ccde302db3374dcbec2dd3323b665a666f9b96d93ba665f6ae6999bd675a66ef9b96d907a665f6a169997d645a661f9b96d927a665f6a96999290033571d0956449e08eaee134187da2a1d72c4759cf040b0a23acefc413e005963019567035416f7413e6bd50975529d52a7d567ea73f585fa529d515fa9b3ff8f8fe9396a891f9f6249b184a644c45a23fffaa01efb971c3faca738f387f5d81b3ebfdbebca0bc6d529961bc6cfab734e6f183fe7f486f1f3aeb8615c9d4254f81ce28a71c49511ae94d16916195d50394e6594e35446175c22a3d3880ae7206474815c465fb2c8e892bae85446179dcae8924b64f425a2c2171132ba442ea3332c32baa22e3b95d165a732bae212199d4154f832424657c865f4158b8caea9ab4e6574d5a98caeb944465f212a7c152123cab7b15544d4f8046291af99ef3ffc1a796675dd7d66e5585c751db249df30be8bed6bf50de5fb8ed571c4223718f5f48dba8179e3f17546c7c66cdcb790771e5f677ee7f1b748cfbee9f66cc7e2aa9b904dfa8ed1b3bf55df71bef3f83bc61bb4cb23fce82462915bcc23e42da41d7defb623c7e2aaef219b749bd18e6ea9db261e217f60d4d36df5036684bc61de11f20e6484bcc13c42de417af68f6ecf762caefa11b24977193dfb8ebacb3942de651c21cb22fce82c62917bcc23e43da41dfde4b623c7e2aa9f209bf433a31ddd533f9b7884bccfa8a79fd57dcc0879d3bc23e403c808799379847c80f4ec5fdc9eed585cf50b64937e65f4ec07ea57ce11f257e67ebb88ecb787ee7e732cae7a08d9a4478cfd76513d32f18cf41ba39e1ea9df3033d22df3ce48bf4366a45bcc9efd3bd2b31fbb3ddbb1b8ea31649372193dfb7795cb3923e532f7db6564bffde1ee37c7e2aa3fb22096edc1d87097059779a7245dd30825252517609841e9b66907255df384b4dd6d62e7168e40ebd6b5026eef7ea2bc5213cc461524746f835f41ca81095330974d4c57a16d57c8dd768ed59592604454987166127a85cd3c333d4569e58505186666ba63e299a908a4edee50cf4c45a0e65dd46dde4f94576a82d9a862943393f02b463a331573f94de4eaa4fda2ed73f69463bf6d5bd78aebdad3ffe4927f272ae18a12e71f56494e58a5386195e68455861356594e58e5386195e78455811356454e58cf70c27a961356254e5895396155e18455951356354e58d53961d5e084559313562d4e58b53961d5e184559713563d4e58f5396135e084d5901356234e588d396135e184d5941356334e58cd3961b5e084e5c509cb9b13564b4e583e9cb07c3961f971c2f2e784d58a1356000096f38fa0f5b1a9cfec4f893eb7a72fece9a23d5db6a7abf67456923ce53172492397327269239731725923973372792357307245233f63e4678d5cc9c8958d5cc5c8558d5ccdc8d58d5cc3c8358d5ccbc8b58d5cc7c8758d5ccfc8f58ddcc0c80d8ddcc8c88d8ddcc4c84d8ddcccc8cd8ddcc2c85e46f636724b23fb18d9d7c87e46f637722b2307e43d460bd4b5d6fff6eced84f10dc58d1c98f76d6d74ed39da3782b4657c73d151f53ea687da815b9b8b5d7b13bf41a903a12e8b76c1ecdb5d42551655af61c8dd73c53baff20fab23e4cd1b7721ab909628c8cc2522b2b64e84d6560a646df709adad945218720f38fbb633a4e3ee4356212d5117339788c8da8209aded6990b53d24b4b6a7d51b18728f38fbb62ba4e31e4256212d5137339788c8da4208adad04c8da1e135a5b09f511865c2e67df768774dc63c82aa425ea61e61211595b4f426b2b80b1364f8dd0da0aa80f31e43c39fbb617a2e33c35c82aa425ea6de61211595b1f426b2b0db2b64284d6565abd87215798b36f43211d5708b20a6989fa9ab94444d61646686d1ac8da8a125a9ba6dec1902bc6d9b7fd201d5714b20a6989fa9bb94444d63680d0da0a81acad04a1b515529f60c895e4ecdb81908e2b015985b44483cc5c22226b1b4c686dc541d65686d0da8aab4f31e4ca72f6ed1048c79581ac425aa2a1662e1191b50d23b4b692206bab40686d25d5bb18721539fb7638a4e32a4056212dd108339788c8da46125a5b6190b55522b4b6c2ea630cb9ca9c7d3b0ad2719520ab909668b4994b44646de184d65604646dd508adad887a1d43ae3a67df46403aae1a6415d212459ab94444d61645686d9e206bab45686d9eea030cb9da9c7d6b81745c2dc82aa4258a36738988ac2d066c6d4cdcc610da7641906dd723b4ed82ea4d0cb9fa9c9e6485b8493dc82aa4251a6be6121159db38426b2b06b2b64684d6564cbd8d21d798b36f63211dd708b20a6989e2cc5c22226b8b27b4b62090b53523b4b620750c43ae3967df26403aae196415d212259ab94444d6369ed0da9e02599b37a1b53da5dec2906bc9d9b749908ef386ac425aa209262e11e412d1e3bad61fd3247e84f4742d4cd7fa61f8f9732a3c19a24d3fc82afea40a8fc628209052e151f24009c3af35a7c25320da0c84acd29a54e1bd310a684ba9f09ebad60bc3af1da7c25321da6c0b5985f2aa7351f8588c023a522a7c8c3c5dc2f00be254f844883621976fc34b8452f8208c02ba502a7c80ae0dc4f00be654f824883621170cc34b8452f8688c024228153e52d74661f875e754f86488364320ab74275578224601bd28151e2f4f5330fc7a732a7c0a449b986b0be125c2dc823b9513d6344e58d33961cde084359313d62c4e58699cb0d23961cde68495c1096b0e27acb99cb0e671c27a9e13d67c4e580b485f51b4c74cdc7d295f51b4d5b576187e619caf2816425e0b60aec20de36cbc459cb01673c25a42d9c76d742d06c36f2967d93339616571c2b271c2cae684b58c13d6724e582b3861ade484b58a13d66a4e586b485f034cc0ccc803286787f1ba9684e13790f335c05ac8f43e00b2ca405285476214308452e1e1ba1681e1379453e1eb20dac45c413c9454e14118058ca05478075deb88e1379253e1eb21dac45cb33a9254e171180584532a7c9caec562f845702a7c03449be190552248153e14a3000ba5c207ebda100cbf684e856f84681373795b34a9c2bb611460a55478b0ae75c5f01bcba9f04d106d62eeb91a4baaf01e1805c4512a3c44d7ba63f8c5732a7c33449b98bb7ce249153e02a380f1940a1fa66bc331fc923815be05a2cdf190559248150ebab3248552e19d74ad33865f2aa7c2b742b489f9adf0545285f7c5286032a5c2fbe85a2886df144e856f836813f3fb56535c71a156fe35900c29f4764e722910723b38c9a542c8ede4243711426e1727b9491072bb39c94d8690dbc3496e0a84dc5e4e725321e4f671929b0621b79f93dc7408b9039ce46640c81de424371342ee1027b95910722f70924b83903bcc492e1d42ee0827b9d910722f7292cb80907b8993dc1c08b9ff70929b0b21f73227b9791072af70927b1e42ee2827b9f91072af72925b0021f71a27b9851072af73925b0421f70627b9c510726f72925b0221f71627b9a51072c738c96542c8bdcd490ef39b6bef7092b341c8bdcb490ef3acf03d4e72cb20e4dee724b71c42ee034e722b20e43ee424b71242ee234e72ab20e43ee624b71a42ee134e726b20e43ee524b716424e71925b0721a773925b0f21779c93dc0608b9139ce43642c89de424b70942ee1427b9cd1072a739c96d8190fb8c93dc5608b9cf39c96d8390fb22ffe432733c04ce765ddba16b3b756d97aeedd6b53dbab657d7f6e9da7e5d3ba06b0775ed903c8097c7d4f230571e79ca8341797c260f99e4518c3cb090637d39fc962362394895e346399493a32b39e0916310392c9097d4f2c2535e9ec98b1819f5652096b151862b1941e407b5fc3813d3176b140391361331ca9609b1ff02", "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" } ] diff --git a/yarn-project/noir-contracts/src/examples/non_native_token_contract.json b/yarn-project/noir-contracts/src/examples/non_native_token_contract.json index 0bd6d6fde042..01a71ea7cd04 100644 --- a/yarn-project/noir-contracts/src/examples/non_native_token_contract.json +++ b/yarn-project/noir-contracts/src/examples/non_native_token_contract.json @@ -47,6 +47,29 @@ "bytecode": "cdda657794f71605702472e2ee8a3bcc333e48dcdd158bcc9494002d0d14eaa9af6a7242dd05eeea7d753f45755237dad4ef07b919b8ac9be62627237b92935790bdd65effff2f0f4332d95766d75f9e5bf7efc97f558c0f8d9cae3877a9e6c2d991caa1f1f1c9ab1de52db5d5d31c41421829855152182d8524853152182b857152182f8509529828854952982c852952982a856952982e8519529829855952982d853952982b857952982f8505525828854552582c859ba470b3146ea1c97f969f1f9b3875c63d3136323335c3d7cb2c26bbc5ea7698dd86c51832995dc34e9bc96a1bb63b0da76173da46cd4e8bc5edb43a1dae6197c3e432ac16b7e1b1b92c1ed38d0f63f37c87d963b786d2b1e5e63942e930799fba5e660af163491ddfa98c606f567cab6334789d4d089da7c3a8e33b9529989b152eec3005a75384d07926cc3abe533903bd59fea20e9727709d0284ceb3aba0337f2aab27909be52ed5e1084c270fa1f3dceae8dc3895cddf9b652fd761f55f2707a1f3fc2aeaf84e65f2e766995287c93f9d2c84ced42aebf84e35b2d2cdd257ea70acac9381d0995e031ddfa9ccd2cd52fde970c83a69081d5e231ddfa91ccbdd2cd9df0ec7f23a29089d9935d4f19dcab9d4cd1203e9702ead9384d0b9b2c63abe539916df2c3ec00ebbe7ff7512103a2f28d0f19dcab4f066b1c17498ffae1387d07951898eef54e65b37a3603bacffd38941e8bca448c7e2f6787c0733a242eab8a9138dd079391c3a21161ade9710252f237c5e51e9f302a2e44584cfab2a7d202557103eafa9f499469430c2e775953ecf234aa6103e6fa8f4791651f21cc2e74d953e4f234a9e41f8bca5edbb9ff9ef7f8c4804cf53089eb7553e3e6f214ade46f8bca3d2e70d44c99b089f7755fabc8628791de1f39e4a9f571025af227cde57e9f31ea2e47d84cf55953eef204ade45f85cd3e8b31e70b30804f13f543e3d571125d7104f0fc2e783aab1f3ee9189b18beec90fbace35b93b8646c72ecdcc4c217ec45c1ffaf9e6d61547444645534c6c5c7c426252724a6a5a7a466656764e6e5e7e416151f1a6cd5b66d7af13163a5ba5f9ce3629dc2e853ba470a714ee92c2dd52b8470af74ae13e29dc2f8507a4d0248586149aa5d022855629b449a15d0a1d52e8944297141e94c2435278580a8f48618914964a619914964b61851456866124570118c955225e833fd438922b038ce4ca113a1f691cc995004672a5089d8f358ee40e03467247103a9f681cc91d048ce40e21743ed53892730246722e84ce671a477276c048ce81d0f16a1cc9590123391b426756e348ce0c18c959103a9f6b1cc99900233903a1f385c691dc7ec048ee0042e74b8d23b9bd8091dc3e84ce571a4772bb0123b93d089daf358ee476024672bb103adf681cc96d078ce4762074be55f93ef23788926f113edfa9f4f90a51f235c2e77b953e5f204abe44f8fca0d2671651f239c2e747953e9f214abc089feb2a7d3e41947c8af0f949a5cf4788928f113e3f6b1cc96d43f07c88e09953f9f8fc8c289943f8fca2d2e73aa2e42784cfaf2a7d7e4094fc88f0f94da5cf778892ef113ebfabf4f90d51f23bc2e70f953ebf204a7e45f8fca9d16703e0665b11c47fa97c7afe4094fc89787afe523e92db0019c96dddb67dc7ce5dbbf7ecddb7ffc0fc6f8b2c569bdde1741d3c74f8484969597945a53c92ab92e63bd552582385b552582785f552d820858d52d82485cd52d82285ad52d82685ed52d821859d52d82585dd52d82385bd52d82785fd52382085835278540a8f49e171293c218527a570480a87a570240c23b961c0486e04f01a3cbb7e83c695dc49c04a6e08c2b351e34cee3860267702c213a171277714b0933b06e189d438941b000ce506213c511a97727d80a55c3f84275ae354ae073095eb85f090c6ad5c17602bd70de189d13896eb008ce53a213cb11ad7726d80b55c3b84274ee35cae0530976b85f0c46bdccb3501f672cd109e048d83b906c060ae11c293a87131570758ccd5437892344ee66a0093b95a084fb2c6b795e7bf6a90966408518a4ea204484b2284285527511ca4251e4294a6932806d2120b214ad749140d69210851864ea248484b1484285327d146484b0484284be390ae1a02b4010294adf319ca82b464438872741265405a322144b93a89d2202de910a23c9d44299096540851be4ea23c484b3e84a84027510ea425174254a8916823e06a5510e4229d4f5001a4a510f20415291fd86d840cecaaaa6b6aebea1b1a9b9a5b5adbda3b3abbba7b7afbfa07068f1e3b7ee2e4d0f0886f60f7b72ff434007734d4a30f5bf18772877a28bb097f284fa8871af2e00f755ba887725997588c5debac2b37dbec3cb76e944789ddc41ee2db88b7106f26de445c4c5c445c485c409c4f9c479c4b9c439c4d9c459c499c419c4e9c469c4a9c429c4c9c449c489c401c4f1c471c4b1c434cc4d1c451c491c411c495c415c4e5c465c4a5c425c447880f131f223e48ec2276123b88edc436622bb185d84c6c109b880f10ef27de47bc97780ff16ee25dc43b8977106f27de46bc95788478987888f824f109e2e3c4c7888f120f120f10f713f711f712f7107713771177127710b713b711b712b7103713371137123710d713d711d712d710571357d1fcbfe15363b79f1e3f73f6dc1d779ebf6be2c2c5bb2f5dbee7defbee7fe041ef43de49efc3de47bc8f7a1ff33eee7d220c7be8271053e62721afd725cafe4b336edcedb15095e76bbc8f43804a150119b7fee07d2414a0ffd6781f85009529013216fec53b192cd0821aefc310a0720540c6e24f3c188ccfa216ef43109f8a35f63196fae4fd81fa2cd1f20084a7720d798ce5827b03e159a6e53e084fd51af1185278d95f1ea1e51e084ff51af0182b35deed0fcf0a2d97203c35abcc63f8d37861251e3f5a2e42786a5791c7f0b7f12e89c7cf9609084fdd2af1188134deb91c4f002de7213cf5abc06304da786e299e005bee80f0348499c708a6f1cc629e205ace42781ac3c86304db787a214f902de3109e269def4537425a9a2044cd3a89ea212d0d10a2169d44b590963a0851ab4e22cc10a60642d4a693a812d25205216ad749540e69a9801075e8242a85b49441883ac3466404df783b04a80402d4a5f319ea84b4744188ba7512b5435a3a20443d3a895a212d6d10a25e9d44cd90961608519f4ea25e484b1f84a85f275137a4a507423410162223b4c6533781426a1983200fea7c82fa212d03902708403435ed7df23f", "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" }, + { + "name": "addUnshieldedBalance", + "functionType": "open", + "parameters": [ + { + "name": "amount", + "type": { + "kind": "field" + }, + "visibility": "private" + }, + { + "name": "recipient", + "type": { + "kind": "field" + }, + "visibility": "private" + } + ], + "returnTypes": [null], + "bytecode": "cd54cb4ec24014a508ba5440fc8e4e1fd0ee78447c241a030bd7855e6a6369c9b4185cce1f74a66a742df842133fc10fe007f819225a8886185c14136f328b9b939c9c73cfc95c6c5d93d792a5354e4b4eb7d2b11b65cdb248bf5a3cdcd9a62cc12d00938bc0558e3c15b1e99db4c0331b814fd9a820f2394982bc0048441a2fa87545e625b99e5390826445d6054514419194bc5a57f3bc8a2411505356c5261f4e6a54e0a38db47c51e9c8a2841fcef870043a6017ec2060a9e198a5276f63388eb1cc26b92f61d3b24ce39292bb9a691b16844e22ca4099c8143c25fd22c6da39cdfa37e4f6c039635c8cf4cb8eed7a2c46a3f3cfb8e2d1b91019541c0ca6617f1c3c18b89e833503aaa0e9943cee82d6fe74c25638465eaa6098ae0778cfd6a1cbcdedf1d0696265ea38417afb9d569bae857b8cebd53ca7fdf6951bfb77b9cd620b7cb60441eb4be0c84637e5fb57610271ee0fba38d79fe7697f8e27df0bfc5aa06ff0445c5897645813df7f07", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, { "name": "constructor", "functionType": "secret", @@ -231,6 +254,73 @@ "bytecode": "ed9d777454c5fbc673c9a2d7ae48efbd976c7ae8a1f7167a0fc9262c84242401c11e7b2799d0bbd29b625754041111984befbd2322222260c5df7b2ff0fb025f7881e45978fff87acebc4778ce79b8f7b3b37777679e991969b9ceecf2af91beb0414274ccc00649c39a0c498c69189d90903ea343649ba68d3395cb60c4dc9c781727e63519311f27e6e7c4029c5890130b7162614e2cc2894539b1182716e7c4129c5892134b7162694e2cc3896539b11c2796e7c40a9c5891132b7162654eacc2895539b11a2756e7c41a9c18c0896e4e0ce4c420337d6e648a37adff204f9a37262b234b6daf1f14101a14ec090bf4b883dcd1018111fdc243028243fa8586bbc3dd21e121b181e141419ef0e0f0b0887e11610111eee0208f3b2e2422282ec0f9cf1d481e8171a1c139f108ba701d39f108b08c1fb6d70fc8e17fd7c4635f963bbbb71670c92336fb78dc103cc77c88c7beac80ecdc5af5cb3d02b287a70604cf8f3ec6635f56f8adde5ad5ab3c22e26e1d4f35089ee3b7010f5d5670dcaddc5ae56b7984dd1a9e2a103c3fdd1e3cce6585dcecad55bc9e47f0cde3a904c173e236e2b12f2be0666ead3ce7117073782a40f0fc7c9bf1d8971573a35b2b7b238fb01be32907c173f20ee0b12f2b90bbb5d237e311c6e32903c1f3cb1dc2635f56d8f56eade4cd7a845d1f4f29089e5377108f7d59e1d7bab5e2b7e2117e6d3c2520787ebdc378eccb0ab8fad68adea24768dc7fe32906c1735a001efbb2022ebfb5c2d9f108bc124f11089edf84e0b12f2bf0d2ad15ccae47f07ff01482e03923084f90272ecebe3277fe1c795cc0530082e7ac2ff0e4d0d04daf1ac4e52c04d13999884e435c7e8320fa5d26a25310975f2188fe9089e824c4e51708a23f65223a0171f91982e82f99888e435c7e8220fa5b26a26310971f2188fe91f69d88be15b9f34100fd0001745e661ffa07e2721e82e85f9988fe82b8fc8d4094cb4f26a23f202e7f42101932119d83b8fc0e41944b24a25c06c425170491bfcc5ef42f04911f04914b22a28700b796170239b7cc37993fc4c505e9410844731a79533c3169dea19ef4391d935a793a44c77a8765656564223a53ceaf6f975fc9bcf9f2172858a87091a2c58a972859aa7499b2e5ca57a858a97295aad5aad70870070659861f93ee09e6a23f219c18ca89619c18ce89119c5893136b71626d4eacc3897539b11e27d6e7c4484e6cc0890d39b1112736e6c4269cd894139b7162734e6cc1892d39b11527b6e6c4369cd89613db71627b4eecc089513e08d8750004eca2200fe1b2120376ed0001bbf6103ce52406ecda0002766d2178ca4b0cd8b50204ec5a43f0549018b06b0108d8b584e0a9283160d70c10b06b0ec1534962c0ae092060d71482a7b2c4805d2340c0ae31044f158901bb0680805d43089eaa120376f50101bb48089e6a120376750101bb7a103cd52506ec6a0302767520786a480cd8d50404ec6a41f004480cd88503027611103c6e8901bb5040c02e0c822750e6c8b21be2120841142413510d884b000451b04c44d5202ed52188426422aa0271a90a41142a135125884b6508a23099882a405c2a421085cb44540ee2521e82284262c02e0402a82c04504d997d2802e2521382a8964c446110977008a2da321161de68a110447564220a82b8044310d59589a80ec4a52e04513d99886a415c6a4310d59788e861c0ad05432047caec41f5202ef5213d285278c0ee6148c02e3824342c3ca266adda75ead6ab1fd9a061a3c64d9a366bdea265abd66ddab66bdf218a0fd875e4a23f9d38b1332776e1c4ae9cd88d13bb73620f4eecc989bd38b13727f6e1c4be9c18cd89fd383186136339d1c389719c18cf89fd39d1cb8903387120272670e2204e4ce4c4244e4ce6c4c19c98c289a93e08d8a5000276a99087705f8901bb6440c06e30044fb4c4805d2220609704c1d34f62c02e0110b01b04c113233160370010b01b08c1132b3160d71f10b0f342f0782406ece20001bb78089e388901bb5840c0ce03c1132f3160d70f10b08b81e0e92f3160d71710b08b86e0f14a0cd8f50604ecfa40f00c9018b0eb0908d8f582e019283160d71d10b0eb01c193203160d71510b0eb06c1334862c0ae332060d705822751e6c8f220884b220451924c4403212e091044c9321179212e03208806cb44140f71e90f419422139107e2120741942a13510cc4251682284d26a268884b3f08a2211203769d2080fa42000d95d98786405c8642103d2613512ac4250d8268984c4483212e291044c365224a82b82443103d2e13d17088cbe310444fc844f418c4651804d19312113d0ab8b58e10c84fc9ec414f405c9e84f4a0a78407ec1e8504ec3a76eadca56bb7ee3d7af6eadda76f74bf98584f5c7c7fef8081098312939207a7a4da01bb2b5ee84c00dc1cff64f178f01795e31f09fdc2f01795e32fe64101f88bcaf157e130f735126333a39a45068684aa5d7eb12acd54434c35d4548f992ac85481a6729b2ac054354c55dd54d54c55d554554c55d954954c55d154154c55de54e54c55d654654c55da54a54c55d254254c55dc54c54c55d454454c55d854854c55d054054c95df54f94c95d75451a6ea60aaf6a66a67aab6a66a63aad6a66a65aa96a66a61aae6a66a66aaa6a66a62aac6a66a64aa86a66a60aa4853d537553d53d535551d53d536552d53d5345584a9c24d1566aa505385982ad854a9a64a31d56053259b2ac95489a61a64aa04530d34d50053794dd5df54f1a68a3395c754b1a68a31553f53459baaafa9fa98aab7a97a99aaa7a97a98aabba9ba99aaaba9ba98aab3a93a99aaa349efe161c31f7fe2c9a79e7e463fabd3f573fa79fd827e51bfa45fd6afe857f56bfa75fd867e53bfa547e80c9da995ced223f5283d5a8f499fd520c59b90e08d1f9549f4bd89f1091ecca3e9919c3f9a32d36744a6a4440fdfe597478fd5e3f4783d414fd493f4643d454fd56feb77f4343d5dcfd033f52c3d5bcfc9189b3ead75d250454fab190d931253d3945f26e0f93daf49528ac71b9f6877d0ac85f19eb4566e7a8c07b6f6a4a646c77b32d3e734f344273bd7a972e5c94c5fd0c113ef4d4df3a4344f8cf50c332e5c927fae8b97e69f3ebdc59041c999775df8b39f313d2a2d2979c9e51f12b3db0f494af37a12d346615e083d39e710b23232b26de2bef43f7a9e9ebb848989eab92539759ede831b80b9f418d3931184e72a041dec770d78379a7267ba91fbeabfd00bf47cb61bcdafcfa90bf4621f74a32908c2f315828ea471ce4b7cee45e0998378a1de05e0f1d54726e2e29c4b1a949ce0d1ef658c4c9f637fd8348f6b93449f85fe973e158d9c7f2abad31734f02646a70c6fe2f524c4b64d1ee937ad9177a8e1e77c9ae5e4c3e23fffc0e57d30330b0157bf07799116e6bc17fae2e61666a0dff82269411e47b91077361ef1387a5ff2e3e87de4e3e883ff3d8eae84ab3f80bc481f4a7c1cbdaf3f94f938fad0178fa31c5fd544c4a3e423c888e74489d3e47a3402d01808a049b2005dec412301014d3d0a0268b2184097e56ab502047c751604d0141180aeca65eb0c40405c6742004dbdd380ae95ebd76f011618e81110406fdf5140d75917a2df002c50d16f4200bd73c70031eb8af46b80054efa7508a0697704d00dd6a5e957000be4f4ab1040d36f3ba09b58d7a85f022cb0d42f4300cdb8ad806e725dac7e01b04057bf080134f3b601ba8575d5fa39c0026ffd3c04d0acdb02e816d7e5eb67011b04e87408a0d9be06949d7d1d9e06ec2ff10c04cf1c9fe2c9e6ae204f027627790a8267aecff0e4604f99c7017bdb3c01c1334f66fa6d2ec4651e04d17c998866435ce640102d90896826c4651604d1bb32114d87b8cc80207a4f26a277202ed3208816ca443415e2f23604d1fb32114d86b84c8120fa4026a28910974910441fca44f401c4e54308a28f64225a0871791f82e8639988de85b8bc0741f4894c44f3212e0b20883e9589e81388cba710449fc944f411c4e56308a2cf7d8128a77b0f0f03ec818c598eba48660ffa0ce2f239a4072d929cd2fb0899d2fbf87f29bd2be1ea8f212fd22712537a1fe94f64a6f4d0b4202b1e758ebf8db883afb13065763b4fac2725d59398a594fe549f5779f4793fa53fd39ffb206888f889a83f4398887ea42e423e52bff8df23f54ab8fa0bc88bf4a5c447ea22fda5cc472a8216b3aaee2beefc0fbd9855bf66d525acba9455bf61d565acfa2dab2e67d5ef587505ab7ecfaa2b597515abae6655cdaa16abae61d5b5acba8e55d7b3ea0656ddc8aa9b587533ab6e61d5adacba8d55b7b3ea0e56ddc9aabb7c70088fde09f825ac77417ea3ed90780c8fde0ec84ce81d10403b251ec4a3b70232377a1b04d02e8947f1e8cd80cc96de0201b45be2613c7a2322f5b70902688fc4e378f47a446e740304d05e8907f2e8b588e4f13a08a07d128fe4d11622bbbe060268bfc44379f46ac4ea070d017440e2b13c7a2562fdcc2a08a083120fe6d12b102bb0be87003a24f1681ebd1cb186ef3b08a0c3120fe7d1cb10ab40bf85003a22f1781ebd14b18ef81b08a0a3120fe8d15f2356a22f8100fa41e6a4f45188cb0f1044c764223a0c71390241f4a34c4407212e8720888ecb44b41fe2720082e8279988f6425cf641109d90896837c4650f04d1cf3211ed84b86086f04f8adc7b68318410660cff17999de824c4e51708a25332119d80b8fc0c41f4ab4c44c7212e3f41109d9689e818c4e54708a2df64223a0d71f90d82e88c4c44a7202ebf42109d9588488f45441cbf82603e27b30f9d81b89c85f4a173c24fe9d16321c7f4e8aff462fdb55ea297ea6ff432fdad5eaebfd32bf4f77aa55ea5576bad2dbd46afd5ebf47abd416fd49bf466bd456fd5dbf476bd43efd4bbec637c9880d06e363eb48755f7b2ea3e56ddcfaa0758f520ab1e62d5c3ac7a84558fb2ea0fac7a8c557f64d5e3acfa13ab9e60d59f59f524abfec2aaa758f557563dcdaabfb1ea19563dcbaae758f57756fd8355ff64d5bf58f56f5f44f8fe4244f8fe463cc7fdf38b8cf0fd8188f0fd090154406484ef1c22c2f73b0450419111be3388081fe4ab927f219111bed388081fe4279b7f619111be5388081fe4079b7f119111be9388081f6400d2bfa8c808df0944840f32fce85f4c6484ef3822c207197cf42f2e32c2770c11e1830c3dfa971019e13b8a88f041b221fe254546f80e23227c9064887f299111be8388081f2417e25f5a64846f3f22c2074985f8971119e1db8b88f0413221fe65450e5cfb9781b89485202a27135129884b6908a2f232119580b8948420aa20135131884b7108a28a32111581b8148520aa24135121884b6108a2ca32111580b8148420aa2232c2b70742283f845055999da80ac4a52a04513599882a415c2a4310559789a802c4a52204510d9988ca415cca431005c8445403e2120041e49689a81ac4a53a0451a0c808df3844840fb280c43f48661f72435c02217d28487a846f1c26c2b75befd17bf53ebd5f1fd007f5217d581fd147f50ffa98fe511fd73fe913fa677d52ffa24fe95ff569fd9b3ea3cfea73fa77fd87fe53ffa5ffbe4184ef1f363e749e55ffe554fa7779d9e0e55cbceccfcb2e5ececdcb77f1f2ddbc6cf2f23dbc7c2f2fdfc7cbf7f3f203bcfc202f3fc4cb0ff3f223bc9c87971fe5e5bcbc9c8f97f3f372015e2ec8cb8578b9302f17e1e5a23ec8f7d13f0a08f8d1b5411ef31d2426fce8550544fce8c587208a9298f1a3b70d20e447ef2e08a28e12537ef45c02c4fce8f10541d44962ce8f1efc80a01f7d3e4010759698f4a34f5640d48f3e802188ba48ccfad1571740d88fbee14010759598f6a3ef8680b81f7d858420ea2631ef475fbe01813ffa8e0e41d45d62e28f7edd00227ff4230882a887c4cc1ffd7c0484fee8572604514f89a93ffa7d0e88fdd1cf7808a25e12737f34000208fed1380904516f89c93f1a610244ff68200a82a88fc8ecdfbf80ec1f0df44108f59539e4dd07e2d21782285a26a25e1097de1044fd6422ea0171e909411423135137884b7708a2589988ba405cba4210796422ea0471e90c411427135114c4a5230451bcc8f0df7908a10e1042fd6576a278884b7f0822af4c441e884b1c04d100998862202eb110440365228a86b8f483204a90896820c425018268904c445e88cb0008a24491e1bff188f0df3f10cc4932fbd020884b22a40f25490fff8dc784fffed1e7f5bf34c2468399341249a3be34644bc3e334b64df308340940132e345b42335334ad44537834ff46739d34514993c234a34bb3e734f56d19f92c23bf6514b08c829651c8320a5b4611cb28ca27032da3181f3d2acecb2578b9242f97e2e5d2bc5c8697cbf272395e2ecfcb1578b9222f57e2e5cabc5c8597abf272355eaececb3578398097ddbc1cc8cb41bc1ccccb21bc1ccacb61bc1ccecb11bc5c93976bf1726d9f84036b41c281b5211f036fc90c074640c28135218846c80c078641c281e110441932c38121907060280451a6cc706010241c180c41a4648603dd90702066c94e96cc70600d483810b37870a4cc706035483810b3787094cc706015483810b31c7eb4cc706025483810b31c7e8ccc706005483810b31c7eaccc706039483810b31c7e9ccc706019483810b363d97899e1c05290702066c7b20912c381348407490762762c9b28734c7c02c4652204d1249988c6415cc643104d9689680cc4652c04d114998846415c4643104d958908e3321282e86d998832212e0a82e81d998846405c322088a6494c07d2cc2704d15b1044d365f6a2691097e910443364227a1be2f20e04d14c9988a6405ca64210cd92896812c4653204d16c998866415c664310cd91896806c4652604d15c91f1c009887b33301b9ccf93d989e6405ce6423ad13ce9f9c009907c20f528fa3a4a237534cc46439a341e4963bf34704b83e434c24db309341540d32e346742f35334b9441379340b47339e345d4953c334af4b73e834016e192196116a196196116e19119651d3326a5946ed1b4504ebf001a4babc5c8f97ebf372242f37e0e586bcdc88971bf372135e6ecacbcd78b9392fb7e0e596bcdc8a975bf3721b5e6ecbcbed78b93d2f77e0e5285eeec8cb9d78b9332f77e1e5aebcdc8d97bbf3720f5eeee99388600f484410b3da7995cc886037484410b3da79b5cc886017484410b3da59cb8c087682440431ab9d2d9911c128484410b3da798dcc88607b484410b3dc79adcc88605b4844b01d04d13a9911c1d69088601b08a2f53223822d2111c15610441b6446049b4322822d208836ca8c08368544049b41106d9219116c0c8908368120da2c3322d81012116c0441b4456644301212116c0041b4556644b01e2422581f82689bcc61f1ad10976d1044db6522da0c71d90241b44326a28d10974d10443b65225a0f71d90041b44b26a2b51097751044bb6522b2202e6b2088f6c844b41ae2a22188f6ca8c08d685205a0541b44f662fda0b71d90741b45f2622cc59927b20880ec844b413e2b20b82e8a04c44db212e3b20880ec9447410e2720882e8b04c44fb212e0720888e888c084256f11975209c8fcaec4487212e47209de8a8f488e0445044b00e7d1da5913a1a66a3214d1a8fa4b15f1ab8a541721ae1a6d9049a0aa069179a33a1f9299a5ca2893c9a85a3194f9aaea4a9619ad7a539749a00b78c4e96d1d932ba584657cbe86619dd2da38765f4bc5144b0171f40eacdcb7d78b92f2f47f3723f5e8ee1e5585ef6f0721c2fc7f3727f5ef6f2f2005e1ec8cb09bc3c88971379398997937979302fa7f0722a2fa7f1f2105e1ecacb8ff1f2305e1ececb8ff3f213bcfca44f22824f4022824f223e095c77c98c080e8744041f8720ba5b6644f031484470180491293322380412111c0a41748fcc88602a242298064174afcc88e0604844300582e83e9911c1244844301982e87e9911c141908820640779d70332238203211141c85916ae07654604bd908820e42c0bd743322382f1908820e47426d7c33223821e484410723a93eb119911c118484410723a932b8fcc886034242208399dc9f5a8cc88601f4844107280ae2bafc86171d7a31097bc1044f964227a04e292078228bf4c440f415c1e86202a2013d10310970721880aca44741fc4e57e08a2423211dd0371b91782a8b04c4477435c4c08a222322382bd2188ee82202a2ab3171581b81485202a26135121884b6108a2e232111580b81484202a2113513e884b7e08a29232119580b84036c37795928908b2bb9dab380451699111c1499088602f08e732323b5129880be45c0e08229f460427812282bde8eb288dd4d1301b0d69d278248dfdd2c02d0d92d30837cd26d054004dbbd09c09cd4fd1e4124de4d12c1ccd78d274254d0dd3bc2ecda1d304b8650cb18ca196f198650cb38ce196f1b8653c61194fde2822f8141f407a9a979fe1e56779399d979fe3e5e779f9055e7e91975fe2e59779f9155e7e95975fe3e5d779f90d5e7e9397dfe2e511bc9cc1cb99bcac78398b9747f2f2285e1ecdcb6378792c2f8fe3e5f1bc3c819727fa24223801121184a4f25d0d644604c741228290b3755c0d654604c740228290b3755c8d6446044741228290b3755c8d654604b3201141c8d93aae2632238299908820e46c1d57539911c111908820e46c1d57339911c137211141c8d93aaee6322382af4322826f4010b59019117c1512117c0d82a8a5cc88e0cb9088e02b1044ad6446045f8444045f82206a2d3322f83c2422f80204511b9911c1744844f03908a2b6322382cf402282cf4210b593392cde16e202d980dad55e26a2d61017c806d4ae0e3211b584b84036a07645c944d41ce202d980dad55126a2a61017c806d4ae4e32113586b84036a076759689a821c405b201b5ab8bcc88e0d31044900da85d5d65f6a22e1017c82141ae6e32117582b8400e0972759789280ae2023924c8d54326a2f61017c82141ae9e3211f580b8408ebd73f59289a81bc40572ec9dabb7c88820e4fc5be32908e73e323b1126ffd81bd289fa488f08ce0545049fa2afa3345247c36c34a449e39134f64b03b734484e23dc349b40530134ed427326343f45934b349147b37034e349d39534354cf3ba34874e13e09631ca32465bc618cb186b19e32c63bc654cb08c89378a084ee203489379790a2f4fe5e5b779f91d5e9ec6cbd37979062fcfe4e559bc3c9b97e7f0f25c5e9ec7cbf37979012fbfcbcbeff1f2425e7e9f973fe0e50f79f9235efe98973fe1e54f79f9335efe9c9717f1f217bcfca54f22825f4022825f423e099e961911fc1c12115c0441f48ccc88e0a79088e0671044cfca8c087e0c89087e0241942e3322f8212422f81104d173322382ef4322821f40103d2f3322f81e2422b81082e8059911c1059088e0bb10442fca8c08ce834404e74310bd24332238071211848cd6b85e9619119c058908ce86207a45664470062422381382e8559911c1699088e07408a2d7644604df864404df81207a5d6644700a2422381582e80d99c3e2af435c30eb02de9489e855880b665dc05b3211bd0c71c1ac0b182113d18b1017ccba800c99889e87b860d60564ca44940e71c1ac0b5032113d0371c1ac0bc89219119c0c41f43404d14899bd08e38259bb3d4a26a24c880b66edf668998846405c306bb7c7c844f426c405b3767bac4c4463202e98dd48c6c944340ae282d98d64bcc88820645cde9804e13c4166271a0771c16c8c34417a44703e28223889be8ed2481d0db3d190268d47d2d82f0ddcd220398d70d36c024d05d0b40bcd99d0fc144d2ed1441ecdc2d18c274d57d2d430cdebd21c3a4d805bc6c796f189657c6a199f59c6e796b1c832beb08c2faf1d119c19d52c32302454ed32fc94de652abd93da0e6adba96da3b695da166a9ba96da2b691da066aeba9ada3b696da1a6a16354d6d35b555d45652fb9eda0a6adf515b4eed5b6acba87d436d29b525d4bea6b698da57d4fea6f617b53fa9fd41ed776ae7a89da57686da6fd44e53fb95da296abf503b49ed676a27a8fd44ed38b51fa91da3f603b5a3d48e503b4ced10b583d40e50db4f6d1fb5bdd4f650db6d2acb286a972276296c9742762968970276c96f977c76c96b9747ed92c72e8fd8e561bb3c649707edf2805deeb7cb7d76b9d72ef7d8c5b4cbdd76b9cb2eb9ede2b28bbf5d72d9c5b08b1f5dd4bfd4ce53fbc7fe8bda76a965979a7689b04bb85dc2ec126a9710bb04db25c82e817671db25c02e35ec52dd2ed5ec52d52e55ec52d92e95ec52d12e15ec52de2ee5ec52d62e65ec52da2ea5ec52d22e25ec52dc2ec5ecd2d32e3decd2dd2eddecd2d52e5decd2d92e9decd2d12e5176e96097f676696797b676696397d6766965979676696197e676696697a676696297c676696497867669609748bbd4b74b3dbbd4b54b1dd33988d739acd739d0d739f4d73918d8393cd83960d83984d839a8d839ccd839f0d83914d93938d9395cd93980d939a4d939c8d939ecd93910da3934da3958da397cda39a0da39c4da39e8da390cdb3930db3954db3978db399cdb39c0db39e4dbd905d0d929d0d94dd0d971d0d995d0d9b9d0d9ddd0d901d1d925d1d949d1d96dd1d991d1d9b5d1d9d9d1d9fdd1d921d2d945d2d969d2d98dd2d9b1d2d9d5d2d9f9d2d91dd3d941d3d965d3d989d3d9add3d9d1d3d9f5d3d919d4d93dd4d961d489203a314527cae8c41d9d48a4139b74a2954efcd289683a314e27eae9c4419dc8a8132b75a2a74e3cd589b03a3157270aebc4659d48ad13bb75a2b94e7cd789f83a3160272aecc4899dc8b1134b76a2cb4ebcd979807e65198b2de36bcb5862194b2de31bcb586619df5ac672cbf8ce325658c6f796b1d2325659c66acbd0966159c61acb586b19eb2c63bd656cb08c8d96b1c932365bc616cbd86a19db2c63bb65ecb08c9d96b1ebcacfd94cc89788dd39fee808f1c1c7bfb10b72737b201fff8b847d43725fb8b91d3905edb65d7642107d2108913be0ff5fff6d3941e4bee4b21d82e84b2188dc97ff811e33d945e4bedc652b04d1570210b9affe0b7a1e670791fb6a97cd10448bef3022f7b5fe923eb86e1591fb5a2e1b2188bebe8388dcd713e813fe5610b9afe7b21e8268c91d42e4e644fa2a74b388dc9ccb5a08a2a5770091fb468ef49df16610b96fe46241107d739b11b96fc691be5cdf0891fb665c5643102dbb8d88dc37eb48bf423844ee9b75590941f4ed6d42e4be1547fab9763d44ee5b71590141b4fc362072dfaa23fdaebd1622f7adba2c8720facec788dcd971a40180ab11b9b3e3b20c8268850f11b9b3eb48232597237267d7652904d1f732e74256405cbe87205a2913d17288cb771044ab64225a0671f9168268b54c444b212edf4010699988be86b82c8120b26422fa0ae2b21882688d4c445f405c30db3eacf5192277f61d6912098208b3edc33a99bd682dc4651d04d17a99882c88cb1a08a20d3211ad86b86808a28d3211ad84b8ac8220da2413d14688cb2608a2cd3211ad87b86c8020dae21344ee9c395ac6c5af8eee9cb92c8680de2ab3176d86b86c81f42204a2ff4e44ce6ee789f5a4a47a12b3462acbd8adcf53dd43350f353d559ff7a33fefb58c7de9b31aa4781312bcf1a332d367467913e3133c983c29d9e7fcc6323226a64f6b9d3454197ee9331a2625a6a6293fc442be794d92523cdef8441b55d67b31299ee8344f9b218421ceeb49c94c9fd3cc139d1c9992123d5ce53232d31774f0c47b53d33c29cd13633dc38c4b57025952b8a08137313a657813af2721b66df2c8dcd322636373b9d2a7b74a8a8e55feb97dfa6fcd6c3c78487442aabf2b7d668b2183929bc7a9dcf74eef98129d9c3eddfe73e67dd3a3d2929297f82231b63fc7b713ec8bcb3a90e3cb0a64df8b59f4aedbefbc170f507df8c2dbf0a0651cf2e1dbf060ce7b4e66fa0ce7dd9069198733c6f9e41d79d12b57cebddc57bebbe7a5a625a544c77b3a78a263af7867fb1beabfded957fe39d7853b75f95fbc63d7c5f7c5dd17feec675c7c7ffcff6ba704be76975ebaac0c05b8a48720b77518f1c930fac2ab90cbf0417fbcaa0fcdbfd887bad003c773c34e74c5a7c7c52e93fb5a8fd22c392f08e4e97904f0b2d223e6c8ff01", "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" }, + { + "name": "redeemShield", + "functionType": "secret", + "parameters": [ + { + "name": "amount", + "type": { + "kind": "field" + }, + "visibility": "private" + }, + { + "name": "secret", + "type": { + "kind": "field" + }, + "visibility": "private" + }, + { + "name": "owner", + "type": { + "kind": "struct", + "fields": [ + { + "name": "x", + "type": { + "kind": "field" + } + }, + { + "name": "y", + "type": { + "kind": "field" + } + } + ] + }, + "visibility": "private" + } + ], + "returnTypes": [], + "bytecode": "ed9c6753535918c7d38820babbaebdf7de12924062a508882228ac6d5d4b2097184d330404fbb5776f6e88bd032a228efb0df6039c2fe00c9fc5d9270d09cce28b3cd9f9bf9099ff8b0c19ceef77ceb9f779ce71c62ef179501393bf947b9dcd27cb031d556dfee60aa7d72bf73694d55557465483768c5fe68df54ba356fe5816f2848ffba4b0a739aa44d4afa51653b1d52a951449668bd9692a7234d96d26abada9d86eb69b6d769babc86eb14876abbdc4d1e4283139cc568b646eb1392c2da6e4cfd4afa5a62c7ff8a1a621424d47849a81083513116a1622d46c44a83988507311a1e62142cd47845a8008b510116a1122d46244a82588504b11a19621422d47845a8108b512116a1522d46a44a83588506b11a1d62142ad47843231408dbe68f8b05b7249a156c91f1dd42c5027896feaef94c9942994a9946994e994199499945994d9943994b9947994f994059485944594c5942594a5946594e594159495945594d5943594b5947594f51493f8b6463517f14f9c057135ad88503644a86244a81244283b229403116a0322d44644a84d88509b11a1b620426d45842a45842acb797bf59b6aa636c742b1526c94624a09c54e71503650365236513653b650b6524a2965f1f6a8bc825f7c5bb6e266eb98e2aaba2dd9556ad4caaa1f7c33de7f56c6bf59bd5d7e5f1ef278bd1e772c22bf6bf4f8dd5e29e99be52299abb35fe888dc5b160a393ba3353b762a8fe5ee5d817655ab917b2b02fed6b0aa89306ca5feaa4048f2b8fdf1298a0eb8a57045c0e7f3847d923f1c91fbb64bce608240d5e923f24083e4f6b486a5508ddf257568933c7a5d8a4b2ff7ec68f30523c6e4678db6a7311c08fe93b991a20c133b8e6133ee64f81bb50cd39fabcd57cbb1f988c817f44abb942eb92fbeb4352d7501da76faf406d466bf01cdf240b9c7ef0c75567924afab3ed8a5e9dee669d76a127b27aa280c030cdf7f9128c3d4eee258a0baecf71fbf599d928b8a89305563958368e22aa29ab2235e12ea77f3d7be3d59cf82951faa81e1e11a7b5ef7d09c3624af79346ae31fdfdf76cad0cb65aff23477f5ec33d5b306a7df15f0255e2f19054dab55d203eb39061ef11e337497b95cf19a581b70ba549d2159140de962694815cbfcb18a25c722efcb5a2d073765fbb386b2f0431dc8f1e3f048dd478fc2a461b79e7b29fb2907e28fc7c13f7fd0b336d2370fc6bf79e8afef0f92cadb3634323c08c996f5210fd0a4ec81784026a3804c4101d9cb01927dc36161e91287ead161e579f295acd3e6e0bc559c599ffef607c29e96ce8a90e40c4b2e6aaea58c12a5d7aaa3ce5cc38f64c634595e0e0a98315ec0f479a90266489dea8ca942a635a60ad8f811052c57079ac38c079a233f0f3419537b8463818e021e680e1f853cd0704cd5d07316e37dce740c1306d792b0024d46039af2b369cbdd52fd6cda4683e0346dc96dab1e732a839a99c94e242f7dd4d667de4fff1ffddc1789aece2bfdcda1ce20f573b50177463b67d4c646b573999f75233eeb477c360cff737943ed5f7e0edabf8278fb67cc4fb57fe30ad2638d8f305c282416a24023f727c7acf187eb83314d7cc4524daaa12c1c1a71024753d64bed5748520bc7658e599818b37002eb4ca6c7caff8fb1127e130b52db7162aa919e9eeb9ba026c47f0d6d46847221424988502d88506e44a8e388501e44a81388502711a1bc88503e44283f225400112a8808750a112a8408d58a081546846a43846a47843a8d08d58108d58908750611ea2cc3d50b3bd439ee9952196eecb40c62e711c5740c621710c5f40c621711c50c0c62e212a2591e87998c6866e430bb8c6856ce617605d1ac89c3ec2aa2593387d93544331787d975443389c3ec06a2593587d94d44b3160eb35b88666e0eb3db8866c739ccee209a1de230bb8b68e6e130bb87687682c3ec3ea2d9490eb3078866f51c660aa29997c32c8268e6e3305311cdfc1c665144b300875917a25990c32c8668768ac3ec21a25988c3ec11a2592b87d96344b33087d91344b3360eb3a78866ed1c66cf10cd4e73983d4734ebe0307b8168768cc3ec25a29993c3ec15a2592787d96b44b3331c666f10cdce7298bd45343bc761d68d68c6f11f44891e44b37c0eb35e44b3020eb3778866e339ccde239a1572987d40349bc061d687683691c3ec23a2d92f1c66fd8866bf72987d4234fb8dc36c207b336550633e7fe1a2b8246471595c1157c535715ddc1037c52d715bdc1177c53d715f3c108a880855444597888987e291782c9e88a7e299782e5e8897e295782dde88b7a25bf4885ef14ebc171f449ff828fac52731f02f", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, + { + "name": "shield", + "functionType": "open", + "parameters": [ + { + "name": "amount", + "type": { + "kind": "field" + }, + "visibility": "private" + }, + { + "name": "secretHash", + "type": { + "kind": "field" + }, + "visibility": "private" + } + ], + "returnTypes": [null], + "bytecode": "cd57cb6ed340148df3000916a12dcdb3a87c821d3b8db36b121a28e29922b19ec49330c2b1c3c4a9d2e56c58dbe31609895d93d0522af513fa01f9814a7c4b8553a78214e4223cae329217a32b5ddf7bee99ab73761ffe0825c94959058df765bd5fed698d0a505532ac955e3cdeb06894f308c6bc82b738f2ad8491f1ae0d0dd4b04d8b9ead8bfc9a24c1420e0aa200f85cb12ee779295f5f930559c8cb7925278b229425b950ac170b7c5190442834f345b1c9bb67e16c9df77724f6452dfa2e2af717180f5e4105e22ed46c9b2e8ccfe9a2f371e3f3105dba4fbe96315255d4dab3c8680b692d15ba9df82c4358f29d82b7c8b08431d8b196cdcf64ffb9be4db910195674ad6bd090e53fff65aeb0ff5c0239aaea18a2963601dc3eea1a3a062d588340b1c8e113083a179dd00847c9710db650d780785353609fbb720fbb9d4623d38ea364f0b4d7ee58b7dd7b881b6c197ae7941c3e4218360cb40dc9c1eb9e6e20a8197b6c46b7ec1f5adb34ff2189e01d4e264e3d7642a2ef114c8e3fce3e4e9bc1e35c66806d8232c08501f503a44f7c4ee8934e79d127e5459f7410f48933c036c5803e6906f4610e4ee2a6c0b926c7aa7f7cff039c822738428601c059063956835b3c745e38e47ffe4c965726ebb5bcb25ecb2bc3fd127574ee44dda5a66333f2f87cc81dd3fce4cab330178050bd222ebf4fc5e55b67cbc06bd5e56f61a738574bc62e34241bc79261d09e9763a134eeb8957b13b7b2f22030b7b2c282035f02312933b33f6960080c58d1db6d64b49dd569cd0ed8fa63fed352a22c4a392e230de09d2a82aaf2b2b31bdb2f294ad83128cf74a0d0482cd07f8d363ef480da8d44c968c2e1cd268ddd19bcc1a033e5f4dd29a74dff6430cd9f", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, { "name": "transfer", "functionType": "secret", @@ -289,6 +379,50 @@ "bytecode": "ed9d077454551ac767522620b02b4dc48abda1665220b12601a2a1a41283baae86e4250c243371320182aeebac658b2ccebc21822c201a22040441ec05b1b70f7b43636fd87b77397bdfcc04320106ce99ff5bfe274ecef972ce98e77bffdf77ef77eff7dd7be73177a335a5c3b2d9bb26afaeb26a5a9e6b667e93b36a54655d9db7ad34b7f08c317e3dc91ae58fc9d1fe68b37a57e4ba1d9e29f59ac75115f0f9f54d39e9a9233232b491699a3ddd5e999a963d392b33352373f2882c7b963d332bb33a2d2b3d5dcbcac81a993d397b646ab63d235db3d76466a7d7a4867ef6d994931ae30f5ed4104651fb328a1aca286a3f4651fb338a3a8051d4818ca20e62147530a3a8618ca20e61147528a3a8c318451dce28ea08465147328a3a8a51d4d18ca28e6114752ca3a8e318450d6714753ca3a81318459dc8282a15206afb9a7e79b156adb91b3567a0c3324cef2f5bf401ca062a1ba46cb0b27d940d51b6afb2a1caf653b6bfb203941da8ec2065072b1ba6ec1065872a3b4cd9e1ca8e5076a4b2a3941dadec1865c72a3b4ed97065c72b3b41d989ca5265cb70dd9e86775c3a636b66308aca6414358251d4484651598ca2b219459dc428ea644651a7308a3a9551d4698ca24e671495c3282ad7f4f46a6fddaed29c746519ca32958d5036525996b26c6527293b59d929ca4e55769ab2d395e528cb35d2a3bc5178f0d1318367e0458d8959943d6a6b04f4d1caa76342e9ae45cf3fc3bb2ccfeda8ab73d4b6f8bd3796399cb5755a88245619f9b1f72bbfb72dd7edae6c5e7466c1d871e3271416159794964df4cdf7b64e704dd7ad166fdb2897b3d1a35bfc803ebc32dfe5d61cb54ec36181f65acd53e8f2688d697e6ffb995a654350879ed0cfef5d55aad53a1a3d9abbc059adcdb486b424268435257a978e6daa6ff0db429f2dd6a5651e57c3066ffb68875babf238a66bdee5254d2e8f43737a5a308e2e8c1d3ee0f3c57c93b4b3ca3744d93b2d8fb6b17a96fc3732940280502a04f8b65c07f805d0394dec3e1349bacfa48a68dda7225af7996446f79908f06d05a0fb4c624c1ace8e9d0b2fea1c93e7ce79fad96ade2c503656d93865e3954d50768e31979efba7a8ffb7aee7ab2bcf35ae3cefcf78f8f3195be402d35be47ce5d32265c5ca4a94952a2b537681e1e7cac9bbd12295c69555d5db0f20b12a1f0070e058c03d34c000625692a8219244a5a8bea14eabf1cdf5b61bc957418d4add744b62677a68f503bae1aa3c87b3d2dd9cefd0eaaa8b1ae65a5a473ba65b2dc1ec0e31fdd923fa9f3f00706d0da2816a63ef7f78b25a1f7a4e44c4fb4040ac8e03dc630a71bc4f01c6bb231eef11ae75201a682a61bc4f99ea33658daa35b7707440afb5ea53add32287031d1086e5807bd481fb19a43002d4c4f669807bc816f02c60f4d5589d33ad0e9137c3d16812da62c03dea8927b87ae004e78c4f7011ae75221ac84538c1d5bb7a6c425b02b8470371bc3700e3fdc278bc47b8f6424403b909e3bdc16d6642ebb2ea6e6b233ea1ad00dcc3c398d00256e9ed8d807b6cb45a0833da460f22a3c5b0ed641b4c0738bf00708fa23db39566effe1fa63745db4a6bca89f2c7e9b21e1f6005807b1441022c8131cf6ad2014d0e89d104eeadeafe24f1357346b4f89a112dbe669a115ffd01be9d01e8843359a32b5607cf800c3e49b17b38e6be93da0dcdde0c70cf2cc8e093c49d2040fa51ec3d00328035cfc2947c3b1fe766451b049b77f01e8d58b53483eb3cc8f9878b008732a29f7fb868272752ca8d530d17ff6537ce3f5c6c5c79c95fb7ad90e8d81592b180b0860a1a075cb2914b7d0b43273d13ace69f4abda956f39469556ecd334e6b8e38989a68d5b73b981af939a15356324256b7c5245b6b6e757562b277e9785765b59e143efc6a4b0abbc4163e14bb57c4a1584c6b969b7c7c5dd72f514122971a51225ef9dbb63809d09d97de2a08b14825de72c42a55e804f735181f15200a0092418d6630c30819cf2264028b9072e43c73996f51e4370d4c996f4644ce37eb9c2a83ae692e6c52e35d8d43ab36be111131ed245903bb9c76bace52b64ead361326a114631252734f68124a4e09f9272539eca794f024d4a7db2484c883cdda5d92cb907de8f2f8fe52a473e57248235d41b8c5a4e0aef099f1cd013a6f410a35b9d2f44a4daedcc951f58a606af977f9c76e146bea32e3e27fcabf4cabd78ad9eab512e4187855bc5edbb3f55a85e9f59a8a0e152857050365b6fcfbf753b0cdaea02bd88a5892f1621621252c424a598494b108a9404e3473e2055bf79fdf43c13607d987ae8e176c91ce95ab218de4632cd8e6888fb36043786b6bbcf9b6f56ebf6f8179a9f76a957a97563aab5df5c1fe1d31085aadbece07279a30ac2519c39af12290e0b096104eaa933adf1092141ed67a9939ac7571b31e7733dacdf8e58700e3bb8864aee92f23928051abcd0dbd7553d56b2d728d091cf318df8d20f36356956e82aa6b4d7f6583cc53cdddbfcb8b5645377ecd377e5d1bec050be43fbbaaf15b8cab1704af5e288b4c5b0c9316b68aba3f4bb5348845c8601621a2ef99f3a9db0d0b90596e5b06b1d8d435d36e25ecda50093bcaad557a7650c0ee68e1b4eb0bda6c84cba6d405eb6264c17a5dbc608d74ae5c0769a4258c05eb6259c259b02ea1dc61bc1e9d84b27c73a0007238dec6f8dd812244c3df00391d6f3323d462666ba5ac61969a5fc35c6fd41f3774f95723c46ffc6a357e2d0d96256d72e3ee6ce8b7052f5e26cb4dab61f291254c4f1a7468362707b0081948534af97b6629d51e2fa57a6e29d58e2ca556c44ba948e7ca0a4823ad642ca5da65256729b512b9f7d7828db704b6838a90c562a8a2416c8206c797d3cd6baaf872fa0e94f0e480a17eabcb4db2cad761191aca6c923bf7ad13ffffa7c5d668f50ecf186795bbb941e587e35db511e9a1cddab2cba362919f13bb7d4eea7abbe4ade9642f13d2c9de463a69eb154e27537a773e6b2f3f60d52dd810bd2dde95a16716383d450d2d16e38939967082da67eb13fb22d2b3369588b935bd4f4ae433fb049fd9a72fd4939dcfeab5936705f9faf50e77c77ee1c47c889989794f4f14f2d9040d60133430be66b5e37bc4d7ac4ce82af135abed69b6e52babe5e678be12e34f3c5fe981f90a7ee36a0de526df5a4a55b750aa5a67c21b5c63eda8e5e741d06e2544aba882a0dd46d9976ea7547507a5aa3b2955ddc5381a8817c27637e37020b3216cf750f6a67b2955dd47a96a3da5aafb29556da054f500a5aa0729553d44a9ea614a558f50aa7a9452d56394aa1ea754f504a5aa27018b7078554fa17d8578c1b71541268c640908b28d8c648908b2a719c9921064cf30922523c89e6524b321c89e6324cb43903dcf48266b10682f50a2ad45a0bd4889760b02ed254ab47508b49729d16e45a0bd4289761b02ed554ab4db11689b28d1ee40a0bd4689b61081f63a25da32045a0725da9d08b43728d1ee42a0bd4989763702ed2d4ab47b10686f53a2dd8b407b8712ed3e04dabb9468eb1168ef51a2dd8f407b9f126d0302ed034ab40710681f52a23d8840fb8812ed2104da664ab48711681f53a23d8240fb8412ed5104daa794688f21d03ea3445b8d40fb9c12ed6604da1794688f23d0bea4447b0281f61525da9308b4af29d19e42a07dc388968220fb9691ac1782ec3b46b2de08b2ef19c9f64290fdc048d60741f62323595f04d94f8c64fd10643f3392fd0141f60b23d91f1164bf3292ed8d20fb2d76325f87c52e221be56979469e95e7e47979415e9497e46579455e954df29abc2e1df286bc296fc9dbf28ebc2befc9fbf2817c281fc966f9583e914fe533f95cbe902fe52bf95abe916fe53bf95e7e901fe527f9597e915fe5b7ff01", "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" }, + { + "name": "unshieldTokens", + "functionType": "secret", + "parameters": [ + { + "name": "amount", + "type": { + "kind": "field" + }, + "visibility": "private" + }, + { + "name": "owner", + "type": { + "kind": "struct", + "fields": [ + { + "name": "x", + "type": { + "kind": "field" + } + }, + { + "name": "y", + "type": { + "kind": "field" + } + } + ] + }, + "visibility": "private" + }, + { + "name": "recipient", + "type": { + "kind": "field" + }, + "visibility": "private" + } + ], + "returnTypes": [], + "bytecode": "ed5d0778545516ce4b250494de7b15a564d2434d022490845488c19ef212469249984c3001591dd7b245d7c91b62436c80828862efbbd8db1d5dbb68544444ecbdad827bee9b09f0028cecce79f8ab93ef3bfff7cd379337ff7fee39f79e5bde9b951ee5ec36a5d6b939a3a6ac6271465d5366a3ad6266594d8d735d517a5ed6ec162d5cf1f36684bf372315e78de976ab6351adeab056b85d2ddad6b4f8d8a4840435394eb5c45bca62e352cb5312631312cb93522c2996c494c4cab894f8783525212539b53c353936d59210af5aaa1253e3ab62bd7fbdb7a6c506f8c74faa0f22a9be88a4fa2192ea8f486a0022a98188a40621921a8c486a0822a9a188a48621921a8e486a0422a99188a44621921a8d486a0c22a9b188a48e4124350e91d4b188a48e4324351e91d40444521311494d4224158b48cac240eac0d58ff5056aa56a6f506deeb690615a77b147eb41d693ac37591fb2be64fdc8fa930d201b4836886c30d910b2a164c3c886938d201b49368a6c34d918b2b164c7908d233b96ec38b2f16413c826924d228b25b3883de3b5b8787ec72520b6662222a9244452c988a4521049a522929a8c486a0a22a9a988a4a621929a8e486a0622a9344452e988a4324c2fafba697154e62490259225912593a590a5924d269b4236956c1ad974b219646964e96419b23c9a398b5ff8ec808527f093ca0c9894c56f6bb8b5d9e4d34c6fb91ba265cd71de9061b7d6d458ab5b5b9cd7175b6dd535aa5749a034b2028fab16e7ba74bbbdac79f5dcec9cdc7979f9058545c5f317b82e73ae9957b75453429ceb66d6d91a1c5a480b430c6fccacb3abd66a9b74987b43b5eac8ab73a80d712dce0d73d4b27a9d8716dab5c5b9a948adb6363854fb5c5ba5daa478b98485fa388539d76637d6d6b7447a5f87286b8b1d75f55b9c1b6659ed6a85c3ba5475ae2f6cac7358559ba395c7d1f9818b77bb5c015f24eef8922d7e76994bfc6d411f2f761b53c9cd904af90cbe2dd118fcc2109c2686cf0290f05958ea2f7c4afd85cf4233c26701836f4b19c2672162d17042e0baf8499d68f2d879a976028d9bd9643964b964f3c8f2c84e9463e94927fbfd6f4dcba24f9e243f79caa9fce24f436c9132d35be434f26901592159115931d97cb232e9e7f28ac3689172f9c94af5c00e2450e63d181c98c3708d2a860ec4ac22b18aa3482446b5f5356ab56ba573832cbee65651e9a68584b597874a0b43186ecab0dacaeccd9956b5a632bf7e65c89a59d6a54a885edd710c7f1643fcb5b8195c5bcdd1408b028f3f7e658b5cdc632247bef764c8d55c866b5881f3ddca98efa707f3dde0dad3391a683160be5b17bb4c59a35a939e37cbad2d52b4c54a8db13bd018d2b084e11ab5cc71c632316298135b6a18aee151ce601e0664b006ea9d9a5a8ec2995f1b4c495bc8700d1bf01067631ce2ea82439cc1b5751c0d540f38c4d9ea7fb7256d11c3359600e7fb12c67cb707f3dde05a3b47033500e6fb9206334bda7a456b501cfc256d29c3351a114b5a86757a8b83a5a46d062c691d8d3c256db3791b611a83f3b319ae5170a436d32cfedf3e63a9bfcdb4a54d7ede3c439ccf9f60d90cd7286049b0e58875d6528da1c959727439f666757790fc6a6ef2975f4dfef2abd98cfceacee0db2686206c46cdae401ddcc4d2f9ac08dcc3ff47ec24fb956659c6e09ee52c9dcf0aec0281258e028f00960e6cd9729e29dfa1fbb9e5fe3ac1650779e648a05c9631cff3584e409cc9702cc3ff0988330f7126a5449e6b58f1a7c33801b1427ef22c71f6be25128d7789248721af5909e532aed908a7eb4aef61cf50c5fc83a93755ab8e62b5c2ae3a72d466c3d9d430453be06caaf175683bad080e5a1d569322d7a45756864538d7e6d695556ae1bef3af91e13e9744facec576369c8be569cd12934fb06b941c7b34e1946922ce117fde97276eb823d37b0971ac5289734a3896a9bc87b82fe1f15136c70c00a45383e9cc7888cc4321928742a484739c39d7b5da78b38129e34d9271bcb9dd46257455735e23f5775556b552de14611876c215f72f0e3bfb8f5291ed5c234d1884a2e42044638f77108a88f2fa272ac2e7a728df2014d36110e22884cdda5e12e772c6d079c10d26a373c5792c8d743ee01e13893bdf65c6cd0370de6299a9890b4c9faa890b0e715abd542f2dff22fe7a18b335fa98fcf0dfc4df4d9baf15a2cdd78a38fbc00b83f3b55f77be566afa7c8db28312e5423d512e12fff8e34cd82e2a859bb015a014e38528448a508814a310998f42a49473a0b9383861ebf8f74798b05dcc1943aee084cde85cc1d3482d8813b68b450be6848dc35b7bf3cdb52fba35d715e695de3753e95d5466abacabd5e3dbd0092a8aabfd8bc34ce8d6c265b7269f05a2776ba1bea23abcfd2121e1be6ead9309dd1affbcd8cd7d6739ca81976c96331d67211e7929e068f8952c873ace427c7e85680d9895090fec149798febc04e19633e395fb3dee5468125a255ca24f982f15971dce32d4a5fa872f175798b60c95c53995fd3d753a3053ea1e28447aa21011da913aa1eaff2f9ea59ad857a9ad3275d1b4c31cf656ef1c76a65d2d731c64067bb095d3fd1fd21609b86e0a3d635dc53963bd323863353a575cc9d248ab1167acabc46acc19eb6ace196b2b6fbe85a26daf65a111ea8146a867b0143df83582a5a809a1122c450f54d3fe2c604d5c25ae76b585f4f7165811ed6b6b61477eab65b35a6b75ccb655d89beba94ccdadab3654a9914aeb2feeb3185f8775781dbeffe522f656b59d4ca86aa365551bd9c957d54645b77f57e71686c53fbd21a2439c1bbddf39d7e6c8af6f0d91df9816e2ab9363f67e63178e2a711dd58376558b89327e678cfe9d315d583dd9fe5d9d0ef15dbabeaed1be70ecea9b1ff4fd4d2cfd5e03b976772d24abeb2059ad8164b51692d53a4856d743b2ba0192d57a48561b2059dd08c96a2324ab9b20596d8264753324ab5b20596d8664752b24abdb2059dd0ec9ea0e48567742b2ba0b92d5dd90acee8164752f24abfb2059dd0fc9ea0148560f1ea11f1eee258fd35c23e15a09d749582361ad847512ae97708384f5123648b851c246093749d824e16609b748d82ce15609b749b85dc21d12ee94709784bb25dc23e15e09f749b85fc203121e94bfbb27fe29fe658267b740b6f74390ac1e8664f50824ab4721593d06c9ea7148564f40b27a1292d55390ac9e8664f50c242b01c9ca03c9ead923f03bc554ee50e5b345c243121e96f0888447253c26e171094f487852c253129e96f08c0421c123e159bd7e7a4efc7bff737bde3d6cfa2aa0c7a17210e98571d4207891e0458217f9352fb2ef1cf0f3ae55fc47702c1deef1db544ffd79babdbab156b5391a8cbfd5ad18eff8ebd6ce22dc84f33311f2b44768b8effc4c98effee508dfa12425c277ea23daec531f1cf78e89e73886ebe7392ef202f0efbe7090db972d2f064fcd1b9d2b5e6469a497104fcdbf205ec23c35ff12e7a97937f0a9f900dc1f57a1265655942732f726cf71f426dee9c52af1b27845bc2a5e135bc5ebe20dd126de146f89b75d571c8123b21dc6e77b55db9246b5512d682cafb156c85997c35aa7bf657c26498cfb7f3e2b6b38febb778435e3967a137fcf42bc8a51b7c58977c4367f3f6921b629fede7d47ece6bfc75fbccae1e16d1a8777b07f1645bc861246ef8aed7ec368bbdf307ad794307a8dc3c3db39c2e85df0306a4309a3f7c40ebf61b4c36f18bd674a18b5717878074718bd071e466fa284d1fb62a7df30dae9378cde37258cdee4f0f04e8e307a1f3c8cde4209a30fc42ebf61b4cb6f187d604a18bdc5e1e15d1c61f401e2039042397cfc32c7453e445ec3fa90730deba3e01a96d1b9e2239646fa18710deb43f131e61a16b7b7587e3959bcc271914f1856ad4ceb4a3ee1ec4a3e0d762546e78a4f591ae933c4aee413f1196657c2ed2da0edb9b7392ef2397269f339677ff445b03f323a577cc1d2485f22f6479f8b2f31fba32f39b7e7b8f36d0767be7d15cc37a373c5572c8df43562beed105f63e6dbd7c8f9b69333dfbe09e69bd1b9e21b9646fa1631df768a6f31f3ed5be47cdbc5996fdf05f3cde85cf11d4b237d8f986fbbc4f798f9c6e12d7fb754b835f18abc15629b84edfaf3e27f10ff31e1de901f21ef58f90992d56e48567b2059fd8cc8caa38460d25230698562d20ac3a4158e492b0293562426ad284c5a9d30694563d2ea8c492b069356174c5a5d31691d8549eb684c5add306975c7a4d50393564f4c5abd3069f5c6a4d50793565f4c5afd3069f5c7a4350093d6404c5a8330690dc6a4350493d6504c5ac330690dc7a4350293d6484c5aa330698dc6a435c6f4876ec56b62abdc1e7a5dc21b127648d829619784b725fc28e12709bb25ec91f03301ad85eba8e818aa63988ee13a46e818a963948e9d748cd6b1b38e313a76d1b1ab8e47e978b48edd74ecae630f1d7bead84bc7de3af6d1b1af8efd74ecafe3001d07ea3848c7c13a0ed171a88ec3741caee3081d47ea384ac7d13a8e915b671e65ac4739e697f6db5e969ef941ffafb1deff1ae7518e3523348ec38cd8f1ccb43876804b4ee1d13601505b69258fb68998e1340993562c262d0b26ad384c5af1885d953887475c02625f252ee211978819504998b4923169a560d24ac5a4351993d6144c5a5331694dc3a4351d93d60c4c5a6998b4d231696560d29ac9f063d426d09ac5ed2d8de19cb2c2226d36a2b45016699988d2c258a465214a0b67913607515a048bb4b988d22259a465234a9bc9222d07515a098bb45c4469a52cd2e6214aa3ed0116717998e2c6b388cbc7143781455c01a6b8892ce20a31c54d62115784292e96455c31a23871398bb6f9980d676111b700535c1c8bb8124c71f12ce28ec71497c022ae14535c228bb88598e29258c49d80292e9945dc8998e25258c49d84292e9545dcc998e226b3883b0553dc141671a7628a1bc722ee344c715359c495618a9bc622ae1c53dc7416711598e266b088abc41497c6224e859c885fc5a2ad0a52dbd52cdaaa3183329d45dc224c71192ce2ac98e278f6ae4ec714378b45dc624471512cd26a10a5756291568b282d9a459a0d515a6716697588d26258a4d5234aebc2226d09a2b4ae2cd2ec88d28e6291d68028ed6816690e4469dd58a435062ecdd51642c5d16c8f92e951b23cca1c8f32d7a3647b941c8f92eb51e679943c8f92ef510a68a79df6a369d7963637690b9036ca683b89365d686b8216f069999b168369c994161669f98d16a9682987163c68598026cf34c5a499184d58a8aca7e2974a442aa4a8e0a081990630eae8a943a48e83128c02911a8c84fd17", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, { "name": "withdraw", "functionType": "secret", diff --git a/yarn-project/noir-contracts/src/examples/schnorr_account_contract.json b/yarn-project/noir-contracts/src/examples/schnorr_account_contract.json index cfda242e41c6..c2d8b0a00123 100644 --- a/yarn-project/noir-contracts/src/examples/schnorr_account_contract.json +++ b/yarn-project/noir-contracts/src/examples/schnorr_account_contract.json @@ -91,7 +91,7 @@ } ], "returnTypes": [], - "bytecode": "ed5d07985545d29d7b671ea218c882e49c61060618728e92a35909038e1287206062908c220ca08288888080800441407210c4dba8a80808282a39e70c7fdd66f7df75568b7446cff7bef1fbaa5c3d4bd9756e75bd7edde7f51d6d929dde11b82f6e4ed50eadda3c5fb573af9a3d3ab5a9d6aa4387b8294daa34a85563647c98a380010d4ca68119922b60460d7c4803336960660dcca2815935309b0666d7c01c1a9853037369606e0dcca3817935309f06e6d7c0021a5850030b6960610d2ca2814535b09806866b60840616d7c0121a18a9812535b0940696d6c0280d2ca3816535b09c0696d7c00a1a5851032b6960650daca2815535b09a0656d7c01a1a5853036b69606d0daca3817535f0610daca781f535b0810636d4c0461ad858039b6860530d6ca681cd35b08506b6fc33705aa3e8b6d1b1dda23b8dda11923d3e9577353eb5581ab1b462e9c4d28b3d2896412ca3d8436299c4328b6511cb2a964d2cbb580eb19c62b9c4728be511cb2b964f2cbf5801b1826285c40a8b15112b2a564c2cdcbb5a38fe89276f38c608f9ff16172b2116295652ac945869b128b1326265c5ca899517ab205651ac925865b12a6255c5aa895517ab215653ac96586db13a6275c51e16ab27565fac815843b146fe189f7a3a6e4695d898eecf768cee1ed366d48891f1db2a97082f1519195dba787444898856e1c5cbb48e2a191e59b275a9a888a888925125db168f2a51223a2a32aa7499d6654a879789882c111dd1ae649912edc2affff5ccb6cae177f8177e50ad1807d59a71506d1807d5967150d18c836ac738a8f68c837a967150318c837a8e7150cf330eaa03e3a03a320eaa13e3a03a330eaa0be3a0ba320e2a967150dd1807d51d30a81b7db9692c5f329a8835156b26d65cac85584bb147c41e157b4cec71b167c45a89b5166b23d6562c5aac9d587bb167c562c49e137b5eac835847b14e629dc5ba8875158b15eb26d6ddff72d3a3279eb817189f662fc641f5661c541fc641bdc838a8971807f532e3a05e611cd4ab8c83f2fa528e2a8e7254fd2847f55aa22f1c52c63f211fe04f89f5107b41ac97586fb13e622f8abd24f6b2d82b62af8a797d7d17e7bb7ebe7bcdfff0f7fa7b03940d646fa0b6bdec0d52d1c12a3a444587aae830157d5d45df50d1e12afaa68a8e50d1912a1aafa2a35474b48a8e51d1b754f46d157d4745c7aae838157d5745c7abe87b2a3a4145df57d1892afa818a4e52d10f5574b28a4e49fec7fe35ea7aff2a7107fd2bc29b2c418ab7bba32618e14d017452130aff881ef59f6145dc766e93fe1da4ed1d10f42184a0be8948903facf0dbca6de27f0709bf4d823e80101497c804f9c38abae5dc26240852a6dd6d10f43e84a07e7f034132acc876b794dbf83f0b52fa16097a0f42d06b7f0f417658256f3ab7717f1524f216087a174250ffbf91207f58e13795db3b5a90f09b24682c84a0017f3341feb0dadc30b7b76e14a4f44d10f43684a081ff0041feb08aabb98dbe9920a56f40d018084183fe2182fc6195fecbdce26f36486985a051108206ff8304f9c38afad3dc46dc4a90a8bf20682484a021ff3041feb0c2ff27b7e1b718a454bb3f21e84d0841430908f28715fe87dc5ebf9d20c51310f40684a0612404f9c32afeffb90dbddd2091ff45d0300841af13115422ba5dbb7636b7c17714e45f040d8110f446621074870123e4b941a26026d9704e8a8642a260a6d99b9c140d8644c14cb4119c140d84441904a168242745fd21510640288ae7a4a81f24ca6b108a467152d41712250e42d168b65591ac8b22bc4110865e85303486b3884643a260f63fdee2a4281e1205b303f2362745232051307b20ef7052341c1205b30b329693a277205130bbf9e338297a0b1205b39fff2e23458f20b45d98af30e3394b681c240ae6501141d1f4ea31b1d16dbac7f48c8e9bdeac73bde826addac6f41a755de577c7d574e7e3db1192dd1be80df2067b43bca1de30ef75ef0d6fb8f7a637c21be9c57ba3bcd1de18ef2def6def1d6fac37ce7bd71befbde74df0def7267a1f7893bc0fbdc9de14e38468f2a0a9aa78e823159da6a2d35574868a7eaca2335574968ace56d14f54748e8ace55d1792a3a5f453f55d1052aba50453f53d1452aba584597a8e8e72aba544597a9e872155da1a22b5574958aae56d1352aba5645d72586806f2d42c0b70ed2c63fa714f0ad4608f8d640085a4a29e05b8910f0ad8210b48c52c0b71c21e05b01216839a5806f2942c0b70c42d00a4a01df128480ef7308412b29057c8b1002bec5108256510af81622047c9f41085a4d29e0fb1421e05b0021680da5806f1e42c0371f42d05a4a01df1c84806f2e84a0759402bed90801df271082bea014f0cd4408f86641085a4f29e09b8110f07d0c216803a5806f1a42c0371d42d0979cfbd61b2051be8450b49193a22f2051d64328fa8a93a2b59028986d338f93a2d59028988d33c349d14a4814ccd6d9264e8a9643a26036cfbee6a46829240a66fbec1b4a01df47108630fb67df7216d1379028df4228dacc49d1264894af21147dc7499107896220147dcf49d1464894af2014fdc049d1f790283f4028dac249d1664894ef2014fdc848d1a30801df5408cb5b394b680b24ca8f9012da4a2ee07b1423e09bea7de44df3a67b33bc8fbd99de2c6fb6f78937c79bebcdf3e67b9f7a0bbc85de67de226fb1b7c4fbdc5bea2df3967b2bbc95de2a6fb5b7c65bebadbb8180ef0b553cb45e4537a8e8972aba5145bf52514f458d8a6e52d1af55f41b15fd564537abe8772afabd8afea0a25b54f44715ddaaa2db5474bb8afea4a23b5474a78aee52d19f55f41715ddada2bfaae86f2afabb8aee490c01dfef0801df1e481b3f4729e0fb1521e0fb0d42d0794a01df2f0801df6e08411728057cbb1002be9f21045da414f0ed4008f8764208ba4429e0db8e10f0fd0421e832a5806f2b42c0b70d42d0154a01df1684800ff36ded2aa580ef7b84800fb369748d52c0b71921e0836c198585500af8be4108f8204720610ea5806f1342c0073900097329057c1e42c00739fe080ba514f06d4408f820871f61619402be0d08011f449d1616a0dcb70e0b83440940284ac649910b89120aa1e82e4e8a4220511c0845c9390f88ae42a25c835074372745972151ae4028ba8793a28b9028972014a5e0a4e83c24ca050845f7520af8d643183a0761e83ece0fb47b2151ee8350743f2745f740a2a48050f4002745c92151ee8650949293a26490287741284ac549514a489454108a527352743f24ca03108ad23052f41842c007f9255b585ace124a0d899206524269c9057c8f61047c5f78ebbd0dde97de46ef2bcff38cb7c9fbdafbc6fbd6dbec7de77deffde06df17ef4b67adbbcedde4fde0e6fa7b7cbfbd9fbc5dbedfdeafde6fdeeedb981806faf2a1edaa7a2fb55f4808a1e54d1432a7a58458fa8e851153da6a2c755f4848a9e54d1532a7a5a45cfa8e859153da7a2e755f4828a5e54d14b2a7a5945afa8e85515bda6a1325374d8d16157874375384c87038920e393ff2840c7276383b4f3128c423e79aa00259f3c7c0845918c523e9936002d9fcc2e08452529c57c5711623eccae76294a31df6584980fb3a75d9a52cc771121e6c3ec6847518af9ce23c47c98fdec329462beb308311f663bbb2ca598ef3442cc77064250394a31df498498ef1484a0f29462bee30831df0908411528c57c471162be6310822a528af90e23c47c47200455a214f31d4488f90e4108aa4c29e6db8f10f31d80105485730fbb32244a150845553929aa088952094251354e8aca43a2548050549d93a2b29028e52014d5e0a4280a12a50c84a29a9c14958244290da1a8162745919028252114d5a614f3ed83305402c2501dce22aa0d89520742515d4e8a6a42a2d48250f4302745d521516a4028aac749515548946a108aea7352540f12a53e84a2069c14d585447918425143468a10524e6f2f84e5469c25d40012a521a4841a918bf95261c47c7bbd7dde7eef8077d03be41df68e7847bd63de71ef8477d23be59df6ce7867bd73de79ef8277d1bbe45df6ae7857bd6bc609318e631cd738a1c609334e4097f41927992e25ba4b8793ebf0dd3a7c8f0ea7d0e17b75f83e1dbe5f871fd0e1943a9c4a8753eb701a1d4eabc3e97438bd0e3fa8c3197438a30e3fa4c3997438b30e67d1e1ac3a9c4d87b3eb700e1dcea9c3b97438b70ee74914b15f6e88d82f0fa4dd77e614fbe58488fd724128eac229f6cb0e11fbe58050d49551ec277d09a0f693f605a1289651ee278d1fa0f793cf070845dd18057ff2c90a50fcc9073084a2ee8c923f59ba00347fb2c28150d48351f4276b4380ea4f9690108a7a32cafe64f10dd0fdc91a1d42d10b8cc23ff9760350fec997200845bd18a57ff2f511a0fd936f99108a7a338affe4fb3940fd275fe32114f56194ffc9060840ff27fb24108a5e641400ca0e134001281b51108a5e629400ca161e4003283b7d108a5ee6dcfb7e0912e5650845af7052d40712e5450845af7252d40b12a53784a2be9c14f58444790142511c2745dd21517a4028eac749512c244a370845af7152d40512a52b84a2fe8c224039f98450d41942d100ce2aea0f89320042d1404e8afa41a2bc06a1681027457d2151e220140de6a4e81548945721140de1a4683024ca1008454339291a0889320842d130468a5223527330f76fbece594343215186416ae8757219606a880c500a4a16a3b24f279b6cb2a129bb91b2f32bdbb6b2452efbdb729620070172e8222726723a25474b728c27677072de29879572302ca7ba72822ec7dfc6c96a9c6cc69180398c93d338b98c93db38796e2410ccabcb8ff2e9707e1d2ea0c30575b8900e17d6e1223a5c54878be970b80e47e870711d2ea1c3913a5c52874be970691d8ed2e1323a5c5687cbe970791daea0c31575b8920e57d6e12a3a5c5587abe970751dae912802c1ea108120e6b73b1f730a04ab42048298dfeecce414085686080431d72bcce214085684080431d72bcce614089687080431d72b7cc229102c0b110862ae5798c329108c82080431d72bcce514089682080431d72bcce314084642048298eb15e6730a048b43048298fb153ee514088643048211108a16700a048b420482c520142de41408168608048b4028fa8c5320581022102c04a16811a740303f4420580042d162ce5df14590288b21142de1a4682124ca67108a3ee7a4e853489405108a967252340f12653e84a2659c14cd8144990ba168392745b321513e8150b48293a2999028b32014ade41408e68350f43184a2559c55b41212651584a2d59c142d87445901a1680d27454b21519641285acb49d1124894cf2114ade3a4682d24ca3a08455f7052b41a12650d84a2f58c14417e94eee485d0bc81b386306f345e0fa9a10de402c1342081605e598cca3e9d6cb2c986a6ec46caceaf6cdbca16b9ec6fcb59821c04c8a18b9c98c8e9941c2dc9319e9cc1c979a71c56cac1b09ceaca09ba1c7f1ba7a2712a19a7b271aa18a7aa71aa19a7ba716adc48205853971fd5d2e1da3a5c4787ebeaf0c33a5c4f87ebeb70031d6ea8c38d74b8b10e37d1e1a63adc4c879beb700b1d6ea9c38fe8f0a33afc980e3faec34fe8f0933afc940e3fadc3cfe8702b1d6eadc36d74b8ad0e47278a40b02d4420180df920d8c729106c0d1108b68150b49f5320f80c4420d80a42d1014e81e0531081e0d3108a0e720a049f8008049f845074885320f8184420f83884a2c39c02c1472002c14721141de11408b68008045b42283aca29106c061108368750748c5320d80422106c0aa1e838a740b0114420d81842d1094e816003884010f3c68a939c02c17a108120e6d539a738058275210241ccab734e730a046b4304829897c19de1dc153f0d89720642d1594e8a4e42a29c8250748e93a2e390282720149de7a4e82824ca3108451738293a0c89720442d1454e8a0e42a21c8250748993a2fd90280720145de61408d68250b40f42d115ce2aba0c89720542d1554e8a2e42a25c8250748d93a2f39028171014054238293a0b89720e4291434951200412c58150e47256d15548946b108a4219294a0b1108425e1d1f08e39c662e244a28a486c2c80582694102c19ab218957d3ad964930d4dd98d949d5fd9b6952d72d9df96b3043908904317393191d329395a92633c398393f34e39ac94836139d595137439fe36ce53c679da38cf18a795715a1ba78d71da1a27fa4602c176bafca8bd0e3fabc3313afc9c0e3fafc31d74b8a30e77d2e1ce3adc4587bbea70ac0e77d3e1ee3adc43877beaf00b3adc4b877beb701f1d7e51875fd2e19775f8151d7e5587fbea709c0ef7d3e1d774b8bf0e0f481481607f884010727b7c2017a740b01f442008b93d3e909b5320d817221084dc1e1fc8c329107c05221084dc1e1fc8cb29107c09221084bce12b908f5320d807221084bce12b909f5320d80b221084bce12b50805320d813221084bce12b50905320d81d221084bce12b50885320180b110842def01528cc2910ec02110842def01528c22910ec04110842def01528ca2910ec001108768450548c5320f81c4420f83c84a2704e81e0b31081600c84a208ce5df1704814c885af81e29c14158544815cf81a28c14951614814c885af81484e8a0a42a2402e7c0d94e4a4283f240ae4c2d740294e8a2057b804f241282acd49516e48943c108aa2380582ed2114e582505486b38aa22051202fe50894e5a4a814240ae4a51c81729c144542a2405eca1128cf4951714814c84b39021538292a0f890279cd54a022274565215120af990a5462a4281d4420d80e427365ce1aaa08890279e11d84a2c41408a6030904dbc96254f6e964934d3634653752767e65db56b6c8657f5bce12e420400e5de4c4444ea7e468498ef1e40c4ece3be5b0520e86e554574ed0e5f8db38af18e755e3f4354e9c71fa19e735e3f437ce801b090407eaf2a3413a3c588787e8f0501d1ea6c3afebf01b3a3c5c87dfd4e1113a3c5287e37578940e8fd6e1313afc960ebfadc3efe8f0581d1ea7c3efeaf0781d7e4f8727e8f0fb3a3c51873fd0e1493afca10e4fd6e1298922109c0c11084e817c103ccd29109c0411087e08a1e8194e81e0448840f0030845ad380582132002c1f72114b5e614088e870804df8350d4865320380e22107c1742515b4e81e03b1081e0580845d19c02c1b72002c1b72114b5e314088e860804c740286acf29108c8708044741287a965320380222101c09a128865320381c22107c1342d1739c02c1d72102c13720143dcf29101c0a11080e8350d4815320381822101c02a1a823e7ae780748148c12b7132745cf41a26094b89d39297a161205a3c4edc24911e66cad3d84a2ae9c14b5854481bcda2510cb49516b4814c8ab5d02dd38297a061205f26a9740774e81e02008459057bb047a705651774814ccaf257b7252140b8982f9b5e40b9c14758144c1fc5ab21727459d205130bf96eccd49512f4814cceffffb7052d4131205f3fbff1719294a0f11080e84d0fc12670df58144c1dc44f212b940303d4820385016a3b24f279b6cb2a129bb91b2f32bdbb6b2452efbdb729620070172e8222726723a25474b728c27677072de29879572302ca7ba72822ec7dfc699609cf78d33d1381f186792713e34ce64e34cb9914070aa2e3ffa4887a7e9f0741d9ea1c31febf04c1d9ea5c3b375f8131d9ea3c37375789e0ecfd7e14f7578810e2fd4e1cf7478910e2fd6e1253afcb90e2fd5e1653abc5c8757e8f04a1d5ea5c3ab75788d0eafd5e1758922105c0b1108ae837c10bccb29105c0d1108ae8150349e5320b81222105c05a1e83d4e81e0728840700584a2099c02c1a51081e0320845ef730a04974004829f43289ac829105c0411082e8650f401a74070214420f81984a2499c02c14f2102c105108a3ee41408ce830804e743289acc29109c031108ce855034855320381b2210fc0442d1544e81e04c8840701684a28f380582332002c18f21144de314084e830804a743289aceb92b3e0d120543d10c4e8aa642a27c04a1e8634e8a2643a2607e733b9393a249902898dfdccee2a46822240ae637b7b339299a008982f9cded279c148d8744c1fce6760ea740f023084598dfdccee5aca239902898afb1f338299a0d8982f91a3b9f93a299902898afb19f725234031205f335760127459f42a2603666177252340f1205b331fb1923450f42048298afc28b386b6821240ae6886811b940f041904070aa2c46659f4e36d9644353762365e757b66d658b5cf6b7e52c410e02e4d0454e4ce4744a8e96e4184fcee0e4bc530e2be560584e75e5045d8ebf8db3dc382b8cb3d238ab8cb3da386b8cb3d638ebfe5c2038b569ed2ac54b968adf11f24bbc7102c9c585f92ed477aeef1cdf85248ff7ae895d15bb227659ec92d845b10b62e7c5ce899d153b23765aec94d849b11362c7c58e891d153b227658ec90d841b10362fbc5f689edf5ff63797c97db77b97c97d377397c97dd77d97c97d577597c97d977997cf790ef32fa2e83ef1ef45d7adfa5f35d5adfa5f15d6adfa5f25d4adf3de0bbfb7d779fefeef55d0adfdde3bbbb7d97dc7777f92e99ef6af8aebaefaaf9aeaaefaaf8aeb2ef2af9aea2ef2af8aebcefcaf9aeacefcaf82eca77a57d57ca77257d17e9bb12be2beebb08df85fbae98ef8afaae88ef0afbae90ef0afaae80eff2fb2e9feff2fa2eda776d7dd7c677ad7dd7ca77cff8ee69df3de5bb277df784ef1ef7dd63be7bd4778ff8aea5ef5af8aeb9ef9af9aea9ef9af8aeb1ef1af9aea1ef1af8aebeefeaf9ee61dfd5f55d1ddfd5f65d2ddfd54c6edf856bdf976bdfa96bdfbb6bdfcd6bdfdf6bdff16bdf036cdf156cdf276cdf396cdf4b6cdf5d6cdf6f6cdf816cdf936cdfa56cdfb76cdfc96cdfdb6cdfed6cdfff6cdf116ddf236ddf356ddf476ddf596ddf6b6ddf7d6ddf8f6ddfa16ddfb36dafe2b3d7f5d92bfdecb57ff66a407b7da0bd62d05e4368af2ab4d719da2b0fedb588f6ea447bbda2bd82d15ed368af72b4d73dda2b21edb591f66a497bfda4bda2d25e6369afbab4d761da2b33edb59af6ea4d7b3da7bdc2d35ef3699580562d681585567568958956bd68158e5605699592564d691597569569959b56dd6915a056256a95a4566d6a15a956b56a95ad56fd6a15b256456b95b6568d6b15bb56d56b95bf561d6c15c456656c3bd917c6596f9c0dc6f9d2381b8df395713ce318e36c32ced7c6f9c638df1a67b371be33cef7c6f9c1385b8cf3a371b61a679b71b61be727e3ec30ce4ee3ec32cecfc6f9c538bb8df3ab717e33ceefc6d983ffbc83dcdceeec857cdafd48b62088f05dc93b2559a29482d0b395889e887fff8f127742cfbfa24442e8d946424fc41ffee176e9f9af28c521f46c27a02722e1bf28763bf4248c02a1e7a77f989e883ffb97456e959e3f89521442cf8e7f909e88bf020add0a3d7f11a530849e9dff103d111a58e066e951a21484d0b3eb1fa027e24611f3dd0c3d3788921f42cfcf7f333d11371331cf8de8b989287921f4fcf237d21371b3117369f4dc6494dc107a76ff4df444dc4ac41c7f45cf2d44c909a1e7d7bf819e885b8d98edcfe8b9c528d921f4fc96c8f444dc4ec42c09e9b98d285921f4fc9e88f444dc6ec44cff4dcf6d46c90ca1670fe716feef90287b2014ede5a4e8574894df2014ede3a4e8174894dd108af67352b40b12e5670845073829da0189b21342d1414e8ab643a2fc04a1e81027455b2151b641283a9c681445dc7ec4872004fd0821e808670d1d86443902a1e82827450721510e41283ac649d17e489403108a8e7352b41712651f84a2139c141d87443901a1e82427454721518e41283a95281445dc59c40cd709baa3281921249fe6aca0939028a720154449514b88f805d2a893a56114bf3407885f5a40e849cb287e690a10bf3483d0938e51fcd218207e6902a1273da3f8a52140fcd20842cf838ce297fa00f14b03083d1918c52f0f03c42ff520f4646414bfd401885fea42e8798851fc520b207ea90da12713a3f8a50640fc5213424f6646f14b3580f8a53a849e2c8ce2972a00f14b55083d5919c52f9500e297ca107ab2318a5f2a00c42f1521f4646714bf9403885fca43e8c941b9eb932c3b244a0e0845393929ca0a89920d42512e4e8a3243a2648150949b9322c89173b24c108af27052940112252384a2bc9c14a5874481dceb902c1f2745692151d24128cacf287e290b21280d84a0029c35941f12a50084a2829c14e58544c907a1a8102745b92151f240282acc49514e48945c108a8a7052541812a50884a2a29c141584442904a1a818a3f8250a207e290321399cb3828a42a21483541082a2ffbdc06a56d336cf76ea1c1bdb223a36a65def31f1c6d9eb5d15bfcfbbba23a472bc373979bcf7a1d824b10fc4268abd2f3641ec3db1f162ef8a8d131b2bf68ed8db626f898d111b2d364a2c5e6ca4d808b137c5868bbd21f6bad830b1a16243c4068b0d121b28b6566c8dd86ab155622bc556882d175b26b654ec73b125628bc516897d26b6506c81d8a762f3c5e689cd159b23f689d86cb1596233c53e169b21365d6c9ad8476253c57e17fbcdbf8d47b8f8c2bf9a67bdef36f8ee4bdf6df4dd57bef37c677cb7c9775ffbee1bdf7debbbcdbefbce77dffbee07df6df1dd8fbedbeabb6dbedbeebb9f7cb7c3773b7db7cb773ffbee17dfedf6ddafbefbcd77bffb6e4f72e3ecff63e5c7236ad6d90f51351db8f320711f558d8de9d021a6fd989171539bc6746adf211a73ed9c1ddd9dce283ba68e5d3a441be7e088d171d3ebf6e8d8a54ebb069dbbc78784c64da9d6b953b7eef1cec83b1f6cdcacaa319d5ac5f6ae1913dda16dc32ea3433eac1ed3d30999dcb47be72ea3468c00fc07febb86468e82d02b9c601ed4214019254a7e8746a03fb778084bac79970e3aeb0e27cdba3f902b8c604ae808e19c93ec8e2066dcff97f628bad2c60e280ddb80522126ff942ab1b1ad7aef0829659ca3c639669ce3c639619c93c639659cd3c639639cb3c639679cf3c6b9609c8bc6b9649ccbc6b9629cabc6b966dc10e33ac6758d1b6adc30e3068c9bccb8771937b971ef36ee3dc64d61dc7b8d7b9f71ef37ee03c64d69dc54c64d6ddc34c64d6bdc74c64d6fdc078d9bc1b8198dfb9071331937b371b31837ab71b31937bb71731837a771738d1817f761fdce3de343ddeb7f779deb7f7742fedda74246029ed1c7353bc746c7b4efe42fe947cd6f23be516c4ccf56dda3fd757ef798ce9d46c64daf1dddaa8b252e3eacd4a8b8594da2dbc774eb1e1d5ba753dbe85e4e827f7613fc73e8f55107c2fe35fa40dc64bfe78e4c7efd9f439c7fb5c4919055e3114063fdaf0b8ba735eed1b97b4c74a7ee63501faf809f8c213e3e8a1b378f7173afd4de7beee67654388f7705f75690ff3c42c84fb35cc04ea9cf11f6fe6b7c399da029a77cc6cdab97535ebd9cf2254e399d8094535e4839e5632fa73334e554c0b8f9f572caaf975381c429a7339072ca0f29a702ece57496a69c0a19b7a05e4e05f5722a9438e57416524e0521e55488bd9cced1945311e316d6cba9b05e4e4512a79cce41caa930a49c8a9097939b8ba69c8a19b7a85e4e45f5722a9628e5e4e682f05c14524ec5188ff9209a2ee728e461852377b7d0072688d1fd67ebd68d48daba4d40af70827950c5190f4cfcfc8ac30f4ce2315b4e90d95b82b2aca4ef96806ccc256b48a9d2003dbc4888d6a321f389b71b096de025931a78027a8513cc832a45d9c025bf529c27de70c220ad0922867720b76fb9a5a95796a5a18d292aa93125a05738c13ca832948d49f22b13d42bcbb29465554606865959360ee6956539c8cab231f5cab21cb481974f6ae009e8154e300faa02650397fc2a90ae2c2b30ae2c53413e9bce43da5b45ea9565456863aa94d49812d02b9c601e5465cac624f9550eea956515cab2aa2c03c3ac2c9b06f3cab22a6465d9947a655915dac0ab2535f004f40a279807559db2814b7ed5495796d5a9e75d51e8bcab9134ef12d02b9c601e544dca7927f9d50cea85532dcab2aa2903c32c9c9a07f3c2a93664e1d49cba81d78636f03a490d3c01bdc209e641d5a56ce0925f5dd285535dea79971f3aef1e4e9a7709e8154e300faa1ee5bc93fcea05f5c2a93e6559d5938161164e2d8379e1d400b2706a49ddc01b401b78c3a4069e805ee104f3a01a513670c9af11e9c2a911f5bc2b089d778d93e65d027a8513cc836a4239ef24bf2641bd706a4a59564d64609885d3a3c1bc706a0659383d4addc09b411b78f3a4069e805ee104f3a05a503670c9af05e9c2a905f5bc2b0c9d772d93e65d027a8513cc837a8472de497e8f04f5c2e951cab27a44068659383d1ecc0ba7c7200ba7c7a91bf863d006fe7852034f40af708279504f503670c9ef09d2851382b0ffbd34655aa3e8b6d1b1dda23b8d1a156f9c63fe8df56e6eebf37a5743e46f4f1af729f5cfed0889903f79d2de757fcafad3f6cfe7b7bea0f585edbf3f6ffd05eb2f5a7fc9facbd65fb1feaaf5d7ec9f0ab1deb1deb53ed4fa30eb03d627b3fe2eeb935b7fb7f5f7589fc2fa7badbfcffafbad7fc0fa94d6a7b23eb5f569ac4f6b7d3aebd35bffa0f519accf68fd43d667b23eb3f559accf6a7d36ebb35b9fc3fa9cd7d97cdab8cfdcf0291cb57fe249eb9fbefee75a19b735efaaa00db8575125d73698938b0ee6e4da057372ed8339b9678339b998604eeeb9604eeef9604eae433027d7319893eb14ccc9750ee6e4ba0473725d8339b9d8604eae5b3027d71d905c62ed5fa687ee5ef648dabdfc03b9c208662bae27e1dea564d793f98d4e80d2c60e282ddb8052e3dee8f4ae715f306e2fe3f6366e1fe3be68dc978cfbb2715f31eeabc6ed6bdcb87fe2754a8ba33b75ed11dd23ba518fd61d62dafcfb854a3ef4c7972aa5a07ea9923ffbeff45127ee4deebd696e727fcdb8fdf49bdcfbe937b9bf963837b9f786f0dc0f7293fb6bec2f06e843534e038cdb5f2fa7fe7a390d489c72ea03e1b93fa49c06b097d32b34e534c8b803f5721aa897d3a0c429a757203c0f8494d320f6727a95a69c861877b05e4e83f5721a9238e5f42a84e7c190721ac25e4e7d69ca69987187eae534542fa76189534e7d213c0f8594d33046b95e7a08cd2f40a2bc4e7da3e4ebd0edae3792b6bb12d02b9c601ed4704ab19ee4379c536dedf684447993b2ac86cbc0306aeb2729d5d6a0873702a2b67e925a6d3d02dac0472635f004f40a279807154fd9c025bf7852b5753ce35de569218da91724ca28ea95e52868631a9dd49812d02b9c601ed418cac624f98d09ea95e55b94653546068659593e1dcc2bcbb7212bcba7a957966f431bf83b490d3c01bdc209e6418da56ce092df58d295e558c695656a48638a83441947bdb21c076d4cef2635a604f40a279807359eb231497ee3837a65f91e65598d9781615696ad8279653901b2b26c45bdb29c006de0ef2735f004f40a2798073591b2814b7e1349579613a9e7dd40e8bcfb2069de25a05738c13ca84994f34ef29b14d40ba70f29cb6a920c0cb3706a13cc0ba7c99085531bea063e19dac0a72435f004f40a2798073595b2814b7e5349174e53a9e7dd60e8bcfb2869de25a05738c13ca86994f34ef29b16d40ba7e99465354d068659384507f3c2690664e1144dddc067401bf8c7490d3c01bdc209e641cda46ce092df4cd285d34cea7937143aef6625cdbb04f40a279807359b72de497eb3837ae1f4096559cd968161164eed8379e13407b2706a4fddc0e7401bf8dca4069e805ee104f3a0e6513670c96f1ee9c2695ee25fe6eef6b21788f7b3befff56bc4e71bf7d3ff4de7ce9bd182c460f9ce87b59073589f710e6b11e7b016730e6b09e7b03ee71cd652ce612de31cd672ce61ade01cd64ace61ade21cd66ace61ade11cd65ace61ade31cd6179cc35acf39ac0d9cc3fa9273581b3987f515e7b03cce6119ce616de21cd6d79cc3fa867358df720e6b33e7b0bee31cd6f79cc3fa8173585b3887f523e7b0b6720e6b1be7b0b6730eeb27ce61ede01cd64ece61ede21cd6cf9cc3fa05302cfd05be25e468e8457b4ef492f52f5b3fd0fac1d60fb53ecefa05d62fb4fe33eb1759bfd8fa25d67f6efd52eb9759bfdcfa15d6afb47e95f5abad5f63fd5aebd759ff85f5ebaddf60fd97d66fb4fe2beb3deb8df59bacffdafa6facffd6facdd67f67fdf7d6ff60fd16eb7fb47eabf5dbacdf6efd4fd6efb07ea7f5bbacffd9fa5fae9fa6ed36eeaf373c857bc1fe89f9d6efbefee77e33eeefbcaa903d8467d5f719e708461312039ee398ecdcb698ec9e4b0cc5cb9d97d45e88562506128594a27dc14c11537bdb4fd8debcfeb0fed691b0bf497a6e574c7a9d3867ef01c8bceb0889424ad1c160a688a9c11d226c70f7c2fa5b57c2fe76af719fc76417cb39770f43665d574814528a8e0433454ceded28617b7361edad07617b738ddb0d935d4fceb97b0c32eb7a40a29052743c9829626a6f2708dbdbfdb0f6d69bb0bddd6fdc684c767d38e7ee49c8ac83bc329795a253c14c11537b3b4dd8dec260eded65c2f61666dc7698ec5ee19cbb6720b3ee654814528ace0633454ceded1c617b7360ed2d8eb0bd39c6ed82c9ae1fe7dc3d0f9975719028a4145d08668a98dadb45c2f6760facbd0d206c6ff718b70326bb819c73f71264d60d804421a5e8723053c4d4deae10b6b714b0f63684b0bda5306e774c764339e7ee55c8ac1b0289424ad1b560a688a8bd858680db1b55720e61efbe0bd6bbdf20ecdd7719b73326bbe1948d29d485b49437205148290a0d668a98da5b18617b4b0e6b6f2309db5b72e3c662b28be79cbb01c8ac835c87c84a51b260a688a9bddd45d8de02b0f63686b0bd058cdb1193dd5b9c73373964d68d814421a5e8ee60a688a9bddd4379fd732be37682b480d014840d0e99dfbdc15c9cf711166732d867ef58c2d24c66dcf698ecc6717eb0dc0ff948180b89424ad103c14c11537b4b49d8deee86b5b7f708dbdbddc66d83c96e02e7dc4d059975ef41a29052943a9829626a6f6908dbdb03b0f6f601617b7bc0b8cf61b29bc43977d34266dd079028a414a50b668a98da5b7ac2f6160a6b6f5308db5ba8719fc564379573ee3e0899755320514829ca10cc1431b5b78c84ed2d25acbd4d276c6f298d1b83c96e06e7dc7d0832eba643a2905294298829c21c9df434ee05cc2c994599df39e39ec7e4379bb3c433438a731624ca6cd6123f8e2981b994f91d35ee314c7ef3384b3c0ba438e742a2cc232df1d00c981258c0985f687af93287c96f216789678514e702489485ac5dfc2ca6041653e677dab86730f92de12cf16c90e25c0c89b284b58bdf8d298165945dfc2e139a1c93df72ce12cf0e29ce659028cb594bfc014c09aca22cf1fb4ce8fd98fc567396780e4871ae824459cdba50398829817594f9ed37ee014c7e5f7096784e4871ae8344e17ccf76682ece61e5e61c561ece61e5e51c563ece61e5e71c5601ce6115e41c5621ce6115e61c5611ce6115e51c5631ce6185730e2b827358c559bf35df8b59727f49f9adf91e139a0293df46ceaf1425205f06be8444d9c839f322398755927358a528fbd46f263404935f694edaa3388755867358653987558e7358e539875581735815398755897358953987558573585559bf04846216c986f24b8063425d4c7e9b38bf0454832cdf0d24ca26d6124f8629816f294b3ccc840630f96de62cf1ea90e2fc161265336b89a7c694c00f94259ed284a6c2e4b785b3c46b408af30748942dac0288cb9812d84699df45e35ec2e4b79db3c46b428a731b24ca76d612bf8629819d94f95d31ee554c7ebb384bbc16a4387742a2ec622d71d08f837753e677c8b88731f9fdca59e2b521c5b91b12e557d612df8729813d94f9ed31ee5e4c7e7b394bbc0ea438f740a2ec652df1539812384099df09e39ec4e47790b3c4eb428af30024ca41d61d957498123842b9a392c684a6c5e47794b3c41f8614e7114894a3ac259e09530227284b3ca3097d0893df49ce12af0729ce1390282713e39aad3baf81cc10a2eb73269705925c03cee4b242926bc8995c3648728d3893cb0e49ae3167723920c935e14c2e2724b9a69cc9e58224d78c33b9dc90e49a73269707925c0bcee4f242926bc9995c3e48728f7026971f92dca39cc9158024f71867720521c93dce995c2148724f7026571892dc939cc9158124f71467724521c93dcd995c314872cf7026170e49ae1567721190e45a7326571c925c1bcee44a40926bcb995c2424b968cee44a42926bc7995c294872ed39932b0d49ee59cee4a220c9c57026570692dc739cc9958524f73c6772e520c975e04cae3c24b98e9cc9558024d78933b98a90e43a73265709925c17cee42a4392ebca995c154872b19cc9558524d78d33b96a90e4ba7326571d925c0fcee46a4092ebc9995c4d48722f7026570b925c2fcee46a4392ebcd995c1d48727d3893ab0b49ee45cee41e8624f7126772f520c9bd7ce7c9ed0879dc7143c302c9ee4a7ef73d29eebdeffe0752a64a9d266dbaf40f66c8f850a6cc59b266cb9e2367aedc79f2e6cb5fa060a1c2458a160b8f285e22b264a9d25165ca962b5fa162a5ca55aa56ab5ea366adda75ea3e5caf7e83868d1a3769daac798b968f3cfad8e33b4224d7fa26b481096d68421b99d0c626b489096d6a429b99d0e626b485096d69421f91d37d3903979362394f955347399b93132c39e791d3103933909d75d97f965d5ad9cb941d3fd91793dd23d963919d08f9be2edf6ae5bb9f7c4392ef11b2da9635a9acdc647d23ab00f9ac944f14e9bbd29d640e4ba54b3d086bff07", + "bytecode": "ed5d07985545d29d7b671ea2889205919cf30c0c30e41c2547b312061c250e41c0c42019451840051111010101098280e42088b751511110505472ce19febacdeebfebac16e98c9eef7de3f755b97a96b2ebdcea7afdbacfeb3bda243bbd2390326e4ed50eadda3c5fb573af9a3d3ab5a9d6aa4387b8294daa34a85563647c98a380010d4ca68119932b60260d7c5003336be0431a984503b36a60360dccae81393430a706e6d2c0dc1a984703f36a603e0dccaf810534b0a00616d2c0c21a5844038b6a60310d0cd7c0080d2cae8125343052034b6a60290d2cad81511a584603cb6a60390d2caf811534b0a20656d2c0ca1a584503ab6a60350dacae813534b0a606d6d2c0da1a584703eb6ae0c31a584f03eb6b60030d6ca8818d34b0b10636d1c0a61ad84c039b6b600b0d6cf967e0b446d16da363bb45771ab523247b7c6aef6a7c1ab1b462e9c4d28b65107b402ca35826b107c5328b3d2496452cab5836b1ec6239c4728ae512cb2d96472caf583eb1fc6205c40a8a15122b2c5644aca85831b170ef6ae1f8279ebce11823e4ff5b5cac8458a45849b15262a5c5a2c4ca8895152b27565eac825845b14a6295c5aa885515ab26565dac86584db15a62b5c5ea88d5157b58ac9e587db106620dc51af9637ceae9b819556263ba3fdb31ba7b4c9b512346c66fab5c22bc54646474e9e2d11125225a85172fd33aaa647864c9d6a5a222a2224a46956c5b3caa4489e8a8c8a8d2655a97291d5e2622b2447444bb92654ab40bbffed733db2a87dfe15ff841b5621c546bc641b5611c545bc64145330eaa1de3a0da330eea59c641c5300eea39c6413dcf38a80e8c83eac838a84e8c83eacc38a82e8c83eaca38a858c64175631c5477c0a06ef4e5a6b17cc96822d654ac995873b116622dc51e117b54ec31b1c7c59e116b25d65aac8d585bb168b17662edc59e158b117b4eec79b10e621dc53a897516eb22d6552c56ac9b5877ffcb4d8f9e78e25e607c9abd1807d59b71507d1807f522e3a05e621cd4cb8c837a857150af320ecaeb4b39aa38ca51f5a31cd56b89be704815ff847c803f25d643ec05b15e62bdc5fa88bd28f692d8cb62af88bd2ae6f5f55d9ceffaf9ee35ffc3dfebef0d503690bd81daf6b237484507abe810151daaa2c354f475157d434587abe89b2a3a424547aa68bc8a8e52d1d12a3a4645df52d1b755f41d151daba2e354f45d151dafa2efa9e804157d5f4527aae8072a3a49453f54d1c92a3a25f91ffbd7a8ebfdabc41df4af086fb20429deee8e9a60843705d0494d28fc237ad47f861571dbb94dfa7790b67740d0871082fa262241feb0c26f2bb789ff1d24fc3609fa0042505c2213e40f2bea96739b9020489976b741d0fb1082fafd0d04c9b022dbdd526ee3ff2c48e95b24e83d0841affd3d04d96195bce9dcc6fd5590c85b20e85d0841fdff4682fc6185df546eef6841c26f92a0b1108206fccd04f9c36a73c3dcdeba5190d23741d0db108206fe0304f9c32aaee636fa668294be01416320040dfa8708f28755fa2f738bbfd920a515824641081afc0f12e40f2bea4f731b712b41a2fe82a091108286fcc304f9c30aff9fdc86df629052edfe84a03721040d2520c81f56f81f727bfd7682144f40d01b1082869110e40fabf8ffe736f4768344fe1741c32004bd4e445089e876eddad9dc06df51907f11340442d01b8941d01d068c90e70689829964c339291a0a898299666f72523418120533d1467052341012651084a2919c14f587441900a1289e93a27e9028af41281ac549515f4894380845a3d95645b22e8af00641187a15c2d018ce221a0d8982d9ff788b93a2784814cc0ec8db9c148d8044c1ec81bcc349d1704814cc2ec8584e8ade8144c1ece68fe3a4e82d4814cc7efebb8c143d82d07661bec28ce72ca17190289843450445d3abc7c446b7e91ed3333a6e7ab3cef5a29bb46a1bd36bd47595df1d57d39d8f6f4748766fa037c81bec0df1867ac3bcd7bd37bce1de9bde086fa417ef8df2467b63bcb7bcb7bd77bcb1de38ef5d6fbcf79e37c17bdf9be87de04df23ef4267b538c13a2c983a6aae2a18f54749a8a4e57d1192afab18ace54d1592a3a5b453f51d1392a3a5745e7a9e87c15fd544517a8e84215fd4c4517a9e862155da2a29fabe852155da6a2cb5574858aae54d1552aba5a45d7a8e85a155d971802beb50801df3a481bff9c52c0b71a21e05b03216829a5806f2542c0b70a42d0324a01df7284806f0584a0e59402bea50801df3208412b28057c4b1002becf2104ada414f02d4208f81643085a4529e05b8810f07d06216835a580ef5384806f0184a0359402be790801df7c08416b29057c731002beb91082d6510af86623047c9f4008fa8252c0371321e09b0521683da5806f0642c0f73184a00d9402be690801df7408415f72ee5b6f8044f91242d1464e8abe8044590fa1e82b4e8ad642a260b6cd3c4e8a5643a26036ce0c27452b2151305b679b38295a0e8982d93cfb9a93a2a5902898edb36f28057c1f4118c2ec9f7dcb5944df40a27c0ba1683327459b2051be8650f41d27451e248a8150f43d27451b2151be8250f4032745df43a2fc00a1680b27459b2151be8350f42323458f22047c53212c6fe52ca12d90283f424a682bb980ef518c806faaf79137cd9beecdf03ef6667ab3bcd9de27de1c6fae37cf9bef7dea2df0167a9f798bbcc5de12ef736fa9b7cc5beeadf0567aabbcd5de1a6fadb7ee0602be2f54f1d07a15dda0a25faae84615fd4a453d15352aba4945bf56d16f54f45b15ddaca2dfa9e8f72afa838a6e51d11f5574ab8a6e53d1ed2afa938aee50d19d2aba4b457f56d15f5474b78afeaaa2bfa9e8ef2aba2731047cbf23047c7b206dfc1ca580ef578480ef370841e729057cbf20047cbb21045da014f0ed4208f87e8610749152c0b70321e0db0921e812a5806f3b42c0f71384a0cb9402bead0801df3608415728057c5b10023eccb7b5ab9402beef11023ecca6d1354a01df6684800fb26514164229e0fb0621e0831c8184399402be4d08011fe40024cca514f07908011fe4f8232c9452c0b71121e0831c7e8485510af83620047c10755a588072df3a2c0c122500a1281927452e244a2884a2bb38290a814471201425e73c20ba0a89720d42d1dd9c145d8644b902a1e81e4e8a2e42a25c8250948293a2f39028172014dd4b29e05b0f61e81c84a1949c1f68f742a2a48450741f2745f740a2a48050743f2745c92151ee8650948a93a26490287741284acd49512a4894d4108ad27052741f24cafd108ad23252f41842c007f9255b583ace124a038992165242e9c8057c8f61047c5f78ebbd0dde97de46ef2bcff38cb7c9fbdafbc6fbd6dbec7de77deffde06df17ef4b67adbbcedde4fde0e6fa7b7cbfbd9fbc5dbedfdeafde6fdeeedb981806faf2a1edaa7a2fb55f4808a1e54d1432a7a58458fa8e851153da6a2c755f4848a9e54d1532a7a5a45cfa8e859153da7a2e755f4828a5e54d14b2a7a5945afa8e85515bda6a1325374d8d16157874375384c87038920e393ff2840c7276383b4f3128c423e79aa00259f3c7c0845918c523e9936002d9fcc2e08452529c57c5711623eccae76294a31df6584980fb3a75d9a52cc771121e6c3ec6847518af9ce23c47c98fdec329462beb308311f663bbb2ca598ef3442cc77064250394a31df498498ef1484a0f29462bee30831df0908411528c57c471162be6310822a528af90e23c47c47200455a214f31d4488f90e4108aa4c29e6db8f10f31d80105485730fbb32244a150845553929aa088952094251354e8aca43a2548050549d93a2b29028e52014d5e0a4280a12a50c84a29a9c14958244290da1a8162745919028252114d5a614f3ed83305402c2501dce22aa0d89520742515d4e8a6a42a2d48250f4302745d521516a4028aac749515548946a108aea7352540f12a53e84a2069c14d585447918425143468a10524e6f2f84e5469c25d40012a521a4841a918bf95263c47c7bbd7dde7eef8077d03be41df68e7847bd63de71ef8477d23be59df6ce7867bd73de79ef8277d1bbe45df6ae7857bd6bc609318e631cd738a1c609334e4097f41927992e25ba4b8793ebf0dd3a7c8f0ea7d0e17b7538a50edfa7c3f7eb702a1d4eadc3697438ad0ea7d3e1f43a9c41871fd0e18c3a9c49871fd4e1cc3afc900e67d1e1ac3a9c4d87b3eb700e1dcea9c3b97438b70ee74914b15f6e88d82f0fa4dd77e614fbe58488fd724128eac229f6cb0e11fbe58050d49551ec277d09a0f693f605a1289651ee278d1fa0f793cf070845dd18057ff2c90a50fcc9073084a2ee8c923f59ba00347fb2c28150d48351f4276b4380ea4f9690108a7a32cafe64f10dd0fdc91a1d42d10b8cc23ff9760350fec997200845bd18a57ff2f511a0fd936f99108a7a338affe4fb3940fd275fe32114f56194ffc9060840ff27fb24108a5e641400ca0e134001281b51108a5e629400ca161e4003283b7d108a5ee6dcfb7e0912e5650845af7052d40712e5450845af7252d40b12a53784a2be9c14f58444790142511c2745dd21517a4028eac749512c244a370845af7152d40512a52b84a2fe8c224039f98450d41942d100ce2aea0f89320042d1404e8afa41a2bc06a1681027457d2151e220140de6a4e81548945721140de1a4683024ca1008454339291a0889320842d130468ad220527330f76fbece594343215186416ae8757219601a880c500a4a16a3b24f279b6cb2a129bb91b2f32bdbb6b2452efbdb729620070172e8222726723a25474b728c27677072de29879572302ca7ba72822ec7dfc6c96a9c6cc69180398c93d338b98c93db38796e2410ccabcb8ff2e9707e1d2ea0c30575b8900e17d6e1223a5c54878be970b80e47e870711d2ea1c3913a5c52874be970691d8ed2e1323a5c5687cbe970791daea0c31575b8920e57d6e12a3a5c5587abe970751dae912802c1ea108120e6b73b1f730a04ab42048298dfeecce414085686080431d72bcce214085684080431d72bcce614089687080431d72b7cc229102c0b110862ae5798c329108c82080431d72bcce514089682080431d72bcce314084642048298eb15e6730a048b43048298fb153ee514088643048211108a16700a048b420482c520142de41408168608048b4028fa8c5320581022102c04a16811a740303f4420580042d162ce5df14590288b21142de1a4682124ca67108a3ee7a4e853489405108a967252340f12653e84a2659c14cd8144990ba168392745b321513e8150b48293a2999028b32014ade41408e68350f43184a2559c55b41212651584a2d59c142d87445901a1680d27454b21519641285acb49d1124894cf2114ade3a4682d24ca3a08455f7052b41a12650d84a2f58c14417e94eee485d0bc81b386306f345e0fa9a10de402c1b42081605e598cca3e9d6cb2c986a6ec46caceaf6cdbca16b9ec6fcb59821c04c8a18b9c98c8e9941c2dc9319e9cc1c979a71c56cac1b09ceaca09ba1c7f1ba7a2712a19a7b271aa18a7aa71aa19a7ba716adc48205853971fd5d2e1da3a5c4787ebeaf0c33a5c4f87ebeb70031d6ea8c38d74b8b10e37d1e1a63adc4c879beb700b1d6ea9c38fe8f0a33afc980e3faec34fe8f0933afc940e3fadc3cfe8702b1d6eadc36d74b8ad0e47278a40b02d4420180df920d8c729106c0d1108b68150b49f5320f80c4420d80a42d1014e81e0531081e0d3108a0e720a049f8008049f845074885320f8184420f83884a2c39c02c1472002c14721141de11408b68008045b42283aca29106c061108368750748c5320d80422106c0aa1e838a740b0114420d81842d1094e816003884010f3c68a939c02c17a108120e6d539a738058275210241ccab734e730a046b4304829897c19de1dc153f0d89720642d1594e8a4e42a29c8250748e93a2e390282720149de7a4e82824ca3108451738293a0c89720442d1454e8a0e42a21c8250748993a2fd90280720145de61408d68250b40f42d115ce2aba0c89720542d1554e8a2e42a25c8250748d93a2f39028171014054238293a0b89720e4291434951200412c58150e47256d15548946b108a4219294a071108425e1d1f08e39c662e244a28a486c2c80582e94002c19ab218957d3ad964930d4dd98d949d5fd9b6952d72d9df96b3043908904317393191d329395a92633c398393f34e39ac94836139d595137439fe36ce53c679da38cf18a795715a1ba78d71da1a27fa4602c176bafca8bd0e3fabc3313afc9c0e3fafc31d74b8a30e77d2e1ce3adc4587bbea70ac0e77d3e1ee3adc43877beaf00b3adc4b877beb701f1d7e51875fd2e19775f8151d7e5587fbea709c0ef7d3e1d774b8bf0e0f481481607f884010727b7c2017a740b01f442008b93d3e909b5320d817221084dc1e1fc8c329107c05221084dc1e1fc8cb29107c09221084bce12b908f5320d807221084bce12b909f5320d80b221084bce12b50805320d813221084bce12b50905320d81d221084bce12b50885320180b110842def01528cc2910ec02110842def01528c22910ec04110842def01528ca2910ec001108768450548c5320f81c4420f83c84a2704e81e0b31081600c84a208ce5df1704814c885af81e29c14158544815cf81a28c14951614814c885af81484e8a0a42a2402e7c0d94e4a4283f240ae4c2d740294e8a2057b804f241282acd49516e48943c108aa2380582ed2114e582505486b38aa22051202fe50894e5a4a814240ae4a51c81729c144542a2405eca1128cf4951714814c84b39021538292a0f890279cd54a022274565215120af990a5462a4283d4420d80e427365ce1aaa08890279e11d84a2c41408a6070904dbc96254f6e964934d3634653752767e65db56b6c8657f5bce12e420400e5de4c4444ea7e468498ef1e40c4ece3be5b0520e86e554574ed0e5f8db38af18e755e3f4354e9c71fa19e735e3f437ce801b090407eaf2a3413a3c588787e8f0501d1ea6c3afebf01b3a3c5c87dfd4e1113a3c5287e37578940e8fd6e1313afc960ebfadc3efe8f0581d1ea7c3efeaf0781d7e4f8727e8f0fb3a3c51873fd0e1493afca10e4fd6e1298922109c0c11084e817c103ccd29109c0411087e08a1e8194e81e0448840f0030845ad380582132002c1f72114b5e614088e870804df8350d4865320380e22107c1742515b4e81e03b1081e0580845d19c02c1b72002c1b72114b5e314088e860804c740286acf29108c8708044741287a965320380222101c09a128865320381c22107c1342d1739c02c1d72102c13720143dcf29101c0a11080e8350d4815320381822101c02a1a823e7ae780748148c12b7132745cf41a26094b89d39297a161205a3c4edc24911e66cad3d84a2ae9c14b5854481bcda2510cb49516b4814c8ab5d02dd38297a061205f26a9740774e81e02008459057bb047a705651774814ccaf257b7252140b8982f9b5e40b9c14758144c1fc5ab21727459d205130bf96eccd49512f4814cceffffb7052d4131205f3fbff171929ca0011080e84d0fc12670df58144c1dc44f212b94030034820385016a3b24f279b6cb2a129bb91b2f32bdbb6b2452efbdb729620070172e8222726723a25474b728c27677072de29879572302ca7ba72822ec7dfc699609cf78d33d1381f186792713e34ce64e34cb9914070aa2e3ffa4887a7e9f0741d9ea1c31febf04c1d9ea5c3b375f8131d9ea3c37375789e0ecfd7e14f7578810e2fd4e1cf7478910e2fd6e1253afcb90e2fd5e1653abc5c8757e8f04a1d5ea5c3ab75788d0eafd5e1758922105c0b1108ae837c10bccb29105c0d1108ae8150349e5320b81222105c05a1e83d4e81e0728840700584a2099c02c1a51081e0320845ef730a04974004829f43289ac829105c0411082e8650f401a74070214420f81984a2499c02c14f2102c105108a3ee41408ce830804e743289acc29109c031108ce855034855320381b2210fc0442d1544e81e04c8840701684a28f380582332002c18f21144de314084e830804a743289aceb92b3e0d120543d10c4e8aa642a27c04a1e8634e8a2643a2607e733b9393a249902898dfdccee2a46822240ae637b7b339299a008982f9cded279c148d8744c1fce6760ea740f023084598dfdccee5aca239902898afb1f338299a0d8982f91a3b9f93a299902898afb19f725234031205f335760127459f42a2603666177252340f1205b331fb1923450f40048298afc28b386b6821240ae6886811b940f001904070aa2c46659f4e36d9644353762365e757b66d658b5cf6b7e52c410e02e4d0454e4ce4744a8e96e4184fcee0e4bc530e2be560584e75e5045d8ebf8db3dc382b8cb3d238ab8cb3da386b8cb3d638ebfe5c2038b569ed2ac54b968adf11f24bbc7102c9c585f92ed477aeef1cdf85248ff7ae895d15bb227659ec92d845b10b62e7c5ce899d153b23765aec94d849b11362c7c58e891d153b227658ec90d841b10362fbc5f689edf5ff63797c97db77b97c97d377397c97dd77d97c97d577597cf790ef32fbee41df65f25d46df3de0bb0cbe4befbb74be4bebbb34be4bedbb54bebbdf77f7f92ea5efeef55d0adfdde3bbbb7d97dc7777f92e99ef6af8aebaefaaf9aeaaefaaf8aeb2ef2af9aea2ef2af8aebcefcaf9aeacefcaf82eca77a57d57ca77257d17e9bb12be2beebb08df85fbae98ef8afaae88ef0afbae90ef0afaae80eff2fb2e9feff2fa2eda776d7dd7c677ad7dd7ca77cff8ee69df3de5bb277df784ef1ef7dd63be7bd4778ff8aea5ef5af8aeb9ef9af9aea9ef9af8aeb1ef1af9aea1ef1af8aebeefeaf9ee61dfd5f55d1ddfd5f65d2ddfd54c6edf856bdf976bdfa96bdfbb6bdfcd6bdfdf6bdff16bdf036cdf156cdf276cdf396cdf4b6cdf5d6cdf6f6cdf816cdf936cdfa56cdfb76cdfc96cdfdb6cdfed6cdfff6cdf116ddf236ddf356ddf476ddf596ddf6b6ddf7d6ddf8f6ddfa16ddfb36dafe2b3d7f5d92bfdecb57ff66a407b7da0bd62d05e4368af2ab4d719da2b0fedb588f6ea447bbda2bd82d15ed368af72b4d73dda2b21edb591f66a497bfda4bda2d25e6369afbab4d761da2b33edb59af6ea4d7b3da7bdc2d35ef3699580562d681585567568958956bd68158e5605699592564d691597569569959b56dd6915a056256a95a4566d6a15a956b56a95ad56fd6a15b256456b95b6568d6b15bb56d56b95bf561d6c15c456656c3bd917c6596f9c0dc6f9d2381b8df395713ce318e36c32ced7c6f9c638df1a67b371be33cef7c6f9c1385b8cf3a371b61a679b71b61be727e3ec30ce4ee3ec32cecfc6f9c538bb8df3ab717e33ceefc6d983ffbc83dcdceeec857cdafd48b62088f05dc93b2559a29482d0b395889e887fff8f127742cfbfa24442e8d946424fc41ffee176e9f9af28c521f46c27a02722e1bf28763bf4248c02a1e7a77f989e883ffb97456e959e3f89521442cf8e7f909e88bf020add0a3d7f11a530849e9dff103d111a58e066e951a21484d0b3eb1fa027e24611f3dd0c3d3788921f42cfcf7f333d11371331cf8de8b989287921f4fcf237d21371b3117369f4dc6494dc107a76ff4df444dc4ac41c7f45cf2d44c909a1e7d7bf819e885b8d98edcfe8b9c528d921f4fc96c8f444dc4ec42c09e9b98d285921f4fc9e88f444dc6ec4ccff4dcf6d46790842cf1ece2dfcdf2151f64028dacb49d1af9028bf4128dac749d12f9028bb2114ede7a4681724cacf108a0e7052b40312652784a2839c146d8744f90942d1214e8ab642a26c83507438d1288ab8fd880f4208fa1142d011ce1a3a0c89720442d1514e8a0e42a21c8250748c93a2fd90280720141de7a4682f24ca3e08452738293a0e89720242d1494e8a8e42a21c8350742a51288ab8b38819af137447513241483ecd59412721514e412a8892a29610f10ba451274bcb287e690e10bfb480d0938e51fcd214207e6906a1273da3f8a53140fcd204424f0646f14b4380f8a511849e0718c52ff501e29706107a32328a5f1e06885fea41e8c9c4287ea90310bfd485d0f320a3f8a51640fc521b424f6646f14b0d80f8a526849e8718c52fd500e297ea107ab2308a5faa00c42f5521f4646514bf5402885f2a43e8c9c6287ea90010bf5484d0939d51fc520e207e290fa12707e5ae4fb2ec9028392014e5e4a4282b244a360845b938297a0812250b84a2dc9c14418e9c93658650948793a28c9028992014e5e5a42803240ae45e8764f938294a0789921e42517e46f14b59084169210415e0aca1fc902805201415e4a4282f244a3e0845853829ca0d8992074251614e8a7242a2e48250548493a2c2902845201415e5a4a820244a210845c518c52f5100f14b1908c9e19c15541412a518a4821014fdef0556b39ab679b653e7d8d816d1b131ed7a8f8937ce5eefaaf87dded51d2195e3bdc9c9e3bd0fc526897d203651ec7db10962ef898d177b576c9cd858b177c4de167b4b6c8cd868b15162f16223c54688bd29365cec0db1d7c586890d151b2236586c90d840b1b5626bc4568bad125b29b6426cb9d832b1a5629f8b2d115b2cb648ec33b185620bc43e159b2f364f6caed81cb14fc4668bcd129b29f6b1d80cb1e962d3c43e129b2af6bbd86ffe6d3cc2c517fed53ceb7db7c1775ffa6ea3efbef29de73be3bb4dbefbda77dff8ee5bdf6df6dd77befbde773ff86e8bef7ef4dd56df6df3dd76dffde4bb1dbedbe9bb5dbefbd977bff86eb7ef7ef5dd6fbefbdd777b921b67ff1f2b3f1e51b3ce7e88aae9c09d0789fba86a6c4c870e31edc78c8c9bda34a653fb0ed1986be7ece8ee7446d93175ecd221da3807478c8e9b5eb747c72e75da35e8dc3d3e24346e4ab5ce9dba758f7746def960e366558de9d42ab677cd98e80e6d1b76191df261f5989e4ec8e4a6dd3b7719356204e03ff0df35347214845ee104f3a00e01ca2851f23b3402fdb9c5435862cdbbf4d059773869d6fd815c610453424708e79c64770431e3febfb447d19536764069d906941a31f9a754898d6dd57b474829e31c35ce31e31c37ce09e39c34ce29e39c36ce19e39c35ce39e39c37ce05e35c34ce25e35c36ce15e35c35ce35e38618d731ae6bdc50e386193760dc64c6bdcbb8c98d7bb771ef316e0ae3de6bdc94c6bdcfb8f71b379571531b378d71d31a379d71d31b3783711f306e46e36632ee83c6cd6cdc878c9bc5b8598d9bcdb8d98d9bc3b8398d9b6bc4b8b80feb77ee191fea5effbbeb5cffbb13f2ef3e153212f08c3eaed939363aa67d277f493f6a7e1bf18d62637ab6ea1eedaff3bbc774ee34326e7aede8565d2c71f161a546c5cd6a12dd3ea65bf7e8d83a9dda46f77212fcb39be09f43af8f3a10f6afd107e226fb3d7764f2ebff1ce2fcab258e84ac1a8f001aeb7f5d583cad718fcedd63a23b751f83fa7805fc640cf1f151dcb8798c9b7ba5f6de7337b7a3c279bc2bb8b782fce711427e9ae502764a7d8eb0f75fe3cbe9044d39e5336e5ebd9cf2eae5942f71cae904a49cf242ca291f7b399da129a702c6cdaf97537ebd9c0a244e399d8194537e483915602fa7b334e554c8b805f5722aa89753a1c429a7b390722a0829a742ece5748ea69c8a18b7b05e4e85f5722a9238e5740e524e8521e55484bc9cdc5c34e554ccb845f5722aaa9753b1442927371784e7a290722ac678cc07d1743947210f2b1cb9bb853e30418cee3f5bb76e44d2d66d027a8513cc832ace7860e2e7571c7e60128fd97282ccde129465257db70464632e59434a9506e8e14542b41e0d994fbcdd4868032f99d4c013d02b9c601e5429ca062ef995e23cf1861306694d1031bc03b97dcb2d4dbdb22c0d6d4c51498d2901bdc209e64195a16c4c925f99a05e5996a52cab323230cccab27130af2ccb4156968da95796e5a00dbc7c52034f40af7082795015281bb8e45781746559817165991af2d9741ed2de2a52af2c2b421b53a5a4c694805ee104f3a02a533626c9af7250af2cab5096556519186665d93498579655212bcba6d42bcbaad0065e2da98127a05738c13ca8ea940d5cf2ab4ebab2ac4e3def8a42e75d8da47997805ee104f3a06a52ce3bc9af66502f9c6a5196554d191866e1d43c98174eb5210ba7e6d40dbc36b481d7496ae009e8154e300faa2e650397fcea922e9cea52cfbbfcd079f770d2bc4b40af70827950f528e79de4572fa8174ef529cbaa9e0c0cb3706a19cc0ba7069085534bea06de00dac01b2635f004f40a279807d588b2814b7e8d48174e8da8e75d41e8bc6b9c34ef12d02b9c601e5413ca7927f93509ea855353cab26a2203c32c9c1e0de6855333c8c2e951ea06de0cdac09b2735f004f40a279807d582b2814b7e2d48174e2da8e75d61e8bc6b9934ef12d02b9c601ed42394f34ef27b24a8174e8f5296d5233230ccc2e9f1605e383d0659383d4eddc01f8336f0c7931a78027a8513cc837a82b2814b7e4f902e9c1084fdefa529d31a45b78d8eed16dd69d4a878e31cf36fac77735b9fd7bb1a227f7bd2b84fa97f6e474884fcc993f6aefb53d69fb67f3ebff505ad2f6cfffd79eb2f587fd1fa4bd65fb6fe8af557adbf66ff5488f58ef5aef5a1d687591fb03e99f577599fdcfabbadbfc7fa14d6df6b7d4aebefb3fe7eeb53599fdafa34d6a7b53e9df5e9adcf60fd03d667b43e93f50f5a9fd9fa87accf627d56ebb3599fddfa1cd6e7bccee6d3c67de6864fe1a8fd134f5afff4f53fd7cab8ad7957056dc0bd8a2ab9b6c19c5c743027d72e98936b1fccc93d1bccc9c5047372cf057372cf0773721d8239b98ec19c5ca7604eae733027d7259893eb1accc9c5067372dd8239b9ee80e4126bff320374f7b247d2eee51fc81546305b713d09f72e25bb9ecc6f740294367640e9d8069406f746a7778dfb82717b19b7b771fb18f745e3be64dc978dfb8a715f356e5fe3c6fd13af535a1cdda96b8fe81ed18d7ab4ee10d3e6df2f54f2a13fbe542905f54b95fcd97fa78f3a716f72ef4d7393fb6bc6eda7dfe4de4fbfc9fdb5c4b9c9bd3784e77e909bdc5f637f31401f9a721a60dcfe7a39f5d7cb6940e294531f08cffd21e53480bd9c5ea129a741c61da897d340bd9c06254e39bd02e17920a49c06b197d3ab34e534c4b883f5721aac97d390c429a757213c0f8694d310f672ea4b534ec38c3b542fa7a17a390d4b9c72ea0be17928a49c8631caf53240687e0112e575ea1b255f876e77bd91b4dd95805ee104f3a086538af524bfe19c6a6bb72724ca9b9465355c0686515b3f49a9b6063dbc1110b5f593d46aeb11d0063e32a98127a05738c13ca878ca062ef9c593aaade319ef2a4f07694cbd20514651af2c47411bd3e8a4c694805ee104f3a0c6503626c96f4c50af2cdfa22cab313230cccaf2e9605e59be0d59593e4dbdb27c1bdac0df496ae009e8154e300f6a2c650397fcc692ae2cc732ae2cd3401a531c24ca38ea95e53868637a37a93125a05738c13ca8f1948d49f21b1fd42bcbf728cb6abc0c0cb3b26c15cc2bcb099095652bea95e50468037f3fa98127a05738c13ca889940d5cf29b48bab29c483def0642e7dd0749f32e01bdc209e6414da29c7792dfa4a05e387d4859569364609885539b605e384d862c9cda5037f0c9d0063e25a98127a05738c13ca8a9940d5cf29b4aba709a4a3def0643e7dd4749f32e01bdc209e6414da39c7792dfb4a05e384da72cab693230ccc2293a98174e33200ba768ea063e03dac03f4e6ae009e8154e300f6a26650397fc66922e9c6652cfbba1d079372b69de25a05738c13ca8d994f34ef29b1dd40ba74f28cb6ab60c0cb3706a1fcc0ba7399085537bea063e07dac0e72635f004f40a279807358fb2814b7ef348174ef312ff3277b797bd40bc9ff5fdaf5f233edfb89ffe6f3a77de8c162406cb773eac859cc3fa8c73588b3887b59873584b3887f539e7b096720e6b19e7b096730e6b05e7b056720e6b15e7b056730e6b0de7b0d6720e6b1de7b0bee01cd67ace616de01cd6979cc3dac839acaf3887e5710ecb700e6b13e7b0bee61cd6379cc3fa9673589b3987f51de7b0bee71cd60f9cc3dac239ac1f3987b5957358db3887b59d73583f710e6b07e7b076720e6b17e7b07ee61cd62f8061e92ff02d2147432fda73a297ac7fd9fa81d60fb67ea8f571d62fb07ea1f59f59bfc8fac5d62fb1fe73eb975abfccfae5d6afb07ea5f5abac5f6dfd1aebd75abfcefa2fac5f6ffd06ebbfb47ea3f55f59ef596facdf64fdd7d67f63fdb7d66fb6fe3bebbfb7fe07ebb758ffa3f55baddf66fd76eb7fb27e87f53baddf65fdcfd6ff72fd346db7717fbde129dc0bf64fccb77ef7f53ff79b717fe75585ec213cab4e6e9c23184d480c788e63b273a331d93d97188a973b2fa9bd10ad4a0c240a2945fb829922a6f6b69fb0bda584b5b78e84ed2da571db61b2ebc439770f40665d474814528a0e0633454ceded10617bf3fac3fa5b57c2fe26e9b9dd31e9c572cedec39079d715128594a223c14c1153833b4ad8e052c0fa5b0fc2fe96c2b8b198ec7a72cedd639059d703128594a2e3c14c11537b3b41d8de52c1da5b6fc2f696cab83198ecfa70cedd9390590779652e2b45a7829922a6f6769ab0bddd056b6f2f13b6b7bb8cdb0d93dd2b9c73f70c64d6bd0c89424ad1d960a688a9bd9d236c6f01587b8b236c6f01e376c264d78f73ee9e87ccba384814528a2e0433454ceded22617b7361ed6d00617b738ddb0693dd40ceb97b0932eb0640a2905274399829626a6f5708db5b18acbd0d216c6f61c67d1693dd50ceb97b1532eb8640a29052742d9829226a6fa12184eded6e587b7b83b0bddd6ddc8e98ec8653cedd500732ebde804421a5c80d668a98da5b28617bbb0fd6de4612b6b7fb8cfb3c26bb78ceb91b069975901b0359290a0433454ced2d19617b7360ed6d0c617b738cdb0593dd5b9c73f72ec8ac1b0389424a51f260a688a9bddd0d6e6f54c9dd4379fd732be37680f4b7d01484dd1b99dfbdc13cf3521216e7fdb085c558c2d2bcdfb86d31d98de3fcd4bc0ff2793716128594a2fb839922a6f6968ab0bddd036b6fef11b6b77b8cdb1993dd04ceb99b1a32ebde834421a5284d3053c4d4ded212b6b77b61eded03c2f676af719fc364378973eea683ccba0f205148294a1fcc1431b5b70c84ed2d19acbd4d216c6fc98cdb1e93dd54ceb9fb0064d64d814421a528633053c4d4de3211b6b750587b9b4ed8de428ddb1593dd0cceb9fb2064d64d874421a52873105384393ae929279f9859328b31bfd06472f88dc96f3667893f0429ce599028b3494bdcbd8c2981b994f95d34ee254c7ef3384b3c0ba438e742a2cc63ede2993125b080b28b6792d50e26bf859c259e15529c0b205116b276f16b9812584c99df15e35ec5e4b784b3c4b3418a733124ca12d612bf8029816594f99d33ee794c7ecb394b3c3ba4389741a22c675da864c494c02aca854a06d975c6e4b79ab3c473408a731524ca6ad62e0eda555d4799df21e31ec6e4f7056789e78414e73a4814cef76c87e6e21c566ece61e5e11c565ece61e5e31c567ece6115e01c5641ce6115e21c5661ce6115e11c5651ce6115e31c5638e7b0223887559cf55bf3bd9825f79794df9aef31a12930f96de4fc4a5102f265e04b48948d9c332f927358253987558ab24ffd6642efc6e4579a93f628ce6195e11c5659ce6195e31c5679ce6155e01c5645ce6155e21c5665ce6155e11c5655d67385b39845b2a1ccefb471cf60f2dbc4f925a01a64f96e205136b196f83e4c097c4b99df1ee3eec5e4b799b3c4ab438af35b4894cdac5b392ea6047ea0dcca0931a10e26bf2d9c255e03529c3f40a26c612df1349812d84659e2a94c686a4c7edb394bbc26a438b741a26c675da81cc794c04ecafc8e1af71826bf5d9c255e0b529c3b215176b176f1f49812d84dd9c5d39ad07498fc7ee52cf1da90e2dc0d89f22b6b173f8829813d94f9ed37ee014c7e7b394bbc0ea438f740a2ec65ede2014c091ca0ece2a126340c93df41ce12af0b29ce03902807594bfc7e4c091ca12cf19426f43e4c7e47394bfc6148711e814439caba50398529811394f99d30ee494c7e27394bbc1ea4384f40a29c4c8c6bb6ee7858f61e933b27ba3e67725920c935e04c2e2b24b9869cc9658324d78833b9ec90e41a73269703925c13cee47242926bca995c2e4872cd3893cb0d49ae3967727920c9b5e04c2e2f24b9969cc9e58324f7086772f921c93dca995c0148728f7126571092dce39cc9158224f70467728521c93dc9995c1148724f7126571492dcd39cc9158324f70c6772e190e45a7126170149ae356772c521c9b5e14cae0424b9b69cc94542928be64cae2424b9769cc9958224d79e33b9d290e49ee54c2e0a925c0c67726520c93dc7995c594872cf7326570e925c07cee4ca4392ebc8995c0548729d3893ab0849ae3367729520c975e14cae3224b9ae9cc955812417cb995c554872dd3893ab0649ae3b6772d521c9f5e04cae0624b99e9cc9d58424f7026772b520c9f5e24cae3624b9de9cc9d58124d78733b9ba90e45ee44cee6148722f7126570f92dccb779edc8e90c71d37342c90ecaee477df93e2de94f7dd9f2a759ab4e9d267782063a607333f94256bb6ec3972e6ca9d276fbefc050a162a5ca468b1f088e225224b962a1d55a66cb9f2152a56aa5ca56ab5ea356ad6aa5da7eec3f5ea3768d8a87193a6cd9ab768f9c8a38f3dbe234472ad6f421b98d08626b491096d6c429b98d0a626b499096d6e425b98d09626f41139dd973370392996f354397594b33939c192731e390d913303d95997fd67d9a595bd4cd9f1937d31d93d923d16d98990efebf2ad56befbc93724f91e21ab6d5993caca4dd637b20a90cf4af94491be2bdd49e6b054bad483b0f67f", "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" } ] diff --git a/yarn-project/noir-contracts/src/examples/test_contract.json b/yarn-project/noir-contracts/src/examples/test_contract.json index 323e2edfb8eb..40ab940532b9 100644 --- a/yarn-project/noir-contracts/src/examples/test_contract.json +++ b/yarn-project/noir-contracts/src/examples/test_contract.json @@ -8,6 +8,56 @@ "returnTypes": [], "bytecode": "cdcfc74e1b011485619c00e985de7bef339e197b86ea826daa0183e9cd760605c549a48848d9fa0dc0c92b6493555e078987c9227b363e8bff6e8f74f57fbf0a0f55d9d2df583157f814fbfa23f9fd4b219e2b164bbf33d1742a7157ae0e3c32d63c36d6064a7fa2dfae6f3e7ef66fae0b3f6fefcaf711cb08d9b61f0efaa665e68ca097771dc376f221d7744dc7753e045dcbf25ddb0d7b792f6c78a66df9e695e35957c6ffabbb8f18159e3eaa9e18d5408c6a24463511a39a89512dc4a85662541b31aa9d18d5418cea24467511a3ba89513dc4a85e62541f31aa9f1835408c1a24460d11a386895123c4a85162d418316a9c1835418c9a24464d11a3a6895133c428831865aaa3cae58a3f9a01012c48843d11c02c22eca900661361d502984384d508602122ac56000b13617502984b84d50b601e11d62080cd12618d02d81c11d62480cd1361cd02d80211d622802d1261ad02d81211d626804588b076012c4a847508603122ac53008b13615d02d83211d62d802588b01e012c4984f50a602922ac4f005b21c2fa05b055226c40005b23c20605b075226c4800db20c28605b04d226c44004b1361a302d816113626806d1361e302d80e113621806588b049016c97089b12c0f688b069012c4b84cd0860fb449821801d1061a6007648843d13c08e88b0e702d83111f642003b21c25e0a60a744d82b01ec8c087b2d809d13616f04b00b22ecad00764984bd13c07244d87b012c5f39ecf6a1ca0c5ab6130abbdeecdcfcc2e252241a8b2f2792a995d5b5f58dcdf4d6f64e66772fbb7f7078747c727a767e7199cbff03", "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, + { + "name": "createL2ToL1MessagePublic", + "functionType": "open", + "parameters": [ + { + "name": "amount", + "type": { + "kind": "field" + }, + "visibility": "private" + }, + { + "name": "secretHash", + "type": { + "kind": "field" + }, + "visibility": "private" + } + ], + "returnTypes": [null], + "bytecode": "b590414ec24018855b685de842d18b8027b0255431450d708149e7b79938ced499d6c0726ed099c2ce1da56a0c898917f0005cc0cb10c3c29d61537dbb972f79efe5cd4ee6eadda728baf3f924c858d44594aae5d0bb3aef69e3d83ba0bb0beefd065f6e008390c00a630ed71b73b4de58a675ac9e7d412825f15cab6a44584ca1c8b5f93a6bd753a7553ba29de74f6a31e08fc6b6d4b2cb994c8da5ebc7aab7800b2031dbfe527c4402500ae1e998879d01488962d0eaf50250e20981a6a6616bb51a424c640aa2cf304cec9f35ce5fac59f98421310d08507c9dccdc858771c35165c811364df75fbbaade4386a86c3aaabaccee93fead71f7cbb140892ab75e1f94a394279f79fe0d", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, + { + "name": "createNullifierPublic", + "functionType": "open", + "parameters": [ + { + "name": "amount", + "type": { + "kind": "field" + }, + "visibility": "private" + }, + { + "name": "secretHash", + "type": { + "kind": "field" + }, + "visibility": "private" + } + ], + "returnTypes": [ + { + "kind": "field" + } + ], + "bytecode": "b5924d4ec2501485415a073a50c485b4b48576664b40318a06dcc0a3bdad2f96b6beb606866f07f4818e9c51f02f4497e002d8809b214ad4996102ded9cd49cef9727286fb77f4cd70917965f8dd5aec9915e4ba74dcd41b87d58471d92522bf4cdcfc4b7c3c070b4808de80b19dd99cedcee61996dfa30f06c1ae8b9ddb844e5ad8735c18f413f67120ac76627e650ba1dfbfa7a353ff866533745cf1bd30629964755bfa52f30960c75bf432783509a0081af15709360692d0a72340814e08eab18d6c42a74d70701801a97b1674b3bf24dc3a48a606f610e9d530b8d65930e447ba656d70343df191c572fcbf664daad73172c31c4727c77127a8db8cdf4a2f080a68baf893edb415f9c13b7dd6098e2e3b1061f37b199250926528174194442414b5b6aa08b2d22ea9a22a2aaa62155549025556cb5a5b2b0b9a284b20da8a26d93f2485352c23297c02", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" } ] } diff --git a/yarn-project/noir-contracts/src/libs/custom-notes/Nargo.toml b/yarn-project/noir-contracts/src/libs/custom-notes/Nargo.toml new file mode 100644 index 000000000000..182a750999fd --- /dev/null +++ b/yarn-project/noir-contracts/src/libs/custom-notes/Nargo.toml @@ -0,0 +1,6 @@ +[package] +authors = ["aztec-labs"] +compiler_version = "0.7.1" + +[dependencies] +aztec = { path = "../../libs/noir-aztec" } \ No newline at end of file diff --git a/yarn-project/noir-contracts/src/libs/custom-notes/src/lib.nr b/yarn-project/noir-contracts/src/libs/custom-notes/src/lib.nr new file mode 100644 index 000000000000..b5887c6f86c6 --- /dev/null +++ b/yarn-project/noir-contracts/src/libs/custom-notes/src/lib.nr @@ -0,0 +1 @@ +mod transparent_note; \ No newline at end of file diff --git a/yarn-project/noir-contracts/src/contracts/public_private_contract/src/notes/transparent_note.nr b/yarn-project/noir-contracts/src/libs/custom-notes/src/transparent_note.nr similarity index 92% rename from yarn-project/noir-contracts/src/contracts/public_private_contract/src/notes/transparent_note.nr rename to yarn-project/noir-contracts/src/libs/custom-notes/src/transparent_note.nr index 10bb4364eb7b..8d665ea2748f 100644 --- a/yarn-project/noir-contracts/src/contracts/public_private_contract/src/notes/transparent_note.nr +++ b/yarn-project/noir-contracts/src/libs/custom-notes/src/transparent_note.nr @@ -1,9 +1,11 @@ use dep::std::hash::pedersen; use dep::aztec::context::Context; use dep::aztec::messaging::get_commitment_getter_data::make_commitment_getter_data; -use dep::aztec::oracle::create_commitment::create_commitment; -use dep::aztec::oracle::create_l2_to_l1_message::create_l2_to_l1_message; -use dep::aztec::oracle::get_commitment::get_commitment; +use dep::aztec::oracle::{ + create_commitment::create_commitment, + create_l2_to_l1_message::create_l2_to_l1_message, + get_commitment::get_commitment +}; // Transparent note represents a note that is created in the clear (public execution), // but can only be spent by those that know the preimage of the "secretHash" diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/Nargo.toml b/yarn-project/noir-contracts/src/libs/noir-aztec/Nargo.toml similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/Nargo.toml rename to yarn-project/noir-contracts/src/libs/noir-aztec/Nargo.toml diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/abi.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/abi.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/abi.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/abi.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/context.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/context.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/context.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/context.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/entrypoint.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/entrypoint.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/entrypoint.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/entrypoint.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/generators.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/generators.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/generators.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/generators.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/lib.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/lib.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/lib.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/lib.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/log.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/log.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/log.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/log.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/messaging.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/messaging.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/messaging.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/messaging.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/messaging/get_commitment_getter_data.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/messaging/get_commitment_getter_data.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/messaging/get_commitment_getter_data.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/messaging/get_commitment_getter_data.nr diff --git a/yarn-project/noir-contracts/src/libs/noir-aztec/src/messaging/l1_to_l2_message.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/messaging/l1_to_l2_message.nr new file mode 100644 index 000000000000..ed55922ad8ee --- /dev/null +++ b/yarn-project/noir-contracts/src/libs/noir-aztec/src/messaging/l1_to_l2_message.nr @@ -0,0 +1,109 @@ +use crate::generators; +use crate::types::point::Point; +use crate::messaging::l1_to_l2_message_getter_data::L1ToL2MessageGetterData; +use crate::messaging::l1_to_l2_message_getter_data::make_l1_to_l2_message_getter_data; + + +global L1_TO_L2_MESSAGE_LEN = 8; + +global L1_TO_L2_MESSAGE_ORACLE_CALL_LENGTH = 18; // 8 fields + 8 deep hash path + 1 root + 1 index + +struct L1ToL2Message { + sender: Field, + chainId: Field, + recipient: Field, + version: Field, + content: Field, + secret: Field, + secret_hash: Field, + deadline: u32, + fee: u64, + tree_index: Field +} + +impl L1ToL2Message { + fn dummy() -> L1ToL2Message { + L1ToL2Message { + sender: 0, + chainId: 0, + recipient: 0, + version: 0, + content: 0, + secret: 0, + secret_hash: 0, + deadline: 0 as u32, + fee: 0 as u64, + tree_index: 0 + } + } + + fn deserialize( + fields: [Field; L1_TO_L2_MESSAGE_LEN], + secret: Field, + tree_index: Field + ) -> L1ToL2Message { + + L1ToL2Message { + sender: fields[0], + chainId: fields[1], + recipient: fields[2], + version: fields[3], + content: fields[4], + secret: secret, + secret_hash: fields[5], + deadline: fields[6] as u32, + fee: fields[7] as u64, + tree_index: tree_index + } + } + + fn validate_message_secret(self: Self) { + let recomputed_hash = dep::std::hash::pedersen([generators::MessageSecret, self.secret])[0]; + assert(self.secret_hash == recomputed_hash); + } + + fn message_hash(self: Self) -> Field { + let mut hash_bytes: [u8; 256] = [0; 256]; + let sender_bytes = self.sender.to_be_bytes(32); + let chainId_bytes = self.chainId.to_be_bytes(32); + let recipient_bytes = self.recipient.to_be_bytes(32); + let version_bytes = self.version.to_be_bytes(32); + let content_bytes = self.content.to_be_bytes(32); + let secret_hash_bytes = self.secret_hash.to_be_bytes(32); + let deadline_bytes = (self.deadline as Field).to_be_bytes(32); + let fee_bytes = (self.fee as Field).to_be_bytes(32); + + for i in 0..32 { + hash_bytes[i] = sender_bytes[i]; + hash_bytes[i + 32] = chainId_bytes[i]; + hash_bytes[i + 64] = recipient_bytes[i]; + hash_bytes[i + 96] = version_bytes[i]; + hash_bytes[i + 128] = content_bytes[i]; + hash_bytes[i + 160] = secret_hash_bytes[i]; + hash_bytes[i + 192] = deadline_bytes[i]; + hash_bytes[i + 224] = fee_bytes[i]; + } + + let message_sha256 = dep::std::hash::sha256(hash_bytes); + + // // Convert the message_sha256 to a field element + let mut v = 1; + let mut high = 0 as Field; + let mut low = 0 as Field; + + for i in 0..16 { + high = high + (message_sha256[15 - i] as Field) * v; + low = low + (message_sha256[16 + 15 - i] as Field) * v; + v = v * 256; + } + + let message_hash = low + high * v; + message_hash + } + + // The nullifier of a l1 to l2 message is the hash of the message salted with the secret and tree index + fn compute_nullifier(self: Self) -> Field { + let message_hash = self.message_hash(); + dep::std::hash::pedersen([generators::Nullifier, message_hash, self.secret, self.tree_index])[0] + } +} diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/messaging/l1_to_l2_message_getter_data.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/messaging/l1_to_l2_message_getter_data.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/messaging/l1_to_l2_message_getter_data.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/messaging/l1_to_l2_message_getter_data.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/note.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/note.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/note.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/note.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/note/lifecycle.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/note/lifecycle.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/note/lifecycle.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/note/lifecycle.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/note/note_getter.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/note/note_getter.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/note/note_getter.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/note/note_getter.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/note/note_getter_options.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/note/note_getter_options.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/note/note_getter_options.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/note/note_getter_options.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/note/note_hash.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/note/note_hash.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/note/note_hash.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/note/note_hash.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/note/note_interface.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/note/note_interface.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/note/note_interface.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/note/note_interface.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/oracle.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/oracle.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/oracle.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/oracle.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/oracle/arguments.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/oracle/arguments.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/oracle/arguments.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/oracle/arguments.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/oracle/call_private_function.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/oracle/call_private_function.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/oracle/call_private_function.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/oracle/call_private_function.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/oracle/create_commitment.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/oracle/create_commitment.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/oracle/create_commitment.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/oracle/create_commitment.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/oracle/create_l2_to_l1_message.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/oracle/create_l2_to_l1_message.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/oracle/create_l2_to_l1_message.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/oracle/create_l2_to_l1_message.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/oracle/create_nullifier.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/oracle/create_nullifier.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/oracle/create_nullifier.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/oracle/create_nullifier.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/oracle/debug_log.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/oracle/debug_log.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/oracle/debug_log.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/oracle/debug_log.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/oracle/enqueue_public_function_call.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/oracle/enqueue_public_function_call.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/oracle/enqueue_public_function_call.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/oracle/enqueue_public_function_call.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/oracle/get_commitment.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/oracle/get_commitment.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/oracle/get_commitment.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/oracle/get_commitment.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/oracle/get_l1_to_l2_message.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/oracle/get_l1_to_l2_message.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/oracle/get_l1_to_l2_message.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/oracle/get_l1_to_l2_message.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/oracle/get_secret_key.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/oracle/get_secret_key.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/oracle/get_secret_key.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/oracle/get_secret_key.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/oracle/logs.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/oracle/logs.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/oracle/logs.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/oracle/logs.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/oracle/notes.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/oracle/notes.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/oracle/notes.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/oracle/notes.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/oracle/public_call.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/oracle/public_call.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/oracle/public_call.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/oracle/public_call.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/oracle/rand.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/oracle/rand.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/oracle/rand.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/oracle/rand.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/oracle/storage.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/oracle/storage.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/oracle/storage.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/oracle/storage.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/private_call_stack_item.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/private_call_stack_item.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/private_call_stack_item.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/private_call_stack_item.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/public_call_stack_item.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/public_call_stack_item.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/public_call_stack_item.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/public_call_stack_item.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/state_vars.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/state_vars.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/state_vars.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/state_vars.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/state_vars/immutable_singleton.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/state_vars/immutable_singleton.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/state_vars/immutable_singleton.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/state_vars/immutable_singleton.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/state_vars/map.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/state_vars/map.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/state_vars/map.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/state_vars/map.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/state_vars/public_state.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/state_vars/public_state.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/state_vars/public_state.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/state_vars/public_state.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/state_vars/public_state_value.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/state_vars/public_state_value.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/state_vars/public_state_value.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/state_vars/public_state_value.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/state_vars/public_state_value/field_value.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/state_vars/public_state_value/field_value.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/state_vars/public_state_value/field_value.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/state_vars/public_state_value/field_value.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/state_vars/set.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/state_vars/set.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/state_vars/set.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/state_vars/set.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/state_vars/singleton.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/state_vars/singleton.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/state_vars/singleton.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/state_vars/singleton.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/types.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/types.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/types.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/types.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/types/point.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/types/point.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/types/point.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/types/point.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/types/vec.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/types/vec.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/types/vec.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/types/vec.nr diff --git a/yarn-project/noir-contracts/src/contracts/noir-aztec/src/utils.nr b/yarn-project/noir-contracts/src/libs/noir-aztec/src/utils.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/noir-aztec/src/utils.nr rename to yarn-project/noir-contracts/src/libs/noir-aztec/src/utils.nr diff --git a/yarn-project/noir-contracts/src/libs/token-utils/Nargo.toml b/yarn-project/noir-contracts/src/libs/token-utils/Nargo.toml new file mode 100644 index 000000000000..182a750999fd --- /dev/null +++ b/yarn-project/noir-contracts/src/libs/token-utils/Nargo.toml @@ -0,0 +1,6 @@ +[package] +authors = ["aztec-labs"] +compiler_version = "0.7.1" + +[dependencies] +aztec = { path = "../../libs/noir-aztec" } \ No newline at end of file diff --git a/yarn-project/noir-contracts/src/contracts/non_native_token_contract/src/balance_utils.nr b/yarn-project/noir-contracts/src/libs/token-utils/src/balance_utils.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/non_native_token_contract/src/balance_utils.nr rename to yarn-project/noir-contracts/src/libs/token-utils/src/balance_utils.nr diff --git a/yarn-project/noir-contracts/src/contracts/non_native_token_contract/src/generators.nr b/yarn-project/noir-contracts/src/libs/token-utils/src/generators.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/non_native_token_contract/src/generators.nr rename to yarn-project/noir-contracts/src/libs/token-utils/src/generators.nr diff --git a/yarn-project/noir-contracts/src/libs/token-utils/src/lib.nr b/yarn-project/noir-contracts/src/libs/token-utils/src/lib.nr new file mode 100644 index 000000000000..7401d476430a --- /dev/null +++ b/yarn-project/noir-contracts/src/libs/token-utils/src/lib.nr @@ -0,0 +1,3 @@ +mod balance_utils; +mod value_note; +mod generators; \ No newline at end of file diff --git a/yarn-project/noir-contracts/src/contracts/non_native_token_contract/src/value_note.nr b/yarn-project/noir-contracts/src/libs/token-utils/src/value_note.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/non_native_token_contract/src/value_note.nr rename to yarn-project/noir-contracts/src/libs/token-utils/src/value_note.nr diff --git a/yarn-project/noir-contracts/src/contracts/non_native_token_contract/src/value_note/filter.nr b/yarn-project/noir-contracts/src/libs/token-utils/src/value_note/filter.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/non_native_token_contract/src/value_note/filter.nr rename to yarn-project/noir-contracts/src/libs/token-utils/src/value_note/filter.nr diff --git a/yarn-project/noir-contracts/src/contracts/non_native_token_contract/src/value_note/value_note.nr b/yarn-project/noir-contracts/src/libs/token-utils/src/value_note/value_note.nr similarity index 100% rename from yarn-project/noir-contracts/src/contracts/non_native_token_contract/src/value_note/value_note.nr rename to yarn-project/noir-contracts/src/libs/token-utils/src/value_note/value_note.nr diff --git a/yarn-project/noir-contracts/src/scripts/compile.sh b/yarn-project/noir-contracts/src/scripts/compile.sh index 0f5236f9a5af..c28ec7aa5caf 100755 --- a/yarn-project/noir-contracts/src/scripts/compile.sh +++ b/yarn-project/noir-contracts/src/scripts/compile.sh @@ -16,5 +16,9 @@ for CONTRACT_NAME in "$@"; do cd $ROOT echo "Copying output for $CONTRACT_NAME" NODE_OPTIONS=--no-warnings yarn ts-node --esm src/scripts/copy_output.ts $CONTRACT_NAME + + echo "Formatting" + yarn run -T prettier -w ./src/examples/$CONTRACT_FOLDER.json echo -e "Done\n" + done \ No newline at end of file